<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Drew DeVault&#39;s blog</title>
    <link>https://drewdevault.com/index.html</link>
    <description>Recent content on Drew DeVault&#39;s blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sat, 28 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://drewdevault.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>tar: a slop-free alternative to rsync</title>
      <link>https://drewdevault.com/2026/03/28/2026-03-28-rsync-without-rsync.html</link>
      <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2026/03/28/2026-03-28-rsync-without-rsync.html</guid>
      <description>&lt;p&gt;So apparently &lt;a href=&#34;https://codeberg.org/small-hack/open-slopware&#34;&gt;rsync is slop&lt;/a&gt; now. When I heard, I wanted to drop a quick&#xA;note on my blog to give an alternative: tar. It doesn&amp;rsquo;t do everything that rsync&#xA;does, in particular identifying and skipping up-to-date files, but tar + ssh can&#xA;definitely accomodate the use case of &amp;ldquo;transmit all of these files over an SSH&#xA;connection to another host&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Consider the following:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tar -cz public | ssh example.org tar -C /var/www -xz&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will transfer the contents of &lt;code&gt;./public/&lt;/code&gt; to&#xA;&lt;code&gt;example.org:/var/www/public/&lt;/code&gt;, preserving file ownership and permissions and so&#xA;on, with gzip compression. This is roughly the equivalent of:&lt;/p&gt;</description>
    </item>
    <item>
      <title>A eulogy for Vim</title>
      <link>https://drewdevault.com/2026/03/25/2026-03-25-Forking-vim.html</link>
      <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2026/03/25/2026-03-25-Forking-vim.html</guid>
      <description>&lt;p&gt;Vim is important to me. I&amp;rsquo;m using it to write the words you&amp;rsquo;re reading right&#xA;now. In fact, almost every word I have ever committed to posterity, through this&#xA;blog, in my code, all of the docs I&amp;rsquo;ve written, emails I&amp;rsquo;ve sent, and more,&#xA;almost all of it has passed through Vim.&lt;/p&gt;&#xA;&lt;p&gt;My relationship with the software is intimate, almost as if it were an extra&#xA;limb. I don&amp;rsquo;t think about what I&amp;rsquo;m doing when I use it. All of Vim&amp;rsquo;s modes and&#xA;keybindings are deeply ingrained in my muscle memory. Using it just feels like&#xA;my thoughts flowing from my head, into my fingers, into a Vim-shaped extension&#xA;of my body, and out into the world. The unique and profound nature of my&#xA;relationship with this software is not lost on me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The cults of TDD and GenAI</title>
      <link>https://drewdevault.com/2026/01/29/2026-01-29-Cult-of-TDD-and-LLMs.html</link>
      <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2026/01/29/2026-01-29-Cult-of-TDD-and-LLMs.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve gotten a lot of flack throughout my career over my disdain towards&#xA;test-driven development (TDD). I have met a lot of people who swear by it! And,&#xA;I have also met a lot of people who insisted that I adopt it, too, often with&#xA;the implied threat of appealing to my boss if appealing to me didn&amp;rsquo;t work.&lt;/p&gt;&#xA;&lt;p&gt;The basic premise of TDD, for those unaware, is that one &lt;em&gt;first&lt;/em&gt; writes a unit&#xA;test that verifies the expected behavior for some code they want to write,&#xA;observes the new test fail, and &lt;em&gt;then&lt;/em&gt; one writes the implementation, iterating&#xA;on it until the test passes. The advantage of this approach is, first, to ensure&#xA;that your codebase is adequately covered by testing, and, second, to provide you&#xA;a rapid feedback loop to assist in your work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redesigning my microkernel from the ground up</title>
      <link>https://drewdevault.com/2026/01/12/2026-01-12-Hermes-from-the-ground-up.html</link>
      <pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2026/01/12/2026-01-12-Hermes-from-the-ground-up.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/2022/06/13/helios.html&#34;&gt;As you may recall&lt;/a&gt;, circa 2022-2023 I was working on a&#xA;microkernel written in Hare named Helios. Helios was largely inspired by and&#xA;modelled after the design of &lt;a href=&#34;https://sel4.systems/&#34;&gt;seL4&lt;/a&gt; and was my first&#xA;major foray into modern OS development that was serious enough to get to a&#xA;somewhat useful state of functionality, with drives for some real hardware,&#xA;filesystems, and an environment for running user programs of a reasonable level&#xA;of sophistication.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenAI employees… are you okay?</title>
      <link>https://drewdevault.com/2025/11/08/2025-11-08-OpenAI-employees-are-you-okay.html</link>
      <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/11/08/2025-11-08-OpenAI-employees-are-you-okay.html</guid>
      <description>&lt;p&gt;You might have seen &lt;a href=&#34;https://edition.cnn.com/2025/11/06/us/openai-chatgpt-suicide-lawsuit-invs-vis&#34;&gt;an article&lt;/a&gt; making the rounds this week, about a young&#xA;man who ended his life after ChatGPT encouraged him to do so. The chat logs are&#xA;really upsetting.&lt;/p&gt;&#xA;&lt;p&gt;Someone two degrees removed from me took their life a few weeks ago. A close&#xA;friend related the story to me, about how this person had approached their&#xA;neighbor one evening to catch up, make small talk, and casually discussed their&#xA;suicidal ideation at some length. At the end of the conversation, they asked to&#xA;borrow a rope, and their neighbor agreed without giving the request any critical&#xA;thought. The neighbor found them the next morning.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s up with FUTO?</title>
      <link>https://drewdevault.com/2025/10/22/2025-10-22-Whats-up-with-FUTO.html</link>
      <pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/10/22/2025-10-22-Whats-up-with-FUTO.html</guid>
      <description>&lt;p&gt;Some time ago, I noticed some new organization called &lt;a href=&#34;https://futo.org/&#34;&gt;FUTO&lt;/a&gt; popping up here and&#xA;there. I&amp;rsquo;m always interested in seeing new organizations that fund open source&#xA;popping up, and seeing as they claim several notable projects on their roster, I&#xA;explored their website with interest and gratitude. I was first confused, and&#xA;then annoyed by what I found. Confused, because their website is littered with&#xA;&lt;a href=&#34;https://futo.org/about/what-is-futo/&#34;&gt;bizzare manifestos&lt;/a&gt;,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and ultimately annoyed because they&#xA;were playing fast and loose with the term &amp;ldquo;open source&amp;rdquo;, using it to describe&#xA;commercial source-available software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare bankrolls fascists</title>
      <link>https://drewdevault.com/2025/09/24/2025-09-24-Cloudflare-and-fascists.html</link>
      <pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/09/24/2025-09-24-Cloudflare-and-fascists.html</guid>
      <description>&lt;p&gt;US politics has been pretty fascist lately. The state is filling up&#xA;concentration camps, engaging in mass state violence against people on the basis&#xA;of racialized traits, deporting them to random countries without any respect for&#xA;habeas corpus, exerting state pressure on the free press to censor speech&#xA;critical of the current administration, and Trump is openly floating the idea of&#xA;an unconstitutional third term.&lt;/p&gt;&#xA;&lt;p&gt;Fascism is clearly on the rise, and they&amp;rsquo;re winning more and more power.&#xA;None of this is far removed from us in the FOSS community &amp;ndash; there are a number&#xA;of fascists working in FOSS, same as the rest of society. I don&amp;rsquo;t call them&#xA;fascists baselessly &amp;ndash; someone who speaks out in support of and expresses&#xA;solidarity with fascists, or who uses fascists dog-whistles or promotes fascist&#xA;ideology and talking points, or boosts fascist conspiracy theories &amp;ndash; well,&#xA;they&amp;rsquo;re a fascist.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A better future for JavaScript that won&#39;t happen</title>
      <link>https://drewdevault.com/2025/09/17/2025-09-17-An-impossible-future-for-JS.html</link>
      <pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/09/17/2025-09-17-An-impossible-future-for-JS.html</guid>
      <description>&lt;p&gt;In the wake of &lt;a href=&#34;https://www.ox.security/blog/npm-2-0-hack-40-npm-packages-hit-in-major-supply-chain-attack/&#34;&gt;the largest supply-chain attack in history&lt;/a&gt;, the JavaScript&#xA;community could have a moment of reckoning and decide: never again. As the panic&#xA;and shame subsides, after compromised developers finish re-provisioning their&#xA;workstations and rotating their keys, the ecosystem might re-orient itself&#xA;towards solving the fundamental flaws that allowed this to happen.&lt;/p&gt;&#xA;&lt;p&gt;After all, people have been sounding the alarm &lt;a href=&#34;https://drewdevault.com/2019/12/09/Developers-shouldnt-distribute.html&#34;&gt;for years&lt;/a&gt; that this approach&#xA;to dependency management is &lt;a href=&#34;https://drewdevault.com/2021/09/27/Let-distros-do-their-job.html&#34;&gt;reckless&lt;/a&gt; and &lt;a href=&#34;https://drewdevault.com/2022/05/12/Supply-chain-when-will-we-learn.html&#34;&gt;dangerous&lt;/a&gt; and broken by&#xA;design. Maybe this is the moment when the JavaScript ecosystem begins to&#xA;understand the importance and urgency of this problem, and begins its course&#xA;correction. It could leave behind its sprawling dependency trees full of&#xA;micro-libraries, establish software distribution based on relationships of&#xA;trust, and incorporate the decades of research and innovation established by&#xA;more serious dependency management systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embedding Wren in Hare</title>
      <link>https://drewdevault.com/2025/08/20/2025-08-20-Hare-and-Wren.html</link>
      <pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/08/20/2025-08-20-Hare-and-Wren.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been on the lookout for a scripting language which can be neatly embedded&#xA;into Hare programs. Perhaps the obvious candidate is &lt;a href=&#34;https://www.lua.org/&#34;&gt;Lua&lt;/a&gt; &amp;ndash; but I&amp;rsquo;m not&#xA;particularly enthusiastic about it. When I was evaluating the landscape of tools&#xA;which are &amp;ldquo;like Lua, but not Lua&amp;rdquo;, I found an interesting contender: &lt;a href=&#34;https://wren.io/&#34;&gt;Wren&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I found that Wren punches far above its weight for such a simple language. It&amp;rsquo;s&#xA;object oriented, which, you know, take it or leave it depending on your&#xA;use-case, but it&amp;rsquo;s very straightforwardly interesting for what it is. I found a&#xA;few things to complain about, of course &amp;ndash; its scope rules are silly, the C API&#xA;has some odd limitations here and there, and in my opinion the &amp;ldquo;standard&#xA;library&amp;rdquo; provided by wren CLI is poorly designed. But, surprisingly, my list of&#xA;complaints more or less ends there, and I was excited to build a nice interface&#xA;to it from Hare.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What&#39;s new with Himitsu 0.9?</title>
      <link>https://drewdevault.com/2025/08/08/2025-08-08-Whats-new-with-himitsu.html</link>
      <pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/08/08/2025-08-08-Whats-new-with-himitsu.html</guid>
      <description>&lt;p&gt;Last week, Armin and I worked together on the latest release of &lt;a href=&#34;https://himitsustore.org/&#34;&gt;Himitsu&lt;/a&gt;, a&#xA;&amp;ldquo;secret storage manager&amp;rdquo; for Linux. I haven&amp;rsquo;t blogged about Himitsu since I&#xA;announced it &lt;a href=&#34;https://drewdevault.com/2022/06/20/Himitsu.html&#34;&gt;three years ago&lt;/a&gt;, and I thought it would be nice to give you a&#xA;closer look at the latest release, both for users eager to see the latest&#xA;features and for those who haven&amp;rsquo;t been following along.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;A brief introduction: Himitsu is like a password manager, but more general: it&#xA;stores any kind of secret in its database, including passwords but also SSH&#xA;keys, credit card numbers, your full disk encryption key, answers to those&#xA;annoying &amp;ldquo;security questions&amp;rdquo; your bank obliged you to fill in, and so on. It&#xA;can also enrich your secrets with arbitrary metadata, so instead of just&#xA;storing, say, your IMAP password, it can also store the host, port, TLS&#xA;configuration, and username, storing the complete information necessary to&#xA;establish an IMAP session.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Just speak the truth</title>
      <link>https://drewdevault.com/2025/06/30/Speak-the-truth.html</link>
      <pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/06/30/Speak-the-truth.html</guid>
      <description>&lt;p&gt;Today, we&amp;rsquo;re looking at two case studies in how to respond when reactionaries&#xA;appear in your free software community.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exhibit-a&#34;&gt;Exhibit A&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;It is a technical decision.&lt;/p&gt;&#xA;&lt;p&gt;The technical reason is that the security team does not have the bandwidth to&#xA;provide lifecycle maintenance for multiple X server implementations. Part of&#xA;the reason for moving X from main to community was to reduce the burden on the&#xA;security team for long-term maintenance of X. Additionally, nobody so far on&#xA;the security team has expressed any interest in collaborating with&#xA;&lt;span class=&#34;redacted&#34;&gt;xxxxxx&lt;/span&gt; on security concerns.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unionize or die</title>
      <link>https://drewdevault.com/2025/06/09/2025-06-09-Unionize-or-die.html</link>
      <pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/06/09/2025-06-09-Unionize-or-die.html</guid>
      <description>&lt;p&gt;Tech workers have long resisted the suggestion that we should be organized into&#xA;unions. The topic is consistently met with a cold reception by tech workers when&#xA;it is raised, and no big tech workforce is meaningfully organized. This is a&#xA;fatal mistake &amp;ndash; and I don&amp;rsquo;t mean &amp;ldquo;fatal&amp;rdquo; in the figurative sense. Tech workers,&#xA;it&amp;rsquo;s time for you to unionize, and strike, or you and your loved ones are&#xA;literally going to die.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The British Airways position on various border disputes</title>
      <link>https://drewdevault.com/2025/05/05/2025-05-05-BA-on-border-disputes.html</link>
      <pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/05/05/2025-05-05-BA-on-border-disputes.html</guid>
      <description>&lt;p&gt;My spouse and I are on vacation in Japan, spending half our time seeing the&#xA;sights and the other half working remotely and enjoying the experience of living&#xA;in a different place for a while. To get here, we flew on British Airways from&#xA;London to Tokyo, and I entertained myself on the long flight by browsing the&#xA;interactive flight map on the back of my neighbor&amp;rsquo;s seat and trying to figure&#xA;out how the poor developer who implemented this map solved the thorny problems&#xA;that displaying a world map implies.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resistance from the tech sector</title>
      <link>https://drewdevault.com/2025/04/20/2025-04-20-Tech-sector-restistance.html</link>
      <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/04/20/2025-04-20-Tech-sector-restistance.html</guid>
      <description>&lt;p&gt;As of late, most of us have been reading the news with a sense of anxious&#xA;trepidation. At least, those of us who read from a position of relative comfort&#xA;and privilege. Many more read the news with fear. Some of us are already no&#xA;longer in a position to read the news at all, having become the unfortunate&#xA;subjects of the news. Fascism is on the rise worldwide and in the United States&#xA;the news is particularly alarming. The time has arrived to act.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Firefox addon for putting prices into perspective</title>
      <link>https://drewdevault.com/2025/04/04/2025-04-04-Price-perspective.html</link>
      <pubDate>Fri, 04 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/04/04/2025-04-04-Price-perspective.html</guid>
      <description>&lt;p&gt;I had a fun idea for a small project this weekend, and so I quickly put it&#xA;together over the couple of days. The result is &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/price-perspective/&#34;&gt;Price Perspective&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Humor me: have you ever bought something, considered the price, and wondered how&#xA;that price would look to someone else? Someone in the developing world, or a&#xA;billionaire, or just your friend in Australia? In other words, can we develop an&#xA;intuition for &lt;a href=&#34;https://en.wikipedia.org/wiki/Purchasing_power&#34;&gt;purchasing power&lt;/a&gt;?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using linkhut to signal-boost my bookmarks</title>
      <link>https://drewdevault.com/2025/03/27/2025-03-27-Using-linkhut.html</link>
      <pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/03/27/2025-03-27-Using-linkhut.html</guid>
      <description>&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt;: linkhut has started to use generative AI tools upstream.&#xA;Consequently, I have withdrawn my endorsement of the project.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;It must have been at least a year ago that I first noticed &lt;a href=&#34;https://linkhut.org/&#34;&gt;linkhut&lt;/a&gt;, and its&#xA;flagship instance at &lt;a href=&#34;https://ln.ht&#34;&gt;ln.ht&lt;/a&gt;, appear on SourceHut, where it immediately caught&#xA;my attention for its good taste in inspirations. Once upon a time, I had a&#xA;&lt;a href=&#34;https://pinboard.in/&#34;&gt;Pinboard&lt;/a&gt; account, which is a similar concept, but I never used it for anything&#xA;in the end. When I saw linkhut I had a similar experience: I signed up and&#xA;played with it for a few minutes before moving on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please stop externalizing your costs directly into my face</title>
      <link>https://drewdevault.com/2025/03/17/2025-03-17-Stop-externalizing-your-costs-on-me.html</link>
      <pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/03/17/2025-03-17-Stop-externalizing-your-costs-on-me.html</guid>
      <description>&lt;p&gt;&lt;em&gt;This blog post is expressing personal experiences and opinions and doesn&amp;rsquo;t&#xA;reflect any official policies of SourceHut.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Over the past few months, instead of working on our priorities at SourceHut, I&#xA;have spent anywhere from 20-100% of my time in any given week mitigating&#xA;hyper-aggressive LLM crawlers at scale. This isn&amp;rsquo;t the first time SourceHut has&#xA;been at the wrong end of some malicious bullshit or paid someone else&amp;rsquo;s&#xA;externalized costs &amp;ndash; every couple of years someone invents a new way of ruining&#xA;my day.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A holistic perspective on intellectual property, part 1</title>
      <link>https://drewdevault.com/2025/02/13/2025-02-13-On-intellectual-property.html</link>
      <pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/02/13/2025-02-13-On-intellectual-property.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;d like to write about intellectual property in depth, in this first of a&#xA;series of blog posts on the subject. I&amp;rsquo;m not a philosopher, but philosophy is&#xA;the basis of reasonable politics so buckle up for a healthy Friday afternoon&#xA;serving of it.&lt;/p&gt;&#xA;&lt;p&gt;To understand intellectual property, we must first establish at least a shallow&#xA;understanding of property generally. What is property?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; An incomplete&#xA;answer might state that a material object I have power over is my property. An&#xA;apple I have held in my hand is mine, insofar as nothing prevents me from using&#xA;it (and, in the process, destroying it), or giving it away, or planting it in&#xA;the ground. However, you might not agree that this apple is necessarily &lt;em&gt;mine&lt;/em&gt;&#xA;if I took it from a fruit stand without permission. This act is called &amp;ldquo;theft&amp;rdquo;&#xA;&amp;mdash; one of many possible transgressions upon property.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Join us to discuss transparency and governance at FOSDEM &#39;25</title>
      <link>https://drewdevault.com/2025/01/23/2025-01-23-Transparency-and-governance-FOSDEM.html</link>
      <pubDate>Thu, 23 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/01/23/2025-01-23-Transparency-and-governance-FOSDEM.html</guid>
      <description>&lt;p&gt;Good news: it appears that Jack Dorsey&amp;rsquo;s FOSDEM talk has been cancelled!&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;This is a follow up to two earlier posts, which you can read here: &lt;a href=&#34;https://drewdevault.com/2025/01/16/2025-01-16-No-Billionares-at-FOSDEM-please.html&#34;&gt;one&lt;/a&gt; and&#xA;&lt;a href=&#34;https://drewdevault.com/2025/01/20/2025-01-20-FOSDEM-protest.html&#34;&gt;two&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I say it &amp;ldquo;appears&amp;rdquo; so, because there has been no official statement from anyone&#xA;to that effect. There has also been no communication from staff to the protest&#xA;organizers, including to our email reaching out &lt;a href=&#34;https://fosdem.org/2025/news/2025-01-16-protests/&#34;&gt;as requested&lt;/a&gt; to discuss fire&#xA;safety and crowd control concerns with the staff. The situation is a bit&#xA;unclear, but… we&amp;rsquo;ll extend FOSDEM the benefit of the doubt, and with it our&#xA;gratitude. From all of the volunteers who have been organizing this protest&#xA;action, we extend our heartfelt thanks to the staff for reconsidering the&#xA;decision to platform Dorsey and Block, Inc. at FOSDEM. All of us &amp;ndash; long-time&#xA;FOSDEM volunteers, speakers, devroom organizers, and attendees &amp;ndash; are relieved&#xA;to know that FOSDEM stands for our community&amp;rsquo;s interests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOSDEM &#39;25 protest</title>
      <link>https://drewdevault.com/2025/01/20/2025-01-20-FOSDEM-protest.html</link>
      <pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/01/20/2025-01-20-FOSDEM-protest.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Update: Dorsey&amp;rsquo;s talk was cancelled! &lt;a href=&#34;https://drewdevault.com/2025/01/23/2025-01-23-Transparency-and-governance-FOSDEM.html&#34;&gt;See the update here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/2025/01/16/2025-01-16-No-Billionares-at-FOSDEM-please.html&#34;&gt;Last week&lt;/a&gt;, I wrote to object to Jack Dorsey and his company, Block,&#xA;Inc., being accepted as main track speakers at FOSDEM, and proposed a protest&#xA;action in response. &lt;a href=&#34;https://fosdem.org/2025/news/2025-01-16-protests/&#34;&gt;FOSDEM issued a statement about our plans&lt;/a&gt; on&#xA;Thursday.&lt;/p&gt;&#xA;&lt;p&gt;Today, I have some updates for you regarding the planned action.&lt;/p&gt;&#xA;&lt;p&gt;I would like to emphasize that we are not protesting FOSDEM or its organizers.&#xA;We are protesting Jack Dorsey and his company, first and foremost, from&#xA;promoting their business at FOSDEM. We are members of the FOSDEM community. We&#xA;have variously been speakers, devroom organizers, volunteers, and attendees for&#xA;years &amp;mdash; in other words, we are not activism tourists. We have a deep&#xA;appreciation for the organizers and all of the work that they have done over the&#xA;years to make FOSDEM such a success.&lt;/p&gt;</description>
    </item>
    <item>
      <title>No billionaires at FOSDEM</title>
      <link>https://drewdevault.com/2025/01/16/2025-01-16-No-Billionares-at-FOSDEM-please.html</link>
      <pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2025/01/16/2025-01-16-No-Billionares-at-FOSDEM-please.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Update: Dorsey&amp;rsquo;s talk was cancelled! &lt;a href=&#34;https://drewdevault.com/2025/01/23/2025-01-23-Transparency-and-governance-FOSDEM.html&#34;&gt;See the update here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jack Dorsey, former CEO of Twitter, ousted board member of BlueSky, and grifter&#xA;extraordinaire to the tune of a $5.6B net worth, is &lt;a href=&#34;https://fosdem.org/2025/schedule/event/fosdem-2025-4507-infusing-open-source-culture-into-company-dna-a-conversation-with-jack-dorsey-and-manik-surtani-block-s-head-of-open-source/&#34;&gt;giving a keynote at&#xA;FOSDEM&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The FOSDEM keynote stage is one of the biggest platforms in the free software&#xA;community. Janson is the biggest venue in the event &amp;ndash; its huge auditorium&#xA;can accommodate over 1,500 of FOSDEM&amp;rsquo;s 8,000 odd attendees, and it is live&#xA;streamed to a worldwide audience as the face of one of the free and open source&#xA;software community&amp;rsquo;s biggest events of the year. We&amp;rsquo;ve platformed Red Hat, the&#xA;NLNet Foundation, NASA, numerous illustrious community leaders, and many smaller&#xA;projects that embody our values and spirit at this location to talk about their&#xA;work or important challenges our community faces.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Neurodivergence and accountability in free software</title>
      <link>https://drewdevault.com/2024/09/25/2024-09-25-Neurodivergence-and-accountability-in-free-software.html</link>
      <pubDate>Wed, 25 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/09/25/2024-09-25-Neurodivergence-and-accountability-in-free-software.html</guid>
      <description>&lt;p&gt;In November of last year, I wrote &lt;a href=&#34;https://drewdevault.com/2023/11/25/2023-11-26-RMS-on-sex.html&#34;&gt;Richard Stallman&amp;rsquo;s political discourse on&#xA;sex&lt;/a&gt;, which argues that Richard Stallman, the founder of and present-day&#xA;voting member of the board of directors of the Free Software Foundation (FSF),&#xA;endorses and advocates for a harmful political agenda which legitimizes&#xA;adult attraction to minors, consistently defends adults accused of and&#xA;convicted of sexual crimes with respect to minors, and more generally&#xA;erodes norms of consent and manipulates language regarding sexual harassment and&#xA;sexual assault in his broader political program.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rust for Linux revisited</title>
      <link>https://drewdevault.com/2024/08/30/2024-08-30-Rust-in-Linux-revisited.html</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/08/30/2024-08-30-Rust-in-Linux-revisited.html</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Ugh. Drew&amp;rsquo;s blogging about Rust again.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&amp;ndash; You&lt;/p&gt;&#xA;&lt;p&gt;I promise to be nice.&lt;/p&gt;&#xA;&lt;p&gt;Two years ago, seeing the Rust-for-Linux project starting to get the ball&#xA;rolling, I wrote &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2022/10/03/Does-Rust-belong-in-Linux.html&#34;&gt;Does Rust belong in the Linux kernel?&lt;/a&gt;&amp;rdquo;, penning a&#xA;conclusion consistent with &lt;a href=&#34;https://en.wikipedia.org/wiki/Betteridge&#39;s_law_of_headlines&#34;&gt;Betteridge&amp;rsquo;s law of headlines&lt;/a&gt;. Two years on we&#xA;have a lot of experience to draw on to see how Rust-for-Linux is actually playing&#xA;out, and I&amp;rsquo;d like to renew my thoughts with some hindsight &amp;ndash; and more&#xA;compassion. If you&amp;rsquo;re one of the Rust-for-Linux participants burned out or&#xA;burning out on this project, I want to help. Burnout sucks &amp;ndash; I&amp;rsquo;ve been there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>So you want to compete with or replace open source</title>
      <link>https://drewdevault.com/2024/07/16/2024-07-16-So-you-want-to-compete-with-FOSS.html</link>
      <pubDate>Tue, 16 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/07/16/2024-07-16-So-you-want-to-compete-with-FOSS.html</guid>
      <description>&lt;p&gt;We are living through an interesting moment in source-available software.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;The open source movement has always had, and continues to have, a solid&#xA;grounding in grassroots programmers building tools for themselves and forming&#xA;communities around them. Some looming giants brought on large sums of money &amp;ndash;&#xA;Linux, Mozilla, Apache, and so on &amp;ndash; and other giants made do without, like GNU,&#xA;but for the most part if anyone thought about open source 15 years ago they were&#xA;mostly thinking about grassroots communities who built software together for&#xA;fun. With the rise of GitHub and in particular the explosion of web development&#xA;as an open platform, commercial stakeholders in software caught on to the&#xA;compelling economics of open source. The open source boom that followed caused&#xA;open source software to have an enormous impact on everyone working in the&#xA;software industry, and, in one way or another, on everyone living on planet&#xA;Earth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a Unix clone in about a month</title>
      <link>https://drewdevault.com/2024/05/24/2024-05-24-Bunnix.html</link>
      <pubDate>Fri, 24 May 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/05/24/2024-05-24-Bunnix.html</guid>
      <description>&lt;p&gt;I needed a bit of a break from &amp;ldquo;real work&amp;rdquo; recently, so I started a new&#xA;programming project that was low-stakes and purely recreational. On April 21st,&#xA;I set out to see how much of a Unix-like operating system for x86_64 targets&#xA;that I could put together in about a month. The result is&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/bunnix&#34;&gt;Bunnix&lt;/a&gt;. Not including days I didn&amp;rsquo;t work&#xA;on Bunnix for one reason or another, I spent 27 days on this project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Copyleft licenses are not “restrictive”</title>
      <link>https://drewdevault.com/2024/04/19/2024-04-19-Copyleft-is-not-restrictive.html</link>
      <pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/04/19/2024-04-19-Copyleft-is-not-restrictive.html</guid>
      <description>&lt;p&gt;One may observe an axis, or a &amp;ldquo;spectrum&amp;rdquo;, along which free and open source&#xA;software licenses can be organized, where one end is &amp;ldquo;permissive&amp;rdquo; and the other&#xA;end is &amp;ldquo;copyleft&amp;rdquo;. It is important to acknowledge, however, that though copyleft&#xA;can be found at the opposite end of an axis with respect to permissive, it is&#xA;not synonymous with the linguistic antonym of permissive &amp;ndash; that is, copyleft&#xA;licenses are not &amp;ldquo;restrictive&amp;rdquo; by comparison with permissive licenses.&lt;/p&gt;</description>
    </item>
    <item>
      <title>FDO&#39;s conduct enforcement actions regarding Vaxry</title>
      <link>https://drewdevault.com/2024/04/09/2024-04-09-FDO-conduct-enforcement.html</link>
      <pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2024/04/09/2024-04-09-FDO-conduct-enforcement.html</guid>
      <description>&lt;p&gt;freedesktop(.org), aka FDO, recently banned Hyprland maintainer Vaxry from the&#xA;FDO community, and in response Vaxry has taken his case to the court of public&#xA;opinion, publishing their email exchanges and writing about it on his blog.&lt;/p&gt;&#xA;&lt;p&gt;It saddens me to bear witness to these events today. I wrote &lt;a href=&#34;https://drewdevault.com/2023/09/17/Hyprland-toxicity.html&#34;&gt;in September of&#xA;last year&lt;/a&gt; about problems with toxicity in the Hyprland community. I&#xA;initially reached out to Vaxry to discuss these problems in private in February&#xA;of last year. I failed to get through to him, leading to that blog post in&#xA;September. I spent some time in the following weeks talking with Vaxry on his&#xA;behavior and his community&amp;rsquo;s social norms, again in private, but again, I was&#xA;unable to get through to him. Unfortunately, we find ourselves again leaving the&#xA;private sphere and discussing Vaxry&amp;rsquo;s behavior and the problem posed by the&#xA;Hyprland community once again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Prusa is floundering, and how you can avoid their fate</title>
      <link>https://drewdevault.com/2023/12/26/2023-12-26-Prusa-is-floundering.html</link>
      <pubDate>Tue, 26 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/12/26/2023-12-26-Prusa-is-floundering.html</guid>
      <description>&lt;p&gt;Prusa is a 3D printer manufacturer which has a long history of being admired by&#xA;the 3D printing community for high quality, open source printers. They have been&#xA;struggling as of late, and came under criticism for making the firmware of their&#xA;Mk4 printer non-free.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://lucumr.pocoo.org/2023/12/25/life-and-death-of-open-source/&#34;&gt;Armin Ronacher&lt;/a&gt; uses Prusa as a case-study in why open source companies&#xA;fail, and uses this example to underline his argument that open source needs to&#xA;adapt for commercial needs, namely by adding commercial exclusivity clauses to&#xA;its licenses &amp;ndash; Armin is one of the principal proponents of the non-free&#xA;Functional Source License. Armin cites his experience with a Chinese&#xA;manufactured 3D printer as evidence that intellectual property is at the heart&#xA;of Prusa&amp;rsquo;s decline, and goes on to discuss how this dynamic applies to his own&#xA;work in developing a non-free license for use with Sentry. I find this work&#xA;pretty interesting &amp;ndash; FSL is a novel entry into the non-free license compendium,&#xA;and it&amp;rsquo;s certainly a better way to do software than proprietary models, assuming&#xA;that it&amp;rsquo;s not characterized as free or open source. But, allow me to use the&#xA;same case study to draw different conclusions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Richard Stallman&#39;s political discourse on sex</title>
      <link>https://drewdevault.com/2023/11/25/2023-11-26-RMS-on-sex.html</link>
      <pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/11/25/2023-11-26-RMS-on-sex.html</guid>
      <description>&lt;p&gt;Richard Stallman, the founder of the Free Software Foundation, has been subject&#xA;to numerous allegations of misconduct. He stepped down in 2019, and following&#xA;his re-instatement in 2021, a famous &lt;a href=&#34;https://rms-open-letter.github.io/&#34;&gt;open letter&lt;/a&gt; was published in which&#xA;numerous organizations and individuals from throughout the Free Software&#xA;ecosystem called for his removal from the Free Software Foundation. The letter&#xA;had no effect; Stallman remains a voting member of the FSF&amp;rsquo;s &lt;a href=&#34;https://www.fsf.org/about/staff-and-board&#34;&gt;board of&#xA;directors&lt;/a&gt; to this day and continues to receive numerous &lt;a href=&#34;https://stallman.org/talks.html&#34;&gt;speaking&#xA;engagements&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Can I be on your podcast?</title>
      <link>https://drewdevault.com/2023/11/09/Can-I-be-on-your-podcast.html</link>
      <pubDate>Thu, 09 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/11/09/Can-I-be-on-your-podcast.html</guid>
      <description>&lt;p&gt;I am working on rousing the &lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt; community to get the&#xA;word out about our work. I have drafted the &lt;a href=&#34;https://harelang.org/evangelism/&#34;&gt;Hare evangelism&lt;/a&gt; guidelines to&#xA;this effect, which summarizes how we want to see our community bringing Hare to&#xA;more people.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;d like to spread the word in a way which is respectful of the attention of&#xA;others &amp;ndash; we&amp;rsquo;re explicitly eschewing unsolicited prompts for projects to&#xA;consider writing/rewriting in Hare, as well as any paid sponsorships or&#xA;advertising. Blog posts about Hare, videos, participating in (organic) online&#xA;discussions &amp;ndash; much better! And one idea we have is to talk about Hare on&#xA;podcasts which might be interested in the project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On &#34;real name&#34; policies</title>
      <link>https://drewdevault.com/2023/10/31/On-real-names.html</link>
      <pubDate>Tue, 31 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/10/31/On-real-names.html</guid>
      <description>&lt;p&gt;Some free software projects reject anonymous or pseudonymous contributions,&#xA;requiring you to author patches using your &amp;ldquo;real name&amp;rdquo;. Such projects have a&#xA;so-called &amp;ldquo;real name&amp;rdquo; policy; Linux is one well-known example.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;The root motivations behind such policies vary, but in my experience the most&#xA;often cited rationale is that it&amp;rsquo;s important to establish the provenance of the&#xA;contribution for copyright reasons. In the case of Linux, contributors are asked&#xA;to &amp;ldquo;sign-off&amp;rdquo; their commits to indicate their agreement to the terms of the&#xA;Developer Certificate of Origin (DCO), which includes clauses like the&#xA;following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Going off-script</title>
      <link>https://drewdevault.com/2023/10/13/Going-off-script.html</link>
      <pubDate>Fri, 13 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/10/13/Going-off-script.html</guid>
      <description>&lt;p&gt;There is a phenomenon in society which I find quite bizarre. Upon our entry to&#xA;this mortal coil, we are endowed with self-awareness, agency, and free will.&#xA;Each of the 8 billion members of this human race represents a unique person, a&#xA;unique worldview, and a unique agency. Yet, many of us have the same fundamental&#xA;goals and strive to live the same life.&lt;/p&gt;&#xA;&lt;p&gt;I think of such a life experiences as &amp;ldquo;following the script&amp;rdquo;. Society lays down&#xA;for us a framework for living out our lives. Everyone deviates from the script&#xA;to some extent, but most people hit the important beats. In Western society,&#xA;these beats are something like, go to school, go to college, get a degree, build&#xA;a career, get married, have 1.5 children, retire to Florida, die.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The forbidden topics</title>
      <link>https://drewdevault.com/2023/09/29/The-forbidden-topics.html</link>
      <pubDate>Fri, 29 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/09/29/The-forbidden-topics.html</guid>
      <description>&lt;p&gt;There are forbidden topics in the hacker community. One is sternly reprimanded&#xA;for bringing them up, by their peers, their leaders, and the community at large.&#xA;In private, one can expect threats and intimidation; in public, outcry and&#xA;censorship. The forbidden topics are enforced by the moderators of our spaces,&#xA;taken off of forums, purged from chat rooms, and cleaned up from GitHub issues&#xA;and mailing lists; the ban-hammers fall swiftly and resolutely. My last article&#xA;to touch these subjects was removed from Hacker News by the moderators within 30&#xA;minutes and landed several death threats in my inbox. The forbidden topics, when&#xA;raised, are met with a resounding, aggressive dismissal and unconditional&#xA;condemnation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hyprland is a toxic community</title>
      <link>https://drewdevault.com/2023/09/17/Hyprland-toxicity.html</link>
      <pubDate>Sun, 17 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/09/17/Hyprland-toxicity.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hyprland.org/&#34;&gt;Hyprland&lt;/a&gt; is an open source Wayland compositor based on &lt;a href=&#34;https://gitlab.freedesktop.org/wlroots/wlroots&#34;&gt;wlroots&lt;/a&gt;, a&#xA;project I started back in 2017 to make it easier to build good Wayland&#xA;compositors. It&amp;rsquo;s a project which is loved by its users for its emphasis on&#xA;customization and &amp;ldquo;eye candy&amp;rdquo; &amp;ndash; beautiful graphics and animations, each&#xA;configuration tailored to the unique look and feel imagined by the user who&#xA;creates it. It&amp;rsquo;s a very exciting project!&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, the effect is spoilt by an incredibly toxic and hateful&#xA;community. I cannot recommend Hyprland to anyone who is not prepared to steer&#xA;well clear of its community spaces. Imagine a high school boys&amp;rsquo; locker room come&#xA;to life on Discord and GitHub and you&amp;rsquo;ll get an idea of what it&amp;rsquo;s like.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI crap</title>
      <link>https://drewdevault.com/2023/08/29/2023-08-29-AI-crap.html</link>
      <pubDate>Tue, 29 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/08/29/2023-08-29-AI-crap.html</guid>
      <description>&lt;p&gt;There is a machine learning bubble, but the technology is here to stay. Once the&#xA;bubble pops, the world &lt;em&gt;will&lt;/em&gt; be changed by machine learning. But it will&#xA;probably be crappier, not better.&lt;/p&gt;&#xA;&lt;p&gt;Contrary to the AI doomer&amp;rsquo;s expectations, the world isn&amp;rsquo;t going to go down in&#xA;flames any faster thanks to AI. Contemporary advances in machine learning aren&amp;rsquo;t&#xA;really getting us any closer to AGI, and as Randall Monroe pointed out back in&#xA;2018:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello from Ares!</title>
      <link>https://drewdevault.com/2023/08/09/2023-08-09-Hello-from-Ares.html</link>
      <pubDate>Wed, 09 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/08/09/2023-08-09-Hello-from-Ares.html</guid>
      <description>&lt;p&gt;I am pleased to be writing today&amp;rsquo;s blog post from a laptop running &lt;a href=&#34;https://ares-os.org&#34;&gt;Ares OS&lt;/a&gt;. I&#xA;am writing into an ed(1) session, on a file on an ext4 filesystem on its hard&#xA;drive. That&amp;rsquo;s pretty cool! It seems that a lot of interesting stuff has happened&#xA;since I gave that talk on Helios at &lt;a href=&#34;https://spacepub.space/w/wpKXfhqqr7FajEAf4B2Vc2&#34;&gt;FOSDEM&lt;/a&gt; in February.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/68a47ef3.jpg&#34; alt=&#34;A picture of my ThinkPad while I was editing this blog post&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The talk I gave at FOSDEM was no doubt impressive, but it was a bit of a party&#xA;trick. The system was running on a Raspberry Pi with one process which included&#xA;both the slide deck as a series of raster images baked into the ELF file, as&#xA;well as the GPU driver and drawing code necessary to display them, all in one&#xA;package. This was quite necessary, as it turns out, given that the very idea of&#xA;&amp;ldquo;processes&amp;rdquo; was absent from the system at this stage.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The rc shell and its excellent handling of whitespace</title>
      <link>https://drewdevault.com/2023/07/31/The-rc-shell-and-whitespace.html</link>
      <pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/07/31/The-rc-shell-and-whitespace.html</guid>
      <description>&lt;p&gt;&lt;em&gt;This blog post is a response to Mark Dominus&amp;rsquo; &amp;ldquo;&lt;a href=&#34;https://blog.plover.com/Unix/whitespace.html&#34;&gt;The shell and its crappy handling of whitespace&lt;/a&gt;&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been working on a shell for Unix-like systems called&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/rc&#34;&gt;rc&lt;/a&gt;, which draws heavily from the Plan 9 shell&#xA;&lt;a href=&#34;http://man.9front.org/1/rc&#34;&gt;of the same name&lt;/a&gt;. When I saw Mark&amp;rsquo;s post about the&#xA;perils of whitespace in POSIX shells (or derived shells, like bash), I thought&#xA;it prudent to see if any of the problems he outlines are present in the shell&#xA;I&amp;rsquo;m working on myself. Good news: they aren&amp;rsquo;t!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alpine Linux does not make the news</title>
      <link>https://drewdevault.com/2023/07/25/Alpine-does-not-make-news.html</link>
      <pubDate>Tue, 25 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/07/25/Alpine-does-not-make-news.html</guid>
      <description>&lt;p&gt;My Linux distribution of choice for several years has been &lt;a href=&#34;https://alpinelinux.org/&#34;&gt;Alpine Linux&lt;/a&gt;.&#xA;It&amp;rsquo;s a small, efficient distribution which ships a number of tools I appreciate&#xA;for their simplicity, such as musl libc. It has a very nice package manager,&#xA;apk, which is fast and maintainable. The development community is professional&#xA;and focuses on diligent maintenance of the distribution and little else. Over&#xA;the years I have used it, very little of note has happened.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Seriously, don&#39;t sign a CLA</title>
      <link>https://drewdevault.com/2023/07/04/Dont-sign-a-CLA-2.html</link>
      <pubDate>Tue, 04 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/07/04/Dont-sign-a-CLA-2.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://about.sourcegraph.com/&#34;&gt;SourceGraph&lt;/a&gt; is making their product closed source, abandoning the Apache&#xA;2.0 license it was originally distributed under, so once again we convene in the&#xA;ritual condemnation we offer to commercial products that piss in the pool of&#xA;open source. Invoking Bryan Cantrill once more:&lt;/p&gt;&#xA;&lt;iframe&#xA;  width=&#34;560&#34;&#xA;  height=&#34;315&#34;&#xA;  src=&#34;https://www.youtube-nocookie.com/embed/-zRN7XLCRhc?start=2483&#34;&#xA;  frameborder=&#34;0&#34;&#xA;  allow=&#34;accelerometer; autoplay; gyroscope; picture-in-picture&#34;&#xA;  allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;&#xA;&lt;a&#xA;  style=&#34;display: block; text-align: center&#34;&#xA;  href=&#34;https://youtu.be/-zRN7XLCRhc?t=2483&#34;&#xA;&gt;&lt;small&gt;Bryan Cantrill on OpenSolaris &amp;mdash; YouTube&lt;/small&gt;&lt;/a&gt;&#xA;&lt;p&gt;A contributor license agreement, or CLA, usually (but not always) includes an&#xA;important clause: a copyright assignment. These agreements are provided by&#xA;upstream maintainers to contributors to open source software projects, and they&#xA;demand a signature before the contributor&amp;rsquo;s work is incorporated into the&#xA;upstream project. The copyright assignment clause that is usually included&#xA;serves to offer the upstream maintainers more rights over the contributor&amp;rsquo;s work&#xA;than the contributor was offered by upstream, generally in the form of ownership&#xA;or effective ownership over the contributor&amp;rsquo;s copyright and the right to license&#xA;it in any manner they choose in the future, including proprietary distributions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Social media and &#34;parasocial media&#34;</title>
      <link>https://drewdevault.com/2023/06/30/Social-and-parasocial-media.html</link>
      <pubDate>Fri, 30 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/06/30/Social-and-parasocial-media.html</guid>
      <description>&lt;p&gt;A few months ago, as Elon Musk took over Twitter and instituted polices that&#xA;alienated many people, some of these people fled towards federated, free&#xA;software platforms like Mastodon. Many people found a new home here, but there&#xA;is a certain class of refugee who has not found it to their liking.&lt;/p&gt;&#xA;&lt;p&gt;I got to chatting with one such &amp;ldquo;refugee&amp;rdquo; on Mastodon today. &lt;a href=&#34;https://inv.tux.pizza/channel/UC0intLFzLaudFG-xAvUEO-A&#34;&gt;NotJustBikes&lt;/a&gt;&#xA;is a creator I enjoy watching on &lt;del&gt;YouTube&lt;/del&gt; Invidious, who makes excellent&#xA;content on urbanism and the design of cities. He&amp;rsquo;s based in my home town of&#xA;Amsterdam and his videos do a great job of explaining many of the things I love&#xA;about this place for general audiences. He&amp;rsquo;s working on building an audience,&#xA;expanding his reach, and bringing his message to as many people as possible in&#xA;the interest of bringing better infrastructure to everyone.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Burnout and the quiet failures of the hacker community</title>
      <link>https://drewdevault.com/2023/06/29/Burnout-2.html</link>
      <pubDate>Thu, 29 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/06/29/Burnout-2.html</guid>
      <description>&lt;p&gt;This has been a very challenging year for me. You probably read that I suffered&#xA;from &lt;a href=&#34;https://drewdevault.com/2023/05/01/2023-05-01-Burnout.html&#34;&gt;burnout&lt;/a&gt; earlier in the year. In some&#xA;respects, things have improved, and in many other respects, I am still haunted.&lt;/p&gt;&#xA;&lt;p&gt;You might not care to read this, and so be it, take your leave if you must. But&#xA;writing is healing for me. Maybe this is a moment for solidarity, sympathy, for&#xA;reflecting on your own communities. Maybe it&amp;rsquo;s a vain and needlessly public&#xA;demonstration of my slow descent into madness. I don&amp;rsquo;t know, but here we go.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reforming the free software message</title>
      <link>https://drewdevault.com/2023/06/19/Reforming-the-free-software-message.html</link>
      <pubDate>Mon, 19 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/06/19/Reforming-the-free-software-message.html</guid>
      <description>&lt;p&gt;Several weeks ago, I wrote &lt;a href=&#34;https://drewdevault.com/2023/04/11/2023-04-11-The-FSF-is-dying.html&#34;&gt;The Free Software Foundation is dying&lt;/a&gt;, wherein I&#xA;enumerated a number of problems with the Free Software Foundation. Some of my&#xA;criticisms focused on the message: fsf.org and gnu.org together suffer from no&#xA;small degree of incomprehensibility and inaccessibility which makes it difficult&#xA;for new participants to learn about the movement and apply it in practice to&#xA;their own projects.&lt;/p&gt;&#xA;&lt;p&gt;This is something which is relatively easily fixed! I have a background in&#xA;writing documentation and a thorough understanding of free software philosophy&#xA;and practice. Enter &lt;a href=&#34;https://writefreesoftware.org&#34;&gt;writefreesoftware.org&lt;/a&gt;: a comprehensive introduction to&#xA;free software philosophy and implementation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Throwing in the towel on mobile Linux</title>
      <link>https://drewdevault.com/2023/06/16/Mobile-linux-retrospective.html</link>
      <pubDate>Fri, 16 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/06/16/Mobile-linux-retrospective.html</guid>
      <description>&lt;p&gt;I have been tinkering with mobile Linux &amp;ndash; a phrase I will use here to describe&#xA;any Linux distribution other than Android running on a mobile device &amp;ndash; as my&#xA;daily driver since about 2019, when I first picked up the PinePhone. For about 3&#xA;years I have run mobile Linux as my daily driver on my phone, and as of a few&#xA;weeks ago, I&amp;rsquo;ve thrown in the towel and switched to Android.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to go to war with your employer</title>
      <link>https://drewdevault.com/2023/06/12/How-to-go-to-war.html</link>
      <pubDate>Mon, 12 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/06/12/How-to-go-to-war.html</guid>
      <description>&lt;p&gt;There is a power differential between you and your employer, but that doesn&amp;rsquo;t&#xA;mean you can&amp;rsquo;t improve your working conditions. Today I&amp;rsquo;d like to offer a little&#xA;bit of advice on how to frame your relationship with your employer in terms&#xA;which empower you and afford you more agency. I&amp;rsquo;m going to talk about the&#xA;typical working conditions of the average white-collar job in a neo-liberal&#xA;political environment where you are mostly happy to begin with and financially&#xA;stable enough to take risks, and I&amp;rsquo;m specifically going to talk about individual&#xA;action or the actions of small groups rather than large-scale collective action&#xA;(e.g. unions).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Burnout</title>
      <link>https://drewdevault.com/2023/05/01/2023-05-01-Burnout.html</link>
      <pubDate>Mon, 01 May 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/05/01/2023-05-01-Burnout.html</guid>
      <description>&lt;p&gt;It kind of crept up on me. One day, sitting at my workstation, I stopped typing,&#xA;stared blankly at the screen for a few seconds, and a switch flipped in my head.&lt;/p&gt;&#xA;&lt;p&gt;On the night of New Year&amp;rsquo;s Eve, my backpack was stolen from me on the train from&#xA;Berlin to Amsterdam, and with it about $2000 worth of equipment, clothes, and so&#xA;on. A portent for the year that was to come. I generally keep my private and&#xA;public lives carefully separated, but perhaps I will offer you a peek behind the&#xA;curtain today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Who should lead us?</title>
      <link>https://drewdevault.com/2023/04/24/2023-04-24-Who-leads-us.html</link>
      <pubDate>Mon, 24 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/04/24/2023-04-24-Who-leads-us.html</guid>
      <description>&lt;p&gt;Consider these two people, each captured in the midst of delivering a technical&#xA;talk.&lt;/p&gt;&#xA;&lt;div class=&#34;images&#34;&gt;&#xA;  &lt;img src=&#34;https://redacted.moe/f/c34dbc20.jpg&#34; alt=&#34;A picture of a young trans woman in a red dress&#34; /&gt;&#xA;  &lt;img src=&#34;https://redacted.moe/f/bd64d141.jpg&#34; alt=&#34;A picture of a middle-aged white man in a red shirt&#34; /&gt;&#xA;&lt;/div&gt;&#xA;&lt;style&gt;.images { display: flex; }&lt;/style&gt;&#xA;&lt;p&gt;Based on appearances alone, what do you think of them?&lt;/p&gt;&#xA;&lt;p&gt;The person on the left is a woman. She&amp;rsquo;s also pretty young, one might infer&#xA;something about her level of experience accordingly. I imagine that she has led&#xA;a much different life than I have, and may have a much different perspective,&#xA;worldview, identity, and politics than I. Does she complain about sexism and&#xA;discrimination in her work? Is she a feminist? Does she lean left or right on&#xA;the political spectrum?&lt;/p&gt;</description>
    </item>
    <item>
      <title>rc: a new shell for Unix</title>
      <link>https://drewdevault.com/2023/04/18/2023-04-18-A-new-shell-for-Unix.html</link>
      <pubDate>Tue, 18 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/04/18/2023-04-18-A-new-shell-for-Unix.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/rc&#34;&gt;rc&lt;/a&gt; is a Unix shell I&amp;rsquo;ve been working on over the past couple of weeks, though&#xA;it&amp;rsquo;s been in the design stages for a while longer than that. It&amp;rsquo;s not done or&#xA;ready for general use yet, but it is interesting, so let&amp;rsquo;s talk about it.&lt;/p&gt;&#xA;&lt;p&gt;As the name (which is subject to change) implies, rc is inspired by the Plan 9&#xA;&lt;a href=&#34;http://man.9front.org/1/rc&#34;&gt;rc&lt;/a&gt; shell. It&amp;rsquo;s not an implementation of Plan 9 rc, however: it departs&#xA;in many notable ways. I&amp;rsquo;ll assume most readers are more familiar with POSIX&#xA;shell or Bash and skip many of the direct comparisons to Plan 9. Also, though&#xA;most of the features work as described, the shell is a work-in-progress and some&#xA;of the design I&amp;rsquo;m going over today has not been implemented yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Free Software Foundation is dying</title>
      <link>https://drewdevault.com/2023/04/11/2023-04-11-The-FSF-is-dying.html</link>
      <pubDate>Tue, 11 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/04/11/2023-04-11-The-FSF-is-dying.html</guid>
      <description>&lt;p&gt;The Free Software Foundation is one of the longest-running missions in the&#xA;free software movement, effectively defining it. It provides a legal foundation&#xA;for the movement and organizes activism around software freedom. The GNU&#xA;project, closely related, has its own long story in our movement as the coding&#xA;arm of the Free Software Foundation, taking these principles and philosophy into&#xA;practice by developing free software; notably the GNU operating system that&#xA;famously rests atop GNU/Linux.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing Helios drivers in the Mercury driver environment</title>
      <link>https://drewdevault.com/2023/04/08/2023-04-08-Drivers-and-mercury.html</link>
      <pubDate>Sat, 08 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/04/08/2023-04-08-Drivers-and-mercury.html</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/helios&#34;&gt;Helios&lt;/a&gt; is a microkernel written in the &lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt; programming language and is&#xA;part of the larger &lt;a href=&#34;https://ares-os.org&#34;&gt;Ares&lt;/a&gt; operating system. You can watch&#xA;my FOSDEM 2023 talk introducing Helios &lt;a href=&#34;https://spacepub.space/w/wpKXfhqqr7FajEAf4B2Vc2&#34;&gt;on PeerTube&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s take a look at the new Mercury driver development environment for Helios.&lt;/p&gt;&#xA;&lt;p&gt;As you may remember from my FOSDEM talk, the Ares operating system is built out&#xA;of several layers which provide progressively higher-level environments for an&#xA;operating system. At the bottom is the Helios microkernel, and today we&amp;rsquo;re going&#xA;to talk about the second layer: the &lt;a href=&#34;https://git.sr.ht/~sircmpwn/mercury&#34;&gt;Mercury&lt;/a&gt; environment, which is used for&#xA;writing and running device drivers in userspace. Let&amp;rsquo;s take a look at a serial&#xA;driver written against Mercury and introduce some of the primitives used by&#xA;driver authors in the Mercury environment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When to comment that code</title>
      <link>https://drewdevault.com/2023/03/09/2023-03-09-Comment-or-no-comment.html</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/03/09/2023-03-09-Comment-or-no-comment.html</guid>
      <description>&lt;p&gt;My software tends to have a surprisingly low number of comments. One of my&#xA;projects, &lt;a href=&#34;https://git.sr.ht/~sircmpwn/scdoc&#34;&gt;scdoc&lt;/a&gt;, has 25 comments among its 1,133 lines of C code, or 2%,&#xA;compared to the average of 19%.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Naturally, I insist that my code is&#xA;well-written in spite of this divergence from the norm. Allow me to explain.&lt;/p&gt;&#xA;&lt;p&gt;The philosophy and implementation of code comments varies widely in the&#xA;industry, and some view comment density as a proxy for code quality.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; I&amp;rsquo;ll&#xA;state my views here, but will note that yours may differ and I find that&#xA;acceptable; I am not here to suggest that your strategy is wrong and I will&#xA;happily adopt it when I write a patch for your codebase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Porting Helios to aarch64 for my FOSDEM talk, part one</title>
      <link>https://drewdevault.com/2023/02/20/2023-02-20-Helios-aarch64.html</link>
      <pubDate>Mon, 20 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/02/20/2023-02-20-Helios-aarch64.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sr.ht/~sircmpwn/helios&#34;&gt;Helios&lt;/a&gt; is a microkernel written in the &lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt; programming language, and the&#xA;subject of a talk I did at FOSDEM earlier this month. You can watch the talk&#xA;here if you like:&lt;/p&gt;&#xA;&lt;iframe title=&#34;FOSDEM 2023: Introducing the Helios microkernel&#34; src=&#34;https://spacepub.space/videos/embed/f6435a6c-34e0-4602-ad5d-f791643111ab&#34; allowfullscreen=&#34;&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; width=&#34;560&#34; height=&#34;315&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;A while ago I promised someone that I would not do any talks on Helios until I&#xA;could present them from Helios itself, and at FOSDEM I made good on that&#xA;promise: my talk was presented from a Raspberry Pi 4 running Helios. The kernel&#xA;was originally designed for x86_64 (though we were careful to avoid painting&#xA;ourselves into any corners so that we could port it to more architectures later&#xA;on), and I initially planned to write an Intel HD Graphics driver so that I&#xA;could drive the projector from my laptop. But, after a few days spent trying to&#xA;comprehend the IHD manuals, I decided it would be &lt;em&gt;much&lt;/em&gt; easier to port the&#xA;entire system to aarch64 and write a driver for the much-simpler RPi GPU&#xA;instead. 42 days later the port was complete, and a week or so after that I&#xA;successfully presented the talk at FOSDEM. In a series of blog posts, I will&#xA;take a look at those 42 days of work and explain how the aarch64 port works.&#xA;Today&amp;rsquo;s post focuses on the bootloader.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Should private platforms engage in censorship?</title>
      <link>https://drewdevault.com/2023/01/30/2023-01-30-Should-private-platforms-engage-in-censorship.html</link>
      <pubDate>Mon, 30 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/01/30/2023-01-30-Should-private-platforms-engage-in-censorship.html</guid>
      <description>&lt;p&gt;Private service providers are entitled to do business with whom they please, or&#xA;not to. Occasionally, a platform will take advantage of this to deny service to&#xA;a particular entity on any number of grounds, often igniting a flood of debate&#xA;online regarding whether or not censorship in this form is just. Recently,&#xA;CloudFlare pulled the plug on a certain forum devoted to the coordinated&#xA;harassment of its victims. Earlier examples include the same service blocking a&#xA;far-right imageboard, or Namecheap cancelling service for a neo-Nazi news site.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My plans at FOSDEM: SourceHut, Hare, and Helios</title>
      <link>https://drewdevault.com/2023/01/24/2023-01-24-FOSDEM.html</link>
      <pubDate>Tue, 24 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/01/24/2023-01-24-FOSDEM.html</guid>
      <description>&lt;p&gt;FOSDEM is right around the corner, and finally in person after long years of&#xA;dealing with COVID. I&amp;rsquo;ll be there again this year, and I&amp;rsquo;m looking forward to&#xA;it! I have four slots on the schedule (wow! Thanks for arranging these, FOSDEM&#xA;team) and I&amp;rsquo;ll be talking about several projects. There is a quick lightning&#xA;talk on Saturday to introduce Helios and tease a full-length talk on Sunday, a&#xA;meetup for the Hare community, and a meetup for the SourceHut community. I hope&#xA;to see you there!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting a new focus for my blog</title>
      <link>https://drewdevault.com/2023/01/22/2023-01-22-A-new-focus.html</link>
      <pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2023/01/22/2023-01-22-A-new-focus.html</guid>
      <description>&lt;p&gt;Just shy of two months ago, I published &lt;a href=&#34;https://drewdevault.com/2022/12/01/I-shall-toil-quietly.html&#34;&gt;I shall toil at a reduced volume&lt;/a&gt;,&#xA;which addressed the fact that I&amp;rsquo;m not getting what I want from my blog anymore,&#xA;and I would be taking an indefinite break. Well, I am ready to resume my&#xA;writing, albeit with a different tone and focus than before.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Well, that was fast.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&amp;ndash; Everyone&lt;/p&gt;&#xA;&lt;p&gt;Since writing this, I have been considering what exactly the essential subject&#xA;of my dissatisfaction with my writing has been. I may have found the answer: I&#xA;lost sight of my goals. I got so used to writing that I would often think to&#xA;myself, &amp;ldquo;I want to write a blog post!&amp;rdquo;, then dig a topic out of my backlog&#xA;(which is 264 items long) and write something about it. This is not the way;&#xA;much of the effort expended on writing in this manner is not spent on the&#xA;subjects I care about most, or those which most urgently demand an expenditure&#xA;of words.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I shall toil at a reduced volume</title>
      <link>https://drewdevault.com/2022/12/01/I-shall-toil-quietly.html</link>
      <pubDate>Thu, 01 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/12/01/I-shall-toil-quietly.html</guid>
      <description>&lt;p&gt;Over the last nine years I have written 300,000 words for this blog on the&#xA;topics which are important to me. I am not certain that I have much left to say.&lt;/p&gt;&#xA;&lt;p&gt;I can keep revisiting these topics for years, each time adding a couple more&#xA;years of wisdom and improvements to my writing skills to present my arguments&#xA;more effectively. However, I am starting to feel diminishing returns from my&#xA;writing. It does not seem like my words are connecting with readers anymore.&#xA;And, though the returns on my work seem to be diminishing, the costs are not.&#xA;Each new article spurs less discussion than the last, but provides an unwavering&#xA;supply of spiteful responses.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Codegen in Hare v2</title>
      <link>https://drewdevault.com/2022/11/26/Hare-codegen-v2.html</link>
      <pubDate>Sat, 26 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/11/26/Hare-codegen-v2.html</guid>
      <description>&lt;p&gt;I spoke about code generation in Hare &lt;a href=&#34;https://drewdevault.com/2022/05/14/generating-ioctls.html&#34;&gt;back in May&lt;/a&gt; when I wrote a tool for&#xA;generating ioctl numbers. I wrote another code generator over the past few&#xA;weeks, and it seems like a good time to revisit the topic on my blog to showcase&#xA;another approach, and the improvements we&amp;rsquo;ve made for this use-case.&lt;/p&gt;&#xA;&lt;p&gt;In this case, I wanted to generate code to implement IPC (inter-process&#xA;communication) interfaces for my operating system. I have designed a &lt;abbr&#xA;title=&#34;domain-specific language&#34;&gt;DSL&lt;/abbr&gt; for describing these interfaces&#xA;— you can &lt;a href=&#34;https://git.sr.ht/~sircmpwn/ipcgen/tree/master/item/doc/grammar.txt&#34;&gt;read the grammar here&lt;/a&gt;. This calls for a parser, which is&#xA;another interesting topic for Hare, but I&amp;rsquo;ll set that aside for now and focus on&#xA;the code gen. Assume that, given a file like the following, we can parse it and&#xA;produce an AST:&lt;/p&gt;</description>
    </item>
    <item>
      <title>In praise of Plan 9</title>
      <link>https://drewdevault.com/2022/11/12/In-praise-of-Plan-9.html</link>
      <pubDate>Sat, 12 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/11/12/In-praise-of-Plan-9.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs&#34;&gt;Plan 9&lt;/a&gt; is an operating system designed by Bell Labs. It&amp;rsquo;s the OS they wrote&#xA;&lt;em&gt;after&lt;/em&gt; Unix, with the benefit of hindsight. It is the most interesting&#xA;operating system that you&amp;rsquo;ve never heard of, and, in my opinion, the best&#xA;operating system design to date. Even if you haven&amp;rsquo;t heard of Plan 9, the&#xA;designers of whatever OS you &lt;em&gt;do&lt;/em&gt; use have heard of it, and have incorporated&#xA;some of its ideas into your OS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Notes from kernel hacking in Hare, part 3: serial driver</title>
      <link>https://drewdevault.com/2022/10/27/Kernel-hacking-with-Hare-part-3.html</link>
      <pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/27/Kernel-hacking-with-Hare-part-3.html</guid>
      <description>&lt;p&gt;Today I would like to show you the implementation of the first userspace driver&#xA;for Helios: a simple serial driver. All of the code we&amp;rsquo;re going to look at today&#xA;runs in userspace, not in the kernel, so strictly speaking this should be &amp;ldquo;notes&#xA;from OS hacking in Hare&amp;rdquo;, but I won&amp;rsquo;t snitch if you don&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Note: In the &lt;a href=&#34;https://drewdevault.com/2022/10/02/Kernel-hacking-with-Hare-part-2.html&#34;&gt;previous entry&lt;/a&gt; to this series, I promised to cover the&#xA;userspace threading API in this post. I felt like covering this instead. Sorry!&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>TOTP for 2FA is incredibly easy to implement. So what&#39;s your excuse?</title>
      <link>https://drewdevault.com/2022/10/18/TOTP-is-easy.html</link>
      <pubDate>Tue, 18 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/18/TOTP-is-easy.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Time-based_one-time_password&#34;&gt;Time-based one-time passwords&lt;/a&gt; are one of the more secure approaches to 2FA&#xA;— certainly much better than SMS. And it&amp;rsquo;s much easier to implement than&#xA;SMS as well. The algorithm is as follows:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Divide the current Unix timestamp by 30&lt;/li&gt;&#xA;&lt;li&gt;Encode it as a 64-bit big endian integer&lt;/li&gt;&#xA;&lt;li&gt;Write the encoded bytes to a SHA-1 HMAC initialized with the TOTP shared key&lt;/li&gt;&#xA;&lt;li&gt;Let offs = hmac[-1] &amp;amp; 0xF&lt;/li&gt;&#xA;&lt;li&gt;Let hash = decode hmac[offs .. offs + 4] as a 32-bit big-endian integer&lt;/li&gt;&#xA;&lt;li&gt;Let code = (hash &amp;amp; 0x7FFFFFFF) % 1000000&lt;/li&gt;&#xA;&lt;li&gt;Compare this code with the user&amp;rsquo;s code&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll need a little dependency to generate QR codes with the &lt;a href=&#34;https://github.com/google/google-authenticator/wiki/Key-Uri-Format&#34;&gt;otpauth:// URL&#xA;scheme&lt;/a&gt;, a little UI to present the QR code and store the shared secret in&#xA;your database, and a quick update to your login flow, and then you&amp;rsquo;re good to&#xA;go.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, October 2022</title>
      <link>https://drewdevault.com/2022/10/15/Status-update-October-2022.html</link>
      <pubDate>Sat, 15 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/15/Status-update-October-2022.html</guid>
      <description>&lt;p&gt;After a few busy and stressful months, I decided to set aside October to rest.&#xA;Of course, for me, rest does not mean a cessation of programming, but rather a&#xA;shift in priorities towards more fun and experimental projects. Consequently, it&#xA;has been a great month for Helios!&lt;/p&gt;&#xA;&lt;p&gt;Hare upstream has enjoyed some minor improvements, such as from Pierre Curto&amp;rsquo;s&#xA;patch to support parsing IPv6 addresses with a port (e.g. &amp;ldquo;[::1]:80&amp;rdquo;) and Kirill&#xA;Primak&amp;rsquo;s improvements to the UTF-8 decoder. On the whole, improvements have been&#xA;conservative. However, queued up for integration once qbe upstream support is&#xA;merged is support for @threadlocal variables, which are useful for Helios and for&#xA;ABI compatibility with C. I also drafted up a proof-of-concept for @inline&#xA;functions, but it still needs work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In praise of ffmpeg</title>
      <link>https://drewdevault.com/2022/10/12/In-praise-of-ffmpeg.html</link>
      <pubDate>Wed, 12 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/12/In-praise-of-ffmpeg.html</guid>
      <description>&lt;p&gt;My last &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2022/09/02/2022-09-02-In-praise-of-qemu.html&#34;&gt;In praise of&lt;/a&gt;&amp;rdquo; article covered qemu, a project founded by Fabrice&#xA;Bellard, and today I want to take a look at another work by Bellard:&#xA;&lt;a href=&#34;https://ffmpeg.org&#34;&gt;ffmpeg&lt;/a&gt;. Bellard has a knack for building high-quality software which solves&#xA;a problem so well that every other solution becomes obsolete shortly thereafter,&#xA;and ffmpeg is no exception.&lt;/p&gt;&#xA;&lt;p&gt;ffmpeg has been described as the Swiss army knife of multimedia. It incorporates&#xA;hundreds of video, audio, and image decoders and encoders, muxers and demuxers,&#xA;filters and devices. It provides a CLI and a set of libraries for working with&#xA;its tools, and is the core component of many video and audio players as a result&#xA;(including my preferred multimedia player, &lt;a href=&#34;https://mpv.io&#34;&gt;mpv&lt;/a&gt;). If you want to do almost&#xA;anything with multimedia files — re-encode them, re-mux them, live stream&#xA;it, whatever — ffmpeg can handle it with ease.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Does Rust belong in the Linux kernel?</title>
      <link>https://drewdevault.com/2022/10/03/Does-Rust-belong-in-Linux.html</link>
      <pubDate>Mon, 03 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/03/Does-Rust-belong-in-Linux.html</guid>
      <description>&lt;p&gt;I am known to be a bit of a polemic when it comes to Rust. I will be forthright&#xA;with the fact that I don&amp;rsquo;t particularly care for Rust, and that my public&#xA;criticisms of it might set up many readers with a reluctance to endure yet&#xA;another Rust Hot Take from my blog. My answer to the question posed in the title&#xA;is, of course, &amp;ldquo;no&amp;rdquo;. However, let me assuage some of your fears by answering&#xA;a different question first: does Hare belong in the Linux kernel?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Notes from kernel hacking in Hare, part 2: multi-threading</title>
      <link>https://drewdevault.com/2022/10/02/Kernel-hacking-with-Hare-part-2.html</link>
      <pubDate>Sun, 02 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/10/02/Kernel-hacking-with-Hare-part-2.html</guid>
      <description>&lt;p&gt;I have long promised that Hare would not have multi-threading, and it seems that&#xA;I have broken that promise. However, I have remained true to the&#xA;not-invented-here approach which is typical of my style by introducing it only&#xA;after designing an entire kernel to implement it on top of.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;For some background, &lt;a href=&#34;https://git.sr.ht/~sircmpwn/helios&#34;&gt;Helios&lt;/a&gt; is a micro-kernel written in Hare. In addition&#xA;to the project, the &lt;a href=&#34;https://git.sr.ht/~sircmpwn/helios/tree/master/item/vulcan&#34;&gt;Vulcan&lt;/a&gt; system is a small userspace designed to test the&#xA;kernel.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The phrase &#34;open source&#34; (still) matters</title>
      <link>https://drewdevault.com/2022/09/16/Open-source-matters.html</link>
      <pubDate>Fri, 16 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/09/16/Open-source-matters.html</guid>
      <description>&lt;p&gt;In 1988, &amp;ldquo;Resin Identification Codes&amp;rdquo; were introduced by the plastic industry.&#xA;These look exactly like the recycling symbol ♺, which is not trademarked or&#xA;regulated, except that a number is enclosed within the triangle. These symbols&#xA;simply identify what kind of plastic was used. The vast majority of plastic is&#xA;non-recyclable, but has one of these symbols on it to suggest otherwise. This is&#xA;a deceptive business practice which exploits the consumer&amp;rsquo;s understanding of the&#xA;recycling symbol to trick them into buying more plastic products.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, September 2022</title>
      <link>https://drewdevault.com/2022/09/15/Status-update-September-2022.html</link>
      <pubDate>Thu, 15 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/09/15/Status-update-September-2022.html</guid>
      <description>&lt;p&gt;I have COVID-19 and I am halfway through my stockpile of tissues, so I&amp;rsquo;m gonna&#xA;keep this status update brief.&lt;/p&gt;&#xA;&lt;p&gt;In Hare news, I finally put the last pieces into place to make &lt;a href=&#34;https://harelang.org/blog/2022-09-06-cross-builds-with-hare/&#34;&gt;cross&#xA;compiling&lt;/a&gt; as easy as possible. Nothing else particularly world-shattering&#xA;going on here. I have a bunch of new stuff in my patch queue to review once I&amp;rsquo;m&#xA;feeling better, however, including bigint stuff — a big step towards&#xA;TLS support. Unrelatedly, TLS support seems to be progressing upstream in qbe.&#xA;(See what I did there?)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Notes from kernel hacking in Hare, part 1</title>
      <link>https://drewdevault.com/2022/09/07/Kernel-hacking-with-Hare-part-1.html</link>
      <pubDate>Wed, 07 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/09/07/Kernel-hacking-with-Hare-part-1.html</guid>
      <description>&lt;p&gt;One of the goals for the &lt;a href=&#34;https://harelang.org/&#34;&gt;Hare&lt;/a&gt; programming language is to be able to write&#xA;kernels, such as my &lt;a href=&#34;https://git.sr.ht/~sircmpwn/helios&#34;&gt;Helios&lt;/a&gt; project. Kernels are complex beasts which exist&#xA;in a somewhat unique problem space and have constraints that many userspace&#xA;programs are not accustomed to. To illustrate this, I&amp;rsquo;m going to highlight a&#xA;scenario where Hare&amp;rsquo;s low-level types and manual memory management approach&#xA;shines to enable a difficult use-case.&lt;/p&gt;&#xA;&lt;p&gt;Helios is a micro-kernel. During system initialization, its job is to load the&#xA;initial task into memory, prepare the initial set of kernel objects for its use,&#xA;provide it with information about the system, then jump to userspace and fuck&#xA;off until someone needs it again. I&amp;rsquo;m going to focus on the &amp;ldquo;providing&#xA;information&amp;rdquo; step here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In praise of qemu</title>
      <link>https://drewdevault.com/2022/09/02/2022-09-02-In-praise-of-qemu.html</link>
      <pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/09/02/2022-09-02-In-praise-of-qemu.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.qemu.org/&#34;&gt;qemu&lt;/a&gt; is another in a long line of great software started by &lt;a href=&#34;https://bellard.org/&#34;&gt;Fabrice&#xA;Bellard&lt;/a&gt;. It provides virtual machines for a wide variety of software&#xA;architectures. Combined with KVM, it forms the foundation of nearly all cloud&#xA;services, and it runs SourceHut in our self-hosted datacenters. Much like&#xA;Bellard&amp;rsquo;s ffmpeg revolutionized the multimedia software industry, qemu&#xA;revolutionized virtualisation.&lt;/p&gt;&#xA;&lt;p&gt;qemu comes with a large variety of studiously implemented virtual devices, from&#xA;standard real-world hardware like e1000 network interfaces to accelerated&#xA;virtual hardware like virtio drives. One can, with the right combination of&#xA;command line arguments, produce a virtual machine of essentially any&#xA;configuration, either for testing novel configurations or for running&#xA;production-ready virtual machines. Network adapters, mouse &amp;amp; keyboard, IDE or&#xA;SCSI or SATA drives, sound cards, graphics cards, serial ports — the&#xA;works. Lower level, often arch-specific features, such as AHCI devices, SMP,&#xA;NUMA, and so on, are also available and invaluable for testing any conceivable&#xA;system configurations. And these configurations &lt;em&gt;work&lt;/em&gt;, and work reliably.&lt;/p&gt;</description>
    </item>
    <item>
      <title>powerctl: A small case study in Hare for systems programming</title>
      <link>https://drewdevault.com/2022/08/28/powerctl-a-hare-case-study.html</link>
      <pubDate>Sun, 28 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/08/28/powerctl-a-hare-case-study.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sr.ht/~sircmpwn/powerctl/&#34;&gt;powerctl&lt;/a&gt; is a little weekend project I put&#xA;together to provide a simple tool for managing power states on Linux. I had&#xA;previously put my laptop into suspend with a basic &amp;ldquo;echo mem | doas tee&#xA;/sys/power/state&amp;rdquo;, but this leaves a lot to be desired. I have to use doas to&#xA;become root, and it&amp;rsquo;s annoying to enter my password — not to mention&#xA;difficult to use in a script or to attach to a key binding. powerctl is the&#xA;solution: a small 500-line Hare program which provides comprehensive support for&#xA;managing power states on Linux for non-privileged users.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A review of postmarketOS on the Xiaomi Poco F1</title>
      <link>https://drewdevault.com/2022/08/25/pmOS-on-xiaomi-poco-f1.html</link>
      <pubDate>Thu, 25 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/08/25/pmOS-on-xiaomi-poco-f1.html</guid>
      <description>&lt;p&gt;I have recently had cause to start looking into mainline Linux phones which fall&#xA;outside of the common range of grassroots phones like the PinePhone (which was&#xA;my daily driver for the past year). The &lt;a href=&#34;https://wiki.postmarketos.org/wiki/Devices&#34;&gt;postmarketOS wiki&lt;/a&gt; is a great place&#xA;to research candidate phones for this purpose, and the phone I landed on is the&#xA;&lt;a href=&#34;https://wiki.postmarketos.org/wiki/Xiaomi_Poco_F1_(xiaomi-beryllium)&#34;&gt;Xiaomi Poco F1&lt;/a&gt;, which I picked up on Amazon.nl (for ease of return in case&#xA;it didn&amp;rsquo;t work out) for 270 Euro. Phones of this nature have a wide range of&#xA;support from Linux distros like postmarketOS, from &amp;ldquo;not working at all&amp;rdquo; to&#xA;&amp;ldquo;mostly working&amp;rdquo;. The essential features I require in a daily driver phone are&#xA;(1) a working modem and telephony support, (2) mobile data, and (3) reasonably&#xA;good performance and battery life; plus of course some sane baseline&#xA;expectations like a working display and touchscreen driver.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PINE64 has let its community down</title>
      <link>https://drewdevault.com/2022/08/18/PINE64-let-us-down.html</link>
      <pubDate>Thu, 18 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/08/18/PINE64-let-us-down.html</guid>
      <description>&lt;p&gt;Context for this post:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/2022/01/18/Pine64s-weird-priorities.html&#34;&gt;Pine64 should re-evaluate their community priorities&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tuxphones.com/pine-formula/&#34;&gt;The Pine Formula&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.brixit.nl/why-i-left-pine64/&#34;&gt;Why I left PINE64&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.pine64.org/2022/08/18/a-response-to-martijns-blog/&#34;&gt;A response to Martijn’s blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I know that apologising and taking responsibility for your mistakes is&#xA;difficult. It seems especially difficult for commercial endeavours, which have&#xA;fostered a culture of cold disassociation from responsibility for their actions,&#xA;where admitting to wrongdoing is absolutely off the table. I disagree with this&#xA;culture, but I understand where it comes from, and I can empathise with those&#xA;who find themselves in the position of having to reconsider their actions in the&#xA;light of the harm they have done. It&amp;rsquo;s not easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, August 2022</title>
      <link>https://drewdevault.com/2022/08/16/Status-update-August-2022.html</link>
      <pubDate>Tue, 16 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/08/16/Status-update-August-2022.html</guid>
      <description>&lt;p&gt;It is a blessedly cool morning here in Amsterdam. I was busy moving house&#xA;earlier this month, so this update is a bit quieter than most.&lt;/p&gt;&#xA;&lt;p&gt;For a fun off-beat project this month, I started working on a &lt;a href=&#34;https://git.sr.ht/~sircmpwn/hdmg&#34;&gt;GameBoy&#xA;emulator&lt;/a&gt; written in Hare. No promises on when&#xA;it will be functional or how much I plan on working on it &amp;ndash; just doing it for&#xA;fun. In more serious Hare news, I have implemented Thread-Local Storage (TLS)&#xA;for qbe, our compiler backend. Hare&amp;rsquo;s standard library does not support&#xA;multi-threading, but I needed this for Helios, whose driver library does support&#xA;threads. It will also presumably be of use for cproc once it lands upstream.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I wish I could organize my thoughts</title>
      <link>https://drewdevault.com/2022/08/10/Organizing-my-thoughts.html</link>
      <pubDate>Wed, 10 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/08/10/Organizing-my-thoughts.html</guid>
      <description>&lt;p&gt;I keep a pen &amp;amp; notebook on my desk, which I make liberal use of to jot down my&#xA;thoughts. It works pretty well: ad-hoc todo lists, notes on problems I&amp;rsquo;m working&#xA;on, tables, flowcharts, etc. It has some limitations, though. Sharing anything&#xA;out of my notebook online is an awful pain in the ass. I can&amp;rsquo;t draw a straight&#xA;line to save my life, so tables and flowcharts are a challenge. No edits,&#xA;either, so lots of crossed-out words and redrawn or rewritten pages. And of&#xA;course, my handwriting sucks and I can type much more efficiently than I can&#xA;write. I wish this was a digital medium, but there are not any applications&#xA;available which can support the note-taking paradigm that I wish I could have.&#xA;What would that look like?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Conciseness</title>
      <link>https://drewdevault.com/2022/07/26/Conciseness.html</link>
      <pubDate>Tue, 26 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/26/Conciseness.html</guid>
      <description>&lt;p&gt;Conciseness is often considered a virtue among hackers and software engineers.&#xA;FOSS maintainers in particular generally prefer to keep bug reports, questions&#xA;on mailing lists, discussions in IRC channels, and so on, close to the point and&#xA;with minimal faff. It&amp;rsquo;s not considered impolite to skip the formalities —&#xA;quite the opposite. So: keep your faffery to a minimum. A quick &amp;ldquo;thanks!&amp;rdquo; at the&#xA;end of a discussion will generally suffice. And, when someone is being direct&#xA;with you, don&amp;rsquo;t interpret it as a slight: simply indulge in the blissful freedom&#xA;of a discussion absent of faffery.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Code review at the speed of email</title>
      <link>https://drewdevault.com/2022/07/25/Code-review-with-aerc.html</link>
      <pubDate>Mon, 25 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/25/Code-review-with-aerc.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a big proponent of the email workflow for patch submission and code review.&#xA;I have previously published some content (&lt;a href=&#34;https://spacepub.space/w/no6jnhHeUrt2E5ST168tRL&#34;&gt;How to use git.sr.ht&amp;rsquo;s send-email&#xA;feature&lt;/a&gt;, &lt;a href=&#34;https://spacepub.space/w/3JhBcvEYbminv8ji4k84gx&#34;&gt;Forks &amp;amp; pull requests vs email&lt;/a&gt;, &lt;a href=&#34;https://git-send-email.io&#34;&gt;git-send-email.io&lt;/a&gt;) which&#xA;demonstrates the contributor side of this workflow, but it&amp;rsquo;s nice to illustrate&#xA;the advantages of the maintainer workflow as well. For this purpose, I&amp;rsquo;ve&#xA;recorded a short video demonstrating how I manage code review as an&#xA;email-oriented maintainer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The past and future of open hardware</title>
      <link>https://drewdevault.com/2022/07/25/Open-hardware-graveyard.html</link>
      <pubDate>Mon, 25 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/25/Open-hardware-graveyard.html</guid>
      <description>&lt;p&gt;They say a sucker is born every day, and at least on the day of my birth, that&#xA;certainly may have been true. I have a bad habit of spending money on open&#xA;hardware projects that ultimately become vaporware or seriously under-deliver on&#xA;their expectations. In my ledger are EOMA68, DragonBox Pyra, the Jolla Tablet&#xA;— which always had significant non-free components — and the Mudita&#xA;Pure, though I did successfully receive a refund for the latter two.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, July 2022</title>
      <link>https://drewdevault.com/2022/07/18/Status-update-July-2022.html</link>
      <pubDate>Mon, 18 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/18/Status-update-July-2022.html</guid>
      <description>&lt;p&gt;Hello there! It&amp;rsquo;s been a hot July week in Amsterdam, and I expect hotter days&#xA;are still to come. I wish air conditioning was more popular in Europe, but alas.&#xA;This month of FOSS development enjoyed a lot of small improvements in a lot of&#xA;different projects.&lt;/p&gt;&#xA;&lt;p&gt;For Hare, I have introduced a number of improvements. I wrote a new standard&#xA;library module for string templates, &lt;a href=&#34;https://docs.harelang.org/strings/template&#34;&gt;strings::template&lt;/a&gt;, and a new third-party&#xA;library for working with pixel buffers, &lt;a href=&#34;https://git.sr.ht/~sircmpwn/pixbuf&#34;&gt;pixbuf&lt;/a&gt;. The templating is pretty&#xA;simple — as is typical for the standard library — but allows a&#xA;fairly wide range of formatting options. We&amp;rsquo;ll be extending this a little bit&#xA;more in the future, but it will not be a complete solution like you see in&#xA;things like Jinja2. Nevertheless, it makes some use-cases, like code generation,&#xA;a lot cleaner, without introducing a weighty or complex dependency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Fediverse can be pretty toxic</title>
      <link>https://drewdevault.com/2022/07/09/Fediverse-toxicity.html</link>
      <pubDate>Sat, 09 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/09/Fediverse-toxicity.html</guid>
      <description>&lt;p&gt;Mastodon, inspired by GNU social, together with Pleroma, form the most popular&#xA;components of what we know as the &amp;ldquo;Fediverse&amp;rdquo; today. All of them are, in&#xA;essence, federated, free software Twitter clones, interoperable with each other&#xA;via the ActivityPub protocol.&lt;/p&gt;&#xA;&lt;p&gt;In many respects, the Fediverse is a liberating force for good. Its federated&#xA;design distributes governance and costs across many independent entities,&#xA;something I view as a very strong design choice. Its moderation tools also do a&#xA;pretty good job of keeping neo-nazis out of your feeds and providing a&#xA;comfortable space to express yourself in, especially if your form of expression&#xA;is maligned by society. Large groups of Fediverse members have found in it a&#xA;home for self-expression which is denied to them elsewhere on the basis of their&#xA;sexuality, gender expression, politics, or other characteristics. It&amp;rsquo;s also&#xA;essentially entirely free from commercial propaganda.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Porting Doom to Helios</title>
      <link>https://drewdevault.com/2022/07/01/Porting-DOOM-to-Helios.html</link>
      <pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/07/01/Porting-DOOM-to-Helios.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Doom_(1993_video_game)&#34;&gt;Doom&lt;/a&gt; was an incredibly popular video game by Id software which, six years&#xA;following its release, was made &lt;a href=&#34;https://github.com/id-Software/DOOM&#34;&gt;open source&lt;/a&gt; under the GPLv2 license. Thanks to&#xA;this release, combined with the solid software design and lasting legacy of&#xA;backwards compatibility in C, Doom has been ported to countless platforms by&#xA;countless programmers. And I recently added myself to this number :)&lt;/p&gt;&#xA;&lt;p&gt;&lt;video src=&#34;https://redacted.moe/f/588e2fbd.webm&#34; controls muted autoplay&gt;&lt;/video&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m working on a new kernel called &lt;a href=&#34;https://sr.ht/~sircmpwn/helios&#34;&gt;Helios&lt;/a&gt;, and I thought that porting Doom&#xA;would present a good opportunity for proving the kernel design — you never&#xA;know if you have a good design until you try to use it for real. Doom is a good&#xA;target because it does not require much to get working, but it is a useful (and&#xA;fun) program to port. It calls for the following features:&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub Copilot and open source laundering</title>
      <link>https://drewdevault.com/2022/06/23/Copilot-GPL-washing.html</link>
      <pubDate>Thu, 23 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/06/23/Copilot-GPL-washing.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: I am the founder of a company which competes with GitHub. I am also&#xA;a long-time advocate for and developer of free and open source software, with a&#xA;broad understanding of free and open source software licensing and philosophy. I&#xA;will not name my company in this post to reduce the scope of my conflict of&#xA;interest.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;We have seen an explosion in machine learning in the past decade, alongside an&#xA;explosion in the popularity of free software. At the same time as FOSS has come&#xA;to dominate software and found its place in almost all new software products,&#xA;machine learning has increased dramatically in sophistication, facilitating more&#xA;natural interactions between humans and computers. However, despite their&#xA;parallel rise in computing, these two domains remain philosophically distant.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing the Himitsu keyring &amp; password manager for Unix</title>
      <link>https://drewdevault.com/2022/06/20/Himitsu.html</link>
      <pubDate>Mon, 20 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/06/20/Himitsu.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://himitsustore.org&#34;&gt;Himitsu&lt;/a&gt; is a new approach to storing secret information on Unix systems, such&#xA;as passwords or private keys, and I released version 0.1 this morning. It&amp;rsquo;s&#xA;available on &lt;a href=&#34;https://wiki.alpinelinux.org/wiki/Himitsu&#34;&gt;Alpine Linux&lt;/a&gt; community and the &lt;a href=&#34;https://wiki.archlinux.org/title/Himitsu&#34;&gt;Arch User Repository&lt;/a&gt;, with &lt;a href=&#34;https://repology.org/project/himitsu/versions&#34;&gt;more&#xA;distributions&lt;/a&gt; hopefully on the way soon.&lt;/p&gt;&#xA;&lt;p&gt;So, what is Himitsu and what makes it special? The following video introduces&#xA;the essential concepts and gives you an idea of what&amp;rsquo;s possible:&lt;/p&gt;&#xA;&lt;p&gt;&lt;video src=&#34;https://himitsustore.org/intro.mp4&#34; controls&gt;&lt;/video&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you prefer reading to watching, this blog post includes everything that&amp;rsquo;s in&#xA;the video.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, June 2022</title>
      <link>https://drewdevault.com/2022/06/15/Status-update-June-2022.html</link>
      <pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/06/15/Status-update-June-2022.html</guid>
      <description>&lt;p&gt;Hello again! I would like to open this post by acknowledging the response to my&#xA;earlier post, &amp;ldquo;bleh&amp;rdquo;. Since it was published, I have received several hundred&#xA;emails expressing support and kindness. I initially tried to provide these with&#xA;thoughtful replies, then shorter replies, then I had to stop replying at all,&#xA;but I did read every one. Thank you, everyone, for sending these. I appreciate&#xA;it very much, and it means a lot to me.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Helios microkernel</title>
      <link>https://drewdevault.com/2022/06/13/helios.html</link>
      <pubDate>Mon, 13 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/06/13/helios.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on a cool project lately that I&amp;rsquo;d like to introduce you to:&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/helios&#34;&gt;the Helios microkernel&lt;/a&gt;. Helios is written in &lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt; and currently&#xA;targets x86_64, and riscv64 and aarch64 are on the way. It&amp;rsquo;s very much a&#xA;work-in-progress: don&amp;rsquo;t expect to pick this up and start building anything with&#xA;it today.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/4d2d7b25.jpg&#34; alt=&#34;A picture of a ThinkPad running Helios, demonstrating userspace memory allocation&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Drawing some inspiration from seL4, Helios uses a capability-based design for&#xA;isolation and security. The kernel offers primitives for allocating physical&#xA;pages, mapping them into address spaces, and managing tasks, plus features like&#xA;platform-specific I/O (e.g. reading and writing x86 ports). The entire system is&#xA;written in Hare, plus some necessary assembly for the platform bits (e.g.&#xA;configuring the GDT or IDT).&lt;/p&gt;</description>
    </item>
    <item>
      <title>bleh</title>
      <link>https://drewdevault.com/2022/05/30/bleh.html</link>
      <pubDate>Mon, 30 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/30/bleh.html</guid>
      <description>&lt;p&gt;A few weeks ago, the maintainer of a project on SourceHut stepped down from&#xA;their work, citing harassment over using SourceHut as their platform of choice.&#xA;It was a difficult day when I heard about that.&lt;/p&gt;&#xA;&lt;p&gt;Over the past few weeks, I have been enduring a bit of a depressive episode.&#xA;It&amp;rsquo;s a complex issue rooted in several different problems, but I think a major&#xA;source of it is the seemingly constant deluge of hate I find myself at the&#xA;receiving end of online. I had to grow a thick skin a long time ago, but lately&#xA;it has not been thick enough. I am finding it increasingly difficult to keep up&#xA;with my work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google has been DDoSing SourceHut for over a year</title>
      <link>https://drewdevault.com/2022/05/25/Google-has-been-DDoSing-sourcehut.html</link>
      <pubDate>Wed, 25 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/25/Google-has-been-DDoSing-sourcehut.html</guid>
      <description>&lt;p&gt;Just now, I took a look at the HTTP logs on git.sr.ht. Of the past 100,000 HTTP&#xA;requests received by git.sr.ht (representing about 2½ hours of logs), 4,774 have&#xA;been requested by GoModuleProxy — 5% of all traffic. And their requests&#xA;are not cheap: every one is a complete git clone. They come in bursts, so every&#xA;few minutes we get a big spike from Go, along with a constant murmur of Go&#xA;traffic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, May 2022</title>
      <link>https://drewdevault.com/2022/05/16/Status-update-May-2022.html</link>
      <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/16/Status-update-May-2022.html</guid>
      <description>&lt;p&gt;This was an exciting month: &lt;a href=&#34;https://harelang.org&#34;&gt;the Hare programming language&lt;/a&gt; is a secret no more!&#xA;You can now &lt;a href=&#34;https://harelang.org/tutorials/introduction/&#34;&gt;try out&lt;/a&gt; the programming language I first teased &lt;a href=&#34;https://drewdevault.com/2021/03/19/A-new-systems-language.html&#34;&gt;over a year ago&lt;/a&gt;&#xA;and &lt;a href=&#34;mailto:sir@cmpwn.com&#34;&gt;tell me what you think&lt;/a&gt;. I hope you like it! I&amp;rsquo;m&#xA;quite pleased with it so far.&lt;/p&gt;&#xA;&lt;p&gt;One thing Hare has done is allow me to unshelve several projects which were&#xA;blocked pending the availability of a suitable language to write them in. I have&#xA;actually been working on several of these for a while now — and several&#xA;more are to come later — but I couldn&amp;rsquo;t share them thanks to Hare&amp;rsquo;s policy&#xA;of secrecy early in its development. Allow me to introduce you to a few&#xA;projects!&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Hare code generator for finding ioctl numbers</title>
      <link>https://drewdevault.com/2022/05/14/generating-ioctls.html</link>
      <pubDate>Sat, 14 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/14/generating-ioctls.html</guid>
      <description>&lt;p&gt;Modern Unix derivatives have this really bad idea called &lt;a href=&#34;https://pubs.opengroup.org/onlinepubs/9699919799/functions/ioctl.html&#34;&gt;ioctl&lt;/a&gt;. It&amp;rsquo;s a&#xA;function which performs arbitrary operations on a file descriptor. It is&#xA;essentially the kitchen sink of modern Unix derivatives, particularly Linux, in&#xA;which they act almost like a second set of extra syscalls. For example, to get&#xA;the size of the terminal window, you use an ioctl specific to TTY file&#xA;descriptors:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-hare&#34; data-lang=&#34;hare&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wsz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;winsize&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ioctl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TIOCGWINSZ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wsz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;errno&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EBADFD&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;errors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;invalid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ENOTTY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;errors&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unsupported&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;abort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Unexpected error from ioctl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ttysize&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wsz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ws_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;columns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wsz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ws_col&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code performs the ioctl syscall against the provided file descriptor &amp;ldquo;fd&amp;rdquo;,&#xA;using the &amp;ldquo;TIOCGWINSZ&amp;rdquo; operation, and setting the parameter to a pointer to a&#xA;winsize structure. There are thousands of ioctls provided by Linux, and each of&#xA;them is assigned a constant like TIOCGWINSZ (0x5413). Some constants, including&#xA;this one, are assigned somewhat arbitrarily. However, some are assigned with&#xA;some degree of structure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When will we learn?</title>
      <link>https://drewdevault.com/2022/05/12/Supply-chain-when-will-we-learn.html</link>
      <pubDate>Thu, 12 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/12/Supply-chain-when-will-we-learn.html</guid>
      <description>&lt;p&gt;Congratulations to Rust for its first (but not its last) supply-chain attack&#xA;this week! They join a growing club of broken-by-design package managers which&#xA;publish packages uploaded by vendors directly, with no review step, and ship&#xA;those packages directly to users with no further scrutiny.&lt;/p&gt;&#xA;&lt;h2 id=&#34;timeline-of-major-incidents-on-npmcratespypietc&#34;&gt;Timeline of major incidents on npm/Crates/PyPI/etc&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2022-05-10: Cargo: &lt;a href=&#34;https://blog.rust-lang.org/2022/05/10/malicious-crate-rustdecimal.html&#34;&gt;rustdecimal&lt;/a&gt; ships with malicious code&lt;/li&gt;&#xA;&lt;li&gt;2022-05-09: npm: &lt;a href=&#34;https://mastodon.social/@lrvick/108274062191145538&#34;&gt;foreach&lt;/a&gt; is taken over via an expired email domain&lt;/li&gt;&#xA;&lt;li&gt;2022-03-17: npm: &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/big-sabotage-famous-npm-package-deletes-files-to-protest-ukraine-war/&#34;&gt;node-ipc&lt;/a&gt; ships malware targeting Russia and Belarus&lt;/li&gt;&#xA;&lt;li&gt;2022-01-09: npm: &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/&#34;&gt;colors and faker&lt;/a&gt; are deliberately sabotaged&lt;/li&gt;&#xA;&lt;li&gt;2021-11-19: PyPI: &lt;a href=&#34;https://arstechnica.com/information-technology/2021/11/malware-downloaded-from-pypi-41000-times-was-surprisingly-stealthy/&#34;&gt;11 malicious packages&lt;/a&gt; discovered&lt;/li&gt;&#xA;&lt;li&gt;2021-11-04: npm: &lt;a href=&#34;https://github.com/advisories/GHSA-g2q5-5433-rhrf&#34;&gt;rc&lt;/a&gt; ships malicious code&lt;/li&gt;&#xA;&lt;li&gt;2021-11-04: npm: &lt;a href=&#34;https://www.bleepingcomputer.com/news/security/popular-coa-npm-library-hijacked-to-steal-user-passwords/&#34;&gt;coa&lt;/a&gt; steals your passwords&lt;/li&gt;&#xA;&lt;li&gt;2021-10-22: npm: &lt;a href=&#34;https://github.com/advisories/GHSA-pjwm-rvh2-c87w&#34;&gt;ua-parser-js&lt;/a&gt; ships malicious code&lt;/li&gt;&#xA;&lt;li&gt;2021-10-11: PyPI: &lt;a href=&#34;https://twitt.re/maximilianhils/status/1447525552370458625?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1447525552370458625%7Ctwgr%5E%7Ctwcon%5Es1_&amp;amp;ref_url=https%3A%2F%2Fwww.bleepingcomputer.com%2Fnews%2Fsecurity%2Fpypi-removes-mitmproxy2-over-code-execution-concerns%2F&#34;&gt;mitmproxy2&lt;/a&gt; typo-squats mitmproxy with an added RCE&lt;/li&gt;&#xA;&lt;li&gt;2021-07-30: PyPI: &lt;a href=&#34;https://arstechnica.com/gadgets/2021/07/malicious-pypi-packages-caught-stealing-developer-data-and-injecting-code/&#34;&gt;8 malicious packages&lt;/a&gt; discovered&lt;/li&gt;&#xA;&lt;li&gt;2020-12-16: RubyGems: &lt;a href=&#34;https://blog.sonatype.com/rubygems-laced-with-bitcoin-stealing-malware&#34;&gt;pretty_color&lt;/a&gt; (and one other) steals bitcoin from victims&lt;/li&gt;&#xA;&lt;li&gt;2020-09-11: npm: &lt;a href=&#34;https://github.com/advisories?query=https%3A%2F%2Fjs-metrics.com%2Fminjs.php&#34;&gt;dozens of packages&lt;/a&gt; steal your user&amp;rsquo;s credit card number&lt;/li&gt;&#xA;&lt;li&gt;2020-09-03: npm: &lt;a href=&#34;https://github.com/advisories/GHSA-vm6v-w6q2-mrrq&#34;&gt;bb-builder&lt;/a&gt; steals your password&lt;/li&gt;&#xA;&lt;li&gt;2020-04-16: RubyGems: &lt;a href=&#34;https://blog.reversinglabs.com/blog/mining-for-malicious-ruby-gems&#34;&gt;760+ malicious packages&lt;/a&gt; found stealing bitcoin&lt;/li&gt;&#xA;&lt;li&gt;2018-11-28: npm: &lt;a href=&#34;https://blog.npmjs.org/post/180565383195/details-about-the-event-stream-incident&#34;&gt;event-stream&lt;/a&gt; ships with a bitcoin theft kit&lt;/li&gt;&#xA;&lt;li&gt;2018-10-21: PyPI: &lt;a href=&#34;https://scribe.rip/medium.com/@bertusk/cryptocurrency-clipboard-hijacker-discovered-in-pypi-repository-b66b8a534a8&#34;&gt;colourama&lt;/a&gt; sneaks bitcoin addresses into your clipboard&lt;/li&gt;&#xA;&lt;li&gt;2018-10-13: PyPI: &lt;a href=&#34;https://scribe.rip/medium.com/@bertusk/detecting-cyber-attacks-in-the-python-package-index-pypi-61ab2b585c67&#34;&gt;more typo-squatting malware&lt;/a&gt; attempts various attacks&lt;/li&gt;&#xA;&lt;li&gt;2018-07-12: npm: &lt;a href=&#34;https://github.com/eslint/eslint-scope/issues/39&#34;&gt;eslint-scope&lt;/a&gt; ships with malicious code&lt;/li&gt;&#xA;&lt;li&gt;2018-07-08: AUR: &lt;a href=&#34;https://lists.archlinux.org/pipermail/aur-general/2018-July/034151.html&#34;&gt;acroread&lt;/a&gt; is compromised&lt;/li&gt;&#xA;&lt;li&gt;2018-05-11: Snap: &lt;a href=&#34;https://github.com/canonical-web-and-design/snapcraft.io/issues/651&#34;&gt;a 2048 clone&lt;/a&gt; ships a cryptocurrency miner&lt;/li&gt;&#xA;&lt;li&gt;2017-09-09: PyPI: &lt;a href=&#34;https://www.nbu.gov.sk/skcsirt-sa-20170909-pypi/&#34;&gt;typo-squatted packages&lt;/a&gt; published by researchers&lt;/li&gt;&#xA;&lt;li&gt;2016-07-22: npm: &lt;a href=&#34;https://www.infoworld.com/article/3047177/how-one-yanked-javascript-package-wreaked-havoc.html&#34;&gt;left-pad&lt;/a&gt; incident&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There are hundreds of additional examples. I had to leave many of them out.&#xA;&lt;a href=&#34;https://github.com/advisories?query=type%3Areviewed+malicious+package+severity%3Acritical&#34;&gt;Here&amp;rsquo;s a good source&lt;/a&gt;&#xA;if you want to find more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing an SSH agent in Hare</title>
      <link>https://drewdevault.com/2022/05/09/hare-ssh.html</link>
      <pubDate>Mon, 09 May 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/05/09/hare-ssh.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href=&#34;https://harelang.org/blog/2022-05-09-hare-ssh/&#34;&gt;the Hare blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In the process of writing an SSH agent for &lt;a href=&#34;https://sr.ht/~sircmpwn/himitsu&#34;&gt;Himitsu&lt;/a&gt;, I needed to implement many&#xA;SSH primitives from the ground up in Hare, now available via &lt;a href=&#34;https://sr.ht/~sircmpwn/hare-ssh&#34;&gt;hare-ssh&lt;/a&gt;. Today,&#xA;I&amp;rsquo;m going to show you how it works!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: This blog post deals with cryptography-related code. The code&#xA;you&amp;rsquo;re going to see today is incomplete, unaudited, and largely hasn&amp;rsquo;t even seen&#xA;any code review. Let me begin with a quote from the &amp;ldquo;crypto&amp;rdquo; module&amp;rsquo;s&#xA;documentation in the Hare standard library:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing the Hare programming language</title>
      <link>https://drewdevault.com/2022/04/25/Announcing-Hare.html</link>
      <pubDate>Mon, 25 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/04/25/Announcing-Hare.html</guid>
      <description>&lt;p&gt;The &amp;ldquo;secret programming language&amp;rdquo; I have been teasing for several months now is&#xA;finally here! It is called Hare, and you can read about it on the Hare blog:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://harelang.org/blog/2022-04-25-announcing-hare/&#34;&gt;https://harelang.org/blog/2022-04-25-announcing-hare/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Check it out!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, April 2022</title>
      <link>https://drewdevault.com/2022/04/15/Status-update-April-2022.html</link>
      <pubDate>Fri, 15 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/04/15/Status-update-April-2022.html</guid>
      <description>&lt;p&gt;This month marked my first time filing taxes in two countries, and I can assure&#xA;you it is the worst. I am now a single-issue voter in the US: stop taxing&#xA;expats! You can get some insight into the financials of SourceHut in the&#xA;recently-published &lt;a href=&#34;https://sourcehut.org/blog/2022-04-08-2021-financial-report/&#34;&gt;financial report&lt;/a&gt;. But let&amp;rsquo;s get right into the fun stuff:&#xA;free software development news.&lt;/p&gt;&#xA;&lt;p&gt;There was some slowdown from me this month thanks to all of the business and&#xA;financial crap I had to put up with, but I was able to get some cool stuff done&#xA;and many other contributors have been keeping things moving. I&amp;rsquo;ll start by&#xA;introducing a new/old project: Himitsu.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing git snail-mail</title>
      <link>https://drewdevault.com/2022/04/01/git-snail-mail.html</link>
      <pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/04/01/git-snail-mail.html</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve heard of git-over-email thanks to &lt;a href=&#34;https://git-send-email.io&#34;&gt;git send-email&lt;/a&gt; — now you&#xA;can enjoy &lt;em&gt;git snail-mail&lt;/em&gt;: a new tool making it easier than ever to print out&#xA;git commits on paper and mail them to your maintainers.&lt;/p&gt;&#xA;&lt;p&gt;Running &lt;code&gt;git snail-mail HEAD~2..&lt;/code&gt; prepares the last two commits for post and&#xA;sends them directly to the system&amp;rsquo;s default printer. Configuration options are&#xA;available for changing printer settings, paper size, and options for faxing or&#xA;printing envelopes automatically addressed to the maintainers based on address&#xA;info stored in your git config. Be sure to help the maintainers review your&#xA;work by including a return envelope and a stamp!&lt;/p&gt;</description>
    </item>
    <item>
      <title>It is important for free software to use free software infrastructure</title>
      <link>https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html</link>
      <pubDate>Tue, 29 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: I founded a project and a company that focuses on free software&#xA;infrastructure. I will elect not to name them in this post, and will only&#xA;recommend solutions I do not have a vested interest in.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Free and open source software (FOSS) projects need infrastructure. Somewhere to&#xA;host the code, to facilitate things like code review, end-user support, bug&#xA;tracking, marketing, and so on. A common example of this is the &amp;ldquo;forge&amp;rdquo;&#xA;platform: infrastructure which pitches itself as a one-stop shop for many of the&#xA;needs of FOSS projects in one place, such as code hosting and review, bug&#xA;tracking, discussions, and so on. Many projects will also reach for additional&#xA;platforms to provide other kinds of infrastructure: chat rooms, forums, social&#xA;media, and more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Netherlands so far</title>
      <link>https://drewdevault.com/2022/03/24/Netherlands-update.html</link>
      <pubDate>Thu, 24 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/24/Netherlands-update.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/2021/06/07/The-Netherlands.html&#34;&gt;I moved to Amsterdam in July 2021&lt;/a&gt;, and now that I&amp;rsquo;ve had some time&#xA;to settle in I thought I&amp;rsquo;d share my thoughts on how it&amp;rsquo;s been so far. In short:&#xA;I love it here!&lt;/p&gt;&#xA;&lt;p&gt;I did end up finding housing through the hacker community thanks to my earlier&#xA;post, which was a great blessing. I am renting an apartment from a member of the&#xA;&lt;a href=&#34;https://techinc.nl&#34;&gt;Techinc&lt;/a&gt; hacker space, which I have joined as a member myself. One of my&#xA;biggest fears was establishing a new social network here in the Netherlands, but&#xA;making friends here has been easy. Through this hacker space and through other&#xA;connections besides, I have quickly met many wonderful, friendly, and welcoming&#xA;people, and I have never felt like a stranger in a strange land. For this I am&#xA;very grateful.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, March 2022</title>
      <link>https://drewdevault.com/2022/03/15/Status-update-March-2022.html</link>
      <pubDate>Tue, 15 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/15/Status-update-March-2022.html</guid>
      <description>&lt;p&gt;Greetings! The weather is starting to warm up again, eh? I&amp;rsquo;m a bit disappointed&#xA;that we didn&amp;rsquo;t get any snow this winter. Yadda yadda insert intro text here.&#xA;Let&amp;rsquo;s get down to brass tacks. What&amp;rsquo;s new this month?&lt;/p&gt;&#xA;&lt;p&gt;I mainly focused on the programming language this month. I started writing a&#xA;kernel, which you can see a screenshot of below. This screenshot shows a&#xA;simulated page fault, demonstrating that we have a working interrupt handler,&#xA;and also shows something mildly interesting: backtraces. I need to incorporate&#xA;this approach into the standard library as well, so that we can dump useful&#xA;stack traces on assertion failures and such. I understand that someone is&#xA;working on DWARF support as well, so perhaps we&amp;rsquo;ll soon be able to translate&#xA;function name + offset into a file name and line number.&lt;/p&gt;</description>
    </item>
    <item>
      <title>It takes a village</title>
      <link>https://drewdevault.com/2022/03/14/It-takes-a-village.html</link>
      <pubDate>Mon, 14 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/14/It-takes-a-village.html</guid>
      <description>&lt;p&gt;As a prolific maintainer of several dozen FOSS projects, I&amp;rsquo;m often asked how I&#xA;can get so much done, being just one person. The answer is: I&amp;rsquo;m not just one&#xA;person. I have enjoyed the help of thousands of talented people who have&#xA;contributed to these works. Without them, none of the projects I work on would&#xA;be successful.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d like to take a moment to recognize and thank all of the people who have&#xA;participated in these endeavours. If you&amp;rsquo;ve enjoyed any of the projects I&amp;rsquo;ve&#xA;worked on, you owe thanks to some of these wonderful people. The following is an&#xA;incomplete list of authors who have contributed to one or more of the projects I&#xA;have started:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why am I building a programming language in private?</title>
      <link>https://drewdevault.com/2022/03/13/Why-am-I-working-in-private.html</link>
      <pubDate>Sun, 13 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/13/Why-am-I-working-in-private.html</guid>
      <description>&lt;p&gt;As many readers are aware, I have been working on designing and implementing a&#xA;systems programming language. This weekend, I&amp;rsquo;ve been writing a PNG file decoder&#xA;in it, and over the past week, I have been working on a simple kernel with it as&#xA;well. I&amp;rsquo;m very pleased with our progress so far — I recently remarked that&#xA;this language feels like the language I always wanted, and that&amp;rsquo;s mission&#xA;accomplished by any definition I care to consider.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open Source is defined by the OSI&#39;s Open Source Definition</title>
      <link>https://drewdevault.com/2022/03/01/Open-source-is-defined-by-the-OSD.html</link>
      <pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/03/01/Open-source-is-defined-by-the-OSD.html</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://opensource.org&#34;&gt;Open Source Initiative&lt;/a&gt; (OSI) publishes a document called the &lt;a href=&#34;https://opensource.org/osd&#34;&gt;Open Source&#xA;Definition&lt;/a&gt; (OSD), which defines the term &amp;ldquo;open source&amp;rdquo;. However, there is a&#xA;small minority of viewpoints within the software community which wishes that&#xA;this were not so. The most concerning among them are those who wish open source&#xA;was more commercially favorable to &lt;em&gt;themselves&lt;/em&gt;, and themselves alone, such as&#xA;companies like Elastic.&lt;/p&gt;&#xA;&lt;p&gt;I disagree with this perspective, and I&amp;rsquo;d like take a few minutes today to&#xA;explore several of the most common arguments in favor of this view, and explain&#xA;why I don&amp;rsquo;t agree with them. One of the most frustrating complications in this&#xA;discussion is the context of &lt;a href=&#34;https://en.wikipedia.org/wiki/Motivated_reasoning&#34;&gt;motivated reasoning&lt;/a&gt; (&lt;a href=&#34;https://xkcd.com/2167&#34;&gt;relevant xkcd&lt;/a&gt;): most&#xA;people arguing in favor of an unorthodox definition of &amp;ldquo;open source&amp;rdquo; have a&#xA;vested interest in their alternative view.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; This makes it difficult to&#xA;presume good faith. For example, say someone wants to portray their software as&#xA;open source even if it prohibits commercial use by third parties, which would&#xA;normally disqualify it as such. Their interpretation serves to re-enforce their&#xA;commercialization plans, providing a direct financial incentive not only for&#xA;them to promote this definition of &amp;ldquo;open source&amp;rdquo;, but also for them to convince&#xA;you that their interpretation is valid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Plaid is an evil nightmare product from Security Hell</title>
      <link>https://drewdevault.com/2022/02/19/Plaid-is-an-evil-nightmare-product.html</link>
      <pubDate>Sat, 19 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/02/19/Plaid-is-an-evil-nightmare-product.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://plaid.com&#34;&gt;Plaid&lt;/a&gt; is a business that has built a widget that can be embedded in any of&#xA;their customer&amp;rsquo;s websites which allows their customers to configure integrations&#xA;with a list of third-party service providers. To facilitate this, Plaid pops up&#xA;a widget on their customer&amp;rsquo;s domain which asks the end-user to &lt;em&gt;type in their&#xA;username and password&lt;/em&gt; for the third-party service provider. If necessary, they&#xA;will ask for a 2FA code. This is done without the third party&amp;rsquo;s permission,&#xA;presumably through a browser emulator and a provider-specific munging shim, and&#xA;collects the user&amp;rsquo;s credentials on a domain which is operated by neither the&#xA;third party nor by Plaid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, February 2022</title>
      <link>https://drewdevault.com/2022/02/15/Status-update-February-2022.html</link>
      <pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/02/15/Status-update-February-2022.html</guid>
      <description>&lt;p&gt;Hello once again! Another month of free software development goes by with lots&#xA;of progress in all respects.&lt;/p&gt;&#xA;&lt;p&gt;I will open with some news about &lt;a href=&#34;https://godocs.io&#34;&gt;godocs.io&lt;/a&gt;: version 1.0 of &lt;a href=&#34;https://sr.ht/~sircmpwn/godocs.io&#34;&gt;our fork of gddo&lt;/a&gt;&#xA;has been released! Big thanks to Adnan Maolood for his work on this. I&amp;rsquo;m very&#xA;pleased that, following our fork, we were not only able to provide continuity&#xA;for godoc.org, but also to simplify, refactor, and improve the underlying&#xA;software considerably. Check out &lt;a href=&#34;https://adnano.co/2022/02/10/godocs.io-one-year-later/&#34;&gt;Adnan&amp;rsquo;s blog post&lt;/a&gt; for more details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Framing accessibility in broader terms</title>
      <link>https://drewdevault.com/2022/02/13/Framing-accessibility-in-broader-terms.html</link>
      <pubDate>Sun, 13 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/02/13/Framing-accessibility-in-broader-terms.html</guid>
      <description>&lt;p&gt;Upon hearing the term &amp;ldquo;accessibility&amp;rdquo;, many developers call to mind the HTML&#xA;&lt;abbr title=&#34;Accessible Rich Internet Applications&#34;&gt;ARIA&lt;/abbr&gt; attributes and&#xA;little else. Those who have done some real accessibility work may think of the&#xA;&lt;abbr title=&#34;Web Content Accessibility Guidelines&#34;&gt;WCAG&lt;/abbr&gt; guidelines. Some&#xA;FOSS developers&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; may think of &lt;abbr title=&#34;Assistive Technology Service&#xA;Provider Interface&#34;&gt;AT-SPI&lt;/abbr&gt;. The typical user of these accessibility&#xA;features is, in the minds of many naive developers, a blind person. Perhaps for&#xA;those who have worked with WCAG, a slightly more sophisticated understanding of&#xA;the audience for accessibility tools may include users with a greater variety of&#xA;vision-related problems, motor impairments, or similar needs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free software licenses explained: MIT</title>
      <link>https://drewdevault.com/2022/02/07/Free-software-licenses-MIT.html</link>
      <pubDate>Mon, 07 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/02/07/Free-software-licenses-MIT.html</guid>
      <description>&lt;p&gt;This is the first in a series of posts I intend to write explaining how various&#xA;free and open source software licenses work, and what that means for you as a&#xA;user or developer of that software. Today we&amp;rsquo;ll look at the MIT license, also&#xA;sometimes referred to as the X11 or Expat license.&lt;/p&gt;&#xA;&lt;p&gt;The MIT license is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Both &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.en.html&#34;&gt;free software&lt;/a&gt; and &lt;a href=&#34;https://opensource.org/osd&#34;&gt;open source&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Permissive (and thus non-copyleft and non-viral)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This means that the license upholds the four essential freedoms of free software&#xA;(the right to run, copy, distribute, study, change and improve the software) and&#xA;all of the terms of the open source definition (largely the same). Further more,&#xA;it is classified on the permissive/copyleft spectrum as a permissive license,&#xA;meaning that it imposes relatively few obligations on the recipient of the&#xA;license.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing a MIME database in XXXX</title>
      <link>https://drewdevault.com/2022/01/28/Implementing-mime-in-xxxx.html</link>
      <pubDate>Fri, 28 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/01/28/Implementing-mime-in-xxxx.html</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a (redacted) post from the internal blog of a new systems&#xA;programming language we&amp;rsquo;re developing. The project is being kept under wraps&#xA;until we&amp;rsquo;re done with it, so for this post I&amp;rsquo;ll be calling it &lt;span&#xA;class=&#34;redacted&#34;&gt;XXXX&lt;/span&gt;. If you are interested in participating, &lt;a&#xA;href=&#34;mailto:sir@cmpwn.com&#34;&gt;send me an email&lt;/a&gt; with some details about your&#xA;background and I&amp;rsquo;ll get back to you.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;style&gt;&#xA;.redacted {&#xA;  color: black;&#xA;  background: black;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;p&gt;Recently, I have been working on implementing a parser for media types (commonly&#xA;called MIME types) and a database which maps media types to file extensions and&#xA;vice-versa. I thought this would be an interesting module to blog about, given&#xA;that it&amp;rsquo;s only about 250 lines of code, does something useful and interesting,&#xA;and demonstrates a few interesting &lt;span class=&#34;redacted&#34;&gt;xxxx&lt;/span&gt; concepts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pine64 should re-evaluate their community priorities</title>
      <link>https://drewdevault.com/2022/01/18/Pine64s-weird-priorities.html</link>
      <pubDate>Tue, 18 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/01/18/Pine64s-weird-priorities.html</guid>
      <description>&lt;p&gt;Pine64 has a really interesting idea: make cheap hardware with low margins, get&#xA;it into the hands of the FOSS community, and let them come up with the software.&#xA;No one has ever done this before, at least not on this scale, and it&amp;rsquo;s a really&#xA;neat idea! Pine64 is doing a lot to support the FOSS community bringing up its&#xA;hardware, but I&amp;rsquo;m afraid that I have to ask them to do a bit more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, January 2022</title>
      <link>https://drewdevault.com/2022/01/17/Status-update-January-2022.html</link>
      <pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/01/17/Status-update-January-2022.html</guid>
      <description>&lt;p&gt;Happy New Year! I had a lovely time in Amsterdam. No one had prepared me for the&#xA;(apparently infamous) fireworks culture of the Netherlands. I thought it was&#xA;really cool.&lt;/p&gt;&#xA;&lt;p&gt;Our programming language continues to improve apace. Our cryptography suite now&#xA;includes Argon2, Salsa20/XSalsa20, ChaCha20/XChaCha20, and Poly1305, and based&#xA;on these functions we have added libsodium-style high-level cryptographic&#xA;utilities for AEAD and key derivation, with stream encryption, message signing&#xA;and verification, and key exchange coming soon. We have also laid out the&#xA;priorities for future crypto work towards supporting TLS, and on the way we&#xA;expect to have ed25519/x25519 and Diffie-Hellman added soon. Perhaps enough to&#xA;implement an SSH client?&lt;/p&gt;</description>
    </item>
    <item>
      <title>The RISC-V experience</title>
      <link>https://drewdevault.com/2022/01/15/2022-01-15-The-RISC-V-experience.html</link>
      <pubDate>Sat, 15 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2022/01/15/2022-01-15-The-RISC-V-experience.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m writing to you from a Sway session on Alpine Linux, which is to say from a&#xA;setup quite similar to the one I usually write blog posts on, save for one&#xA;important factor: a RISC-V CPU.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll state upfront that what I&amp;rsquo;m using is not a very practical system. What I&amp;rsquo;m&#xA;going to describe is all of the impractical hacks and workarounds I have used to&#xA;build a &amp;ldquo;useful&amp;rdquo; RISC-V system on which I can mostly conduct my usual work. It&#xA;has been an interesting exercise, and it bodes well for the future of RISC-V,&#xA;but for all practical purposes the promise of RISC-V still lives in tomorrow,&#xA;not today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Breaking down a small language design proposal</title>
      <link>https://drewdevault.com/2021/12/30/Language-design-considerations.html</link>
      <pubDate>Thu, 30 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/30/Language-design-considerations.html</guid>
      <description>&lt;style&gt;&#xA;.redacted { background: black; color: black; }&#xA;&lt;/style&gt;&#xA;&lt;p&gt;We are developing a new systems programming language. The name is a secret, so&#xA;we&amp;rsquo;ll call it &lt;span class=&#34;redacted&#34;&gt;xxxx&lt;/span&gt; instead. In &lt;span&#xA;class=&#34;redacted&#34;&gt;xxxx&lt;/span&gt;, we have a general requirement that all variables&#xA;must be initialized. This is fine for the simple case, such as &amp;ldquo;let x: int =&#xA;10&amp;rdquo;. But, it does not always work well. Let&amp;rsquo;s say that you want to set aside a&#xA;large buffer for I/O:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please don&#39;t use Discord for FOSS projects</title>
      <link>https://drewdevault.com/2021/12/28/Dont-use-Discord-for-FOSS.html</link>
      <pubDate>Tue, 28 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/28/Dont-use-Discord-for-FOSS.html</guid>
      <description>&lt;p&gt;Six years ago, I wrote a post speaking out against the use of Slack for the&#xA;instant messaging needs of FOSS projects. In retrospect, this article is not&#xA;very good, and in the years since, another proprietary chat fad has stepped up&#xA;to bat: Discord. It&amp;rsquo;s time to revisit this discussion.&lt;/p&gt;&#xA;&lt;p&gt;In short, using Discord for your free software/open source (FOSS) software&#xA;project is a very bad idea. Free software matters — that&amp;rsquo;s why you&amp;rsquo;re&#xA;writing it, after all. Using Discord partitions your community on either side of&#xA;a walled garden, with one side that&amp;rsquo;s willing to use the proprietary Discord&#xA;client, and one side that isn&amp;rsquo;t. It sets up users who are passionate about free&#xA;software — i.e. your most passionate contributors or potential&#xA;contributors — as second-class citizens.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please use me as a resource</title>
      <link>https://drewdevault.com/2021/12/25/Use-me-as-a-resource.html</link>
      <pubDate>Sat, 25 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/25/Use-me-as-a-resource.html</guid>
      <description>&lt;p&gt;I write a lot of blog posts about my ideas,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; some of which are even good&#xA;ideas. Some of these ideas stick, and many readers have attempted to put them&#xA;into practice, taking on challenges like starting a business in FOSS or stepping&#xA;up to be leaders in their communities. It makes me proud to see the difference&#xA;you&amp;rsquo;re making, and I&amp;rsquo;m honored to have inspired many of you.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m sitting here on my soapbox shouting into the void, but I also want to work&#xA;with you one-on-one. Here are some things people have reached out to me for:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sustainable creativity in a world without copyright</title>
      <link>https://drewdevault.com/2021/12/23/Sustainable-creativity-post-copyright.html</link>
      <pubDate>Thu, 23 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/23/Sustainable-creativity-post-copyright.html</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t believe in copyright. I argue that we need to get rid of copyright, or&#xA;at least dramatically reform it. &lt;a href=&#34;https://drewdevault.com/2020/08/24/Alice-in-Wonderland.html&#34;&gt;The public domain has been stolen from us&lt;/a&gt;,&#xA;and I want it back. Everyone reading this post has grown up in a creative world&#xA;defined by capitalism, in which adapting and remixing works — a&#xA;fundamental part of the creative process — is illegal. The commons is&#xA;dead, and we suffer for it. But, this is all we&amp;rsquo;ve ever known. It can be&#xA;difficult to imagine a world without copyright.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On commercial forks of FOSS projects</title>
      <link>https://drewdevault.com/2021/12/18/Commercial-forks-of-FOSS-projects.html</link>
      <pubDate>Sat, 18 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/18/Commercial-forks-of-FOSS-projects.html</guid>
      <description>&lt;p&gt;The gaming and live streaming industry is a lucrative and rapidly growing&#xA;commercial sector with a unique understanding of copyright and intellectual&#xA;property, and many parties with conflicting interests and access to different&#xA;economic resources.&lt;/p&gt;&#xA;&lt;p&gt;The understanding of intellectual property among gamers and the companies which&#xA;serve them differs substantailly from that of free software, and literacy in the&#xA;values and philosophy of free software among this community is very low. It is&#xA;then of little surprise that we see abuse of free software from this community,&#xA;namely in the recent (and illegal) commercial forks of a popular FOSS streaming&#xA;platform called &lt;a href=&#34;https://obsproject.com&#34;&gt;OBS Studio&lt;/a&gt; by companies like TikTok.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, December 2021</title>
      <link>https://drewdevault.com/2021/12/15/Status-update-December-2021.html</link>
      <pubDate>Wed, 15 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/15/Status-update-December-2021.html</guid>
      <description>&lt;p&gt;Greetings! It has been a cold and wet month here in Amsterdam, much like the&#xA;rest of them, as another period of FOSS progress rolls on by. I have been taking&#xA;it a little bit easier this month, and may continue to take some time off in the&#xA;coming weeks, so I can have a bit of a rest for the holidays. However, I do&#xA;have some progress to report, so let&amp;rsquo;s get to it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Impressions of Linux Mint &amp; elementary OS</title>
      <link>https://drewdevault.com/2021/12/14/Linux-Mint-and-elementary-OS.html</link>
      <pubDate>Tue, 14 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/14/Linux-Mint-and-elementary-OS.html</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://drewdevault.com/2021/12/05/What-desktop-Linux-needs.html&#34;&gt;recent post&lt;/a&gt;, I spoke about some things that Linux distros need to do&#xA;better to accommodate end-users. I was reminded that there are some Linux distros&#xA;which are, at least to some extent, following my recommended playbook, and have&#xA;been re-evaluating two of them over the past couple of weeks: &lt;a href=&#34;https://linuxmint.com&#34;&gt;Linux Mint&lt;/a&gt; and&#xA;&lt;a href=&#34;https://elementary.io&#34;&gt;elementary OS&lt;/a&gt;. I installed these on one of my laptops and used it as my daily&#xA;driver for a day or two each.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How new Linux users can increase their odds of success</title>
      <link>https://drewdevault.com/2021/12/05/How-new-Linux-users-succeed.html</link>
      <pubDate>Sun, 05 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/05/How-new-Linux-users-succeed.html</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://redirect.invidious.io/channel/UCXuqSBlHAE6Xw-yeJA0Tunw&#34;&gt;Linus Tech Tips&lt;/a&gt; YouTube channel has been putting out a series of videos&#xA;called the &lt;a href=&#34;https://redirect.invidious.io/playlist?list=PL8mG-RkN2uTyhe6fxWpnsHv53Y1I-K3yu&#34;&gt;Switching to Linux Challenge&lt;/a&gt; that has been causing a bit of a stir&#xA;in the Linux community. I&amp;rsquo;ve been keeping an eye on these developments, and&#xA;thought it was a good time to weigh in with my thoughts. This article focuses on&#xA;how new Linux users can increase their odds for success — I have also&#xA;written a companion article, &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2021/12/05/What-desktop-Linux-needs.html&#34;&gt;What desktop Linux needs to succeed in the&#xA;mainstream&lt;/a&gt;&amp;rdquo;, which looks at the other side of the problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What desktop Linux needs to succeed in the mainstream</title>
      <link>https://drewdevault.com/2021/12/05/What-desktop-Linux-needs.html</link>
      <pubDate>Sun, 05 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/12/05/What-desktop-Linux-needs.html</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://redirect.invidious.io/channel/UCXuqSBlHAE6Xw-yeJA0Tunw&#34;&gt;Linus Tech Tips&lt;/a&gt; YouTube channel has been putting out a series of videos&#xA;called the &lt;a href=&#34;https://redirect.invidious.io/playlist?list=PL8mG-RkN2uTyhe6fxWpnsHv53Y1I-K3yu&#34;&gt;Switching to Linux Challenge&lt;/a&gt; that has been causing a bit of a stir&#xA;in the Linux community. I&amp;rsquo;ve been keeping an eye on these developments, and&#xA;thought it was a good time to weigh in with my thoughts. This article focuses on&#xA;what Linux needs to do better — I have also written a companion article,&#xA;&amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2021/12/05/How-new-Linux-users-succeed.html&#34;&gt;How new Linux users can increase their odds of success&lt;/a&gt;&amp;rdquo;, which looks at the&#xA;other side of the problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>postmarketOS revolutionizes smartphone hacking</title>
      <link>https://drewdevault.com/2021/11/26/postmarketos.html</link>
      <pubDate>Fri, 26 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/26/postmarketos.html</guid>
      <description>&lt;p&gt;I briefly mentioned &lt;a href=&#34;http://postmarketos.org/&#34;&gt;postmarketOS&lt;/a&gt; in &lt;a href=&#34;https://drewdevault.com/2019/12/18/PinePhone-review.html&#34;&gt;my Pinephone review&lt;/a&gt; two years ago,&#xA;but after getting my Dutch SIM card set up in my Pinephone and having another go&#xA;at using postmarketOS, I reckon they deserve special attention.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s first consider the kind of ecosystem into which postmarketOS emerged:&#xA;smartphone hacking in the XDA Forums era. This era was dominated by amateur&#xA;hackers working independently for personal prestige, with little to no regard&#xA;for the values of free software or collaboration. It was common to see&#xA;hacked-together binary images shipped behind adfly links in XDA forum threads in&#xA;blatant disregard of the GPL, with pages and pages of users asking redundant&#xA;questions and receiving poor answers to the endless problems caused by this&#xA;arrangement.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My philosophy for productive instant messaging</title>
      <link>https://drewdevault.com/2021/11/24/A-philosophy-for-instant-messaging.html</link>
      <pubDate>Wed, 24 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/24/A-philosophy-for-instant-messaging.html</guid>
      <description>&lt;p&gt;We use Internet Relay Chat (&lt;a href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;&gt;IRC&lt;/a&gt;) extensively at &lt;a href=&#34;https://sourcehut.org&#34;&gt;sourcehut&lt;/a&gt; for&#xA;real-time group chats and one-on-one messaging. The IRC protocol is quite&#xA;familiar to hackers, who have been using it since the late 80&amp;rsquo;s. As chat rooms&#xA;have become more and more popular among teams of both hackers and non-hackers in&#xA;recent years, I would like to offer a few bites of greybeard wisdom to those&#xA;trying to figure out how to effectively use instant messaging for their own&#xA;work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I will pay you cash to delete your npm module</title>
      <link>https://drewdevault.com/2021/11/16/Cash-for-leftpad.html</link>
      <pubDate>Tue, 16 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/16/Cash-for-leftpad.html</guid>
      <description>&lt;p&gt;npm&amp;rsquo;s culture presents a major problem for global software security. It&amp;rsquo;s&#xA;grossly irresponsible to let dependency trees grow to thousands of dependencies,&#xA;from vendors you may have never heard of and likely have not critically&#xA;evaluated, to solve trivial tasks which could have been done from scratch in&#xA;mere seconds, or, if properly considered, might not even be needed in the first&#xA;place.&lt;/p&gt;&#xA;&lt;p&gt;We need to figure out a way to curb this reckless behavior, but how?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: Please stop screwing over Linux distros</title>
      <link>https://drewdevault.com/2021/11/16/Python-stop-screwing-distros-over.html</link>
      <pubDate>Tue, 16 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/16/Python-stop-screwing-distros-over.html</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Linux distributions? Oh, those things we use to bootstrap our Docker&#xA;containers? Yeah, those are annoying. What were you complaining about again?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The Python community is obsessed with reinventing the wheel, over and over and&#xA;over and over and over and over again. distutils, setuptools, pip, pipenv, tox,&#xA;flit, conda, poetry, virtualenv, requirements.txt, setup.py, setup.cfg,&#xA;pyproject.toml&amp;hellip; I honestly can&amp;rsquo;t even list all of the things you have to deal&#xA;with. It&amp;rsquo;s a disaster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, November 2021</title>
      <link>https://drewdevault.com/2021/11/15/Status-update-November-2021.html</link>
      <pubDate>Mon, 15 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/15/Status-update-November-2021.html</guid>
      <description>&lt;p&gt;Hello again! Following a spooky month, we find ourselves again considering the&#xA;progress of our eternal march towards FOSS world domination.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll first address SourceHut briefly: today is the third anniversary of the&#xA;opening of the public alpha! I have written &lt;a href=&#34;https://sourcehut.org/blog/2021-11-15-sourcehuts-third-year/&#34;&gt;a longer post for sourcehut.org&lt;/a&gt;&#xA;which I encourage you to read for all of the details.&lt;/p&gt;&#xA;&lt;p&gt;In other news, we have decided to delay the release of our new programming&#xA;language, perhaps by as much as a year. We were aiming for February &amp;lsquo;22, but&#xA;slow progress on some key areas such as cryptography and the self-hosting&#xA;compiler, plus the looming necessity of the full-scale acceptance testing of the&#xA;whole language and standard library, compound to make us unsure about meeting&#xA;the original release plans. However, progress is slow but moving. We have&#xA;incorporated the first parts of AES support in our cryptography library, and&#xA;ported the language to FreeBSD. A good start on date/time support has been under&#xA;development and I&amp;rsquo;m pretty optimistic about the API design we&amp;rsquo;ve come up with.&#xA;Things are looking good, but it will take longer than expected.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Breaking down Apollo Federation&#39;s anti-FOSS corporate gaslighting</title>
      <link>https://drewdevault.com/2021/11/05/Apollo-federation-2-gaslighting.html</link>
      <pubDate>Fri, 05 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/11/05/Apollo-federation-2-gaslighting.html</guid>
      <description>&lt;p&gt;Gather around, my friends, for there is another company which thinks we are&#xA;stupid and we enjoy having our faces spat in. &lt;a href=&#34;https://www.apollographql.com/blog/announcement/moving-apollo-federation-2-to-the-elastic-license-v2/&#34;&gt;Apollo Federation&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; has&#xA;announced that they will switch to a non-free license. Let&amp;rsquo;s find out just how&#xA;much the Elastic license really is going to &amp;ldquo;protect the community&amp;rdquo; like they&#xA;want you to believe.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start by asking ourselves, objectively, what practical changes can we&#xA;expect from a switch from the &lt;a href=&#34;https://mit-license.org&#34;&gt;MIT license&lt;/a&gt; to the &lt;a href=&#34;https://www.elastic.co/licensing/elastic-license&#34;&gt;Elastic&#xA;License&lt;/a&gt;? Both licenses are pretty short, so I recommend quickly&#xA;reading them yourself before we move on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub stale bot considered harmful</title>
      <link>https://drewdevault.com/2021/10/26/stalebot.html</link>
      <pubDate>Tue, 26 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/10/26/stalebot.html</guid>
      <description>&lt;p&gt;Disclaimer: I work for a GitHub competitor.&lt;/p&gt;&#xA;&lt;p&gt;One of GitHub&amp;rsquo;s &amp;ldquo;recommended&amp;rdquo; marketplace features is the &amp;ldquo;stale&amp;rdquo; bot. The&#xA;purpose of this bot is to automatically close GitHub issues after a period of&#xA;inactivity, 60 days by default. You have probably encountered it yourself in the&#xA;course of your work.&lt;/p&gt;&#xA;&lt;p&gt;This is a terrible, horrible, no good, very bad idea.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/e2f0d39c.png&#34; alt=&#34;A screenshot of an interaction with this bot&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not sure what motivates maintainers to install this on their repository,&#xA;other than the fact that GitHub recommends it to them. Perhaps it&amp;rsquo;s motivated by&#xA;a feeling of shame for having a lot of unanswered issues? If so, this might stem&#xA;from a misunderstanding of the responsibilities a maintainer has to their&#xA;project. You are not obligated to respond to every issue, implement every&#xA;feature request, or fix every bug, or even acknowledge them in any way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How SmarterEveryDay&#39;s 4privacy can, and cannot, meet its goals</title>
      <link>https://drewdevault.com/2021/10/22/Smarter-every-day-and-4privacy.html</link>
      <pubDate>Fri, 22 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/10/22/Smarter-every-day-and-4privacy.html</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t particularly find myself to be a fan of the SmarterEveryDay YouTube&#xA;channel, simply for being outside of Destin&amp;rsquo;s target audience most of the time.&#xA;I understand that Destin, the channel&amp;rsquo;s host, is a friendly person and a great&#xA;asset to his peers, and that he generally strives to do good. When I saw that he&#xA;was involved in a Kickstarter to develop a privacy product, it piqued my&#xA;interest. As a privacy advocate and jaded software engineer, I set out to find&#xA;out what it&amp;rsquo;s all about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software developers have stopped caring about reliability</title>
      <link>https://drewdevault.com/2021/10/17/Reliability.html</link>
      <pubDate>Sun, 17 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/10/17/Reliability.html</guid>
      <description>&lt;p&gt;Of all the principles of software engineering which has fallen by the wayside in&#xA;the modern &amp;ldquo;move fast and break things&amp;rdquo; mentality of &lt;del&gt;assholes&lt;/del&gt; modern&#xA;software developers, reliability is perhaps the most neglected, along with its&#xA;cousin, robustness. Almost all software that users encounter in $CURRENTYEAR is&#xA;straight-up broken, and often badly.&lt;/p&gt;&#xA;&lt;p&gt;Honestly, it&amp;rsquo;s pretty embarassing. Consider all of the stupid little things&#xA;you&amp;rsquo;ve learned how to do in order to work around broken software. Often&#xA;something as simple as refreshing the page or rebooting the program to knock&#xA;some sense back into it — most users can handle that. There are much&#xA;stupider problems, however, and they are &lt;em&gt;everywhere&lt;/em&gt;. Every morning, I boot,&#xA;then immediately hard-reboot, my workstation, because it seems to jigger my&#xA;monitors into waking up properly to do their job. On many occasions, I have used&#xA;the browser dev tools to inspect a broken web page to figure out how to make it&#xA;do the thing I want to do, usually something complicated like submitting a&#xA;form properly (a solved problem since 1993).&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, October 2021</title>
      <link>https://drewdevault.com/2021/10/15/Status-update-October-2021.html</link>
      <pubDate>Fri, 15 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/10/15/Status-update-October-2021.html</guid>
      <description>&lt;p&gt;On this dreary morning here in Amsterdam, I&amp;rsquo;ve made my cup of coffee and&#xA;snuggled my cat, and so I&amp;rsquo;m pleased to share some FOSS news with you. Some cool&#xA;news today! We&amp;rsquo;re preparing for a new core product launch at sr.ht, cool updates&#xA;for our secret programming language, plus news for visurf.&lt;/p&gt;&#xA;&lt;p&gt;Simon Ser has been hard at work on expanding his &lt;a href=&#34;https://sr.ht/~emersion/soju/&#34;&gt;soju&lt;/a&gt; and &lt;a href=&#34;https://sr.ht/~emersion/gamja/&#34;&gt;gamja&lt;/a&gt;&#xA;projects for the purpose of creating a new core sourcehut product: chat.sr.ht.&#xA;We&amp;rsquo;re rolling this out in a private beta at first, to seek a fuller&#xA;understanding of the system&amp;rsquo;s performance characteristics, to make sure&#xA;everything is well-tested and reliable, and to make plans for scaling,&#xA;maintenance, and general availability. In short, chat.sr.ht is a hosted IRC&#xA;bouncer which is being made available to all paid sr.ht users, and a kind of&#xA;webchat gateway which will be offered to unpaid and anonymous users. I&amp;rsquo;m pretty&#xA;excited about it, and looking forward to posting a more detailed announcement in&#xA;a couple of weeks. In other sourcehut news, work on GraphQL continues, with&#xA;paste.sr.ht landing and todo.sr.ht&amp;rsquo;s writable API in progress.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How reflection works in ****</title>
      <link>https://drewdevault.com/2021/10/05/Reflection.html</link>
      <pubDate>Tue, 05 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/10/05/Reflection.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: this is a redacted copy of a blog post published on the internal&#xA;development blog of a new systems programming language. The name of the project&#xA;and further details are deliberately being kept in confidence until the initial&#xA;release. You may be able to find it if you look hard enough — you have my&#xA;thanks in advance for keeping it to yourself. For more information, see &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2021/03/19/A-new-systems-language.html&#34;&gt;We are&#xA;building a new systems programming language&lt;/a&gt;&amp;rdquo;.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developers: Let distros do their job</title>
      <link>https://drewdevault.com/2021/09/27/Let-distros-do-their-job.html</link>
      <pubDate>Mon, 27 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/09/27/Let-distros-do-their-job.html</guid>
      <description>&lt;p&gt;I wrote a post some time ago titled &lt;a href=&#34;https://drewdevault.com/2019/12/09/Developers-shouldnt-distribute.html&#34;&gt;Developers shouldn&amp;rsquo;t distribute their own&#xA;software&lt;/a&gt;, and after a discussion on the sr.ht IRC channel today, the topic&#xA;seems worthy of renewed mention. Let&amp;rsquo;s start with this: what exactly is a&#xA;software distribution, anyway?&lt;/p&gt;&#xA;&lt;p&gt;I use &amp;ldquo;software distribution&amp;rdquo; here, rather than &amp;ldquo;Linux distribution&amp;rdquo;, because it&#xA;generalizes better. For example, all of the major BSD systems, plus Illumos and&#xA;others besides, are software distributions, but don&amp;rsquo;t involve Linux. Some differ&#xA;further still, sitting on top of another operating system, such as Nix or&#xA;pkgsrc. What these systems all have in common is that they concern themselves&#xA;with the &lt;em&gt;distribution&lt;/em&gt; of &lt;em&gt;software&lt;/em&gt;, and thus are a &lt;em&gt;software distribution&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nitter and other Internet reclamation projects</title>
      <link>https://drewdevault.com/2021/09/23/Nitter-and-other-internet-reclamation-projects.html</link>
      <pubDate>Thu, 23 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/09/23/Nitter-and-other-internet-reclamation-projects.html</guid>
      <description>&lt;p&gt;The world wide web has become an annoying, ultra-commercialized space. Many&#xA;websites today are prioritizing the interests of the company behind the domain,&#xA;at the expense of the user&amp;rsquo;s experience and well-being. This has been a&#xA;frustrating problem for several years, but lately there&amp;rsquo;s been a heartwarming&#xA;trend of users fighting back against the corporate web and stepping up to help&#xA;and serve each other&amp;rsquo;s needs in spite of them, through what I&amp;rsquo;ve come to think&#xA;of as Internet reclamation projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, September 2021</title>
      <link>https://drewdevault.com/2021/09/15/Status-update-September-2021.html</link>
      <pubDate>Wed, 15 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/09/15/Status-update-September-2021.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s a quiet, foggy morning here in Amsterdam, and here with my fresh mug of&#xA;coffee and a cuddly cat in my lap, I&amp;rsquo;d like to share the latest news on my FOSS&#xA;efforts with you. Grab yourself a warm drink and a cat of your own and let&amp;rsquo;s get&#xA;started.&lt;/p&gt;&#xA;&lt;p&gt;First, a new project: &lt;a href=&#34;https://sr.ht/~sircmpwn/visurf&#34;&gt;visurf&lt;/a&gt;. I &lt;a href=&#34;https://drewdevault.com/2021/09/11/visurf-announcement.html&#34;&gt;announced this&lt;/a&gt; a few days ago, but the&#xA;short of it is that I am building a minimal Wayland-only frontend for the&#xA;&lt;a href=&#34;http://www.netsurf-browser.org&#34;&gt;NetSurf&lt;/a&gt; web browser which uses vi-inspired keybindings. Since the&#xA;announcement there has been some good progress: touch support, nsvirc, tabs, key&#xA;repeat, and so on. Some notable medium-to-large efforts ahead of us include a&#xA;context menu on right click, command completion and history, kinetic scrolling&#xA;via touch, pinch-to-zoom, clipboard support, and a readability mode. Please&#xA;help! It&amp;rsquo;s pretty easy to get involved: join the IRC channel at #netsurf on&#xA;libera.chat and ask for something to do.&lt;/p&gt;</description>
    </item>
    <item>
      <title>visurf, a web browser based on NetSurf</title>
      <link>https://drewdevault.com/2021/09/11/visurf-announcement.html</link>
      <pubDate>Sat, 11 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/09/11/visurf-announcement.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve started a new side project that I would like to share with you:&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/visurf&#34;&gt;visurf&lt;/a&gt;. visurf, or nsvi, is a &lt;a href=&#34;https://www.netsurf-browser.org&#34;&gt;NetSurf&lt;/a&gt; frontend which provides&#xA;vi-inspired key bindings and a lightweight Wayland UI with few dependencies.&#xA;It&amp;rsquo;s still a work-in-progress, and is not ready for general use yet. I&amp;rsquo;m&#xA;letting you know about it today in case you find it interesting and want to&#xA;help.&lt;/p&gt;&#xA;&lt;p&gt;NetSurf is a project which has been on my radar for some time. It is a small web&#xA;browser engine, developed in C independently of the lineage of WebKit and Gecko&#xA;which defines the modern web today. It mostly supports HTML4 and CSS2, plus only&#xA;a small amount of HTML5 and CSS3. Its JavaScript support, while present, is very&#xA;limited. Given the &lt;a href=&#34;https://drewdevault.com/2020/03/18/Reckless-limitless-scope.html&#34;&gt;epidemic of complexity in the modern web&lt;/a&gt;, I am pleased&#xA;by the idea of a small browser, more limited in scope, which perhaps requires&#xA;the cooperation of like-minded websites to support a pleasant experience.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, August 2021</title>
      <link>https://drewdevault.com/2021/08/15/Status-update-August-2021.html</link>
      <pubDate>Sun, 15 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/08/15/Status-update-August-2021.html</guid>
      <description>&lt;p&gt;Greetings! It&amp;rsquo;s shaping up to be a beautiful day here in Amsterdam, and I have&#xA;found the city much to my liking so far. If you&amp;rsquo;re in Amsterdam and want to grab&#xA;a beer sometime, send me an email! I&amp;rsquo;ve been making a lot of new friends here.&#xA;Meanwhile, I&amp;rsquo;ve also enjoyed a noticable increase in my productivity levels.&#xA;Let&amp;rsquo;s go over the month&amp;rsquo;s accomplishments.&lt;/p&gt;&#xA;&lt;p&gt;First, I have spent most of my time on the programming language project. I&#xA;mentioned in the last update that we broke ground on a codegen rewrite, and&#xA;yesterday all of our tests finally passed and I merged it. The new design is&#xA;much better, and we should be able to simplify it even further still when we&#xA;write the &lt;abbr title=&#34;The &#39;hosted&#39; compiler is one that &#39;hosts&#39; itself: it&#39;s written in our new programming language and compiles itself. This is contrasted with the &#39;bootstrap&#39; compiler, which is written in C and is used for bootstrapping the hosted toolchain from scratch.&#34;&gt;hosted compiler&lt;/abbr&gt;&#xA;in the near future. This will also give us a better basis for a small number of&#xA;experiments we&amp;rsquo;d like to do before finalizing the language design. Some other&#xA;improvements include fleshing out our floating point math support library, a&#xA;base64 module, a poll module, and parallel DNS resolution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips for debugging your new programming language</title>
      <link>https://drewdevault.com/2021/08/11/Debugging-your-new-PL.html</link>
      <pubDate>Wed, 11 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/08/11/Debugging-your-new-PL.html</guid>
      <description>&lt;p&gt;Say you&amp;rsquo;re building a new (compiled) programming language from scratch. You&amp;rsquo;ll&#xA;inevitably have to debug programs written in it, and worse, many of these&#xA;problems will lead you into deep magic, as you uncover problems with your&#xA;compiler or runtime. And as you find yourself diving into the arcane arts, your&#xA;tools may be painfully lacking: how do you debug code written in a language for&#xA;which debuggers and other tooling simply has not been written yet?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Police to begin regular, warrant-free searches of homes for child abuse material</title>
      <link>https://drewdevault.com/2021/08/10/Apple-CSAM-scanning.html</link>
      <pubDate>Tue, 10 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/08/10/Apple-CSAM-scanning.html</guid>
      <description>&lt;p&gt;The Federal Bureau of Investigations announced a new initiative today to combat&#xA;the proliferation of child sexual abuse materials (CSAM) in the United States.&#xA;Starting next year, police will be conducting regular searches of US homes, as&#xA;often as once or twice per week per home, to find child sexual abuse materials.&#xA;This initiative will bring more child abusers to justice and help abuse victims&#xA;to find solace in the knowledge that records of their abuse are not being shared&#xA;in perpetuity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>proxy.golang.org allows many Go packages to be silently broken</title>
      <link>https://drewdevault.com/2021/08/06/goproxy-breaks-go.html</link>
      <pubDate>Fri, 06 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/08/06/goproxy-breaks-go.html</guid>
      <description>&lt;p&gt;GOPROXY (or &lt;a href=&#34;https://proxy.golang.org&#34;&gt;proxy.golang.org&lt;/a&gt;) is a service through which all &amp;ldquo;go get&amp;rdquo;&#xA;commands (and other module downloads) are routed. It may speed up some&#xA;operations by providing a cache, and it publishes checksums and an &amp;ldquo;index&amp;rdquo; of&#xA;all Go packages; but this is done at the cost of sending details of all of your&#xA;module downloads to Google and imposing extra steps when using Go packages from&#xA;an intranet.&lt;/p&gt;&#xA;&lt;p&gt;This cache never expires, which can cause some problems: you can keep fetching a&#xA;module from proxy.golang.org long after the upstream version has disappeared.&#xA;The upstream author probably had a good reason for removing a version! Because I&#xA;set &lt;code&gt;GOPROXY=direct&lt;/code&gt; in my environment,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; which bypasses the proxy, I&amp;rsquo;ve been&#xA;made aware of a great number of Go packages which have broken dependencies and&#xA;are none the wiser. They generally can&amp;rsquo;t reproduce the problem without&#xA;&lt;code&gt;GOPROXY=direct&lt;/code&gt;, which can make it a challenge to rouse up the enthusiasm for&#xA;upstream to actually fix the issue. Caching modules forever can encourage&#xA;bitrot.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In praise of PostgreSQL</title>
      <link>https://drewdevault.com/2021/08/05/In-praise-of-Postgres.html</link>
      <pubDate>Thu, 05 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/08/05/In-praise-of-Postgres.html</guid>
      <description>&lt;p&gt;After writing &lt;a href=&#34;gemini://drewdevault.com/2021/05/06/Praise-for-Alpine-Linux.gmi&#34;&gt;Praise for Alpine Linux&lt;/a&gt;, I have decided to continue writing&#xA;more articles in praise of good software. Today, I&amp;rsquo;d like to tell you a bit&#xA;about &lt;a href=&#34;https://www.postgresql.org&#34;&gt;PostgreSQL&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Many people don&amp;rsquo;t understand how old Postgres truly is: the first release&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;was in July of 1996. It used this logo:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/f36a9083.jpg&#34; alt=&#34;A &amp;ldquo;logo&amp;rdquo; which depicts the word &amp;ldquo;PostgreSQL&amp;rdquo; in a 3D chrome font bursting through a brick wall from space. No, seriously.&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;After 25 years of persistence, and a better logo design, Postgres stands today&#xA;as one of the most significant pillars of profound achievement in free software,&#xA;alongside the likes of Linux and Firefox. PostgreSQL has taken a complex problem&#xA;and &lt;em&gt;solved&lt;/em&gt; it to such an effective degree that all of its competitors are&#xA;essentially obsolete, perhaps with the exception of SQLite.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My wish-list for the next YAML</title>
      <link>https://drewdevault.com/2021/07/28/The-next-YAML.html</link>
      <pubDate>Wed, 28 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/07/28/The-next-YAML.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://yaml.org&#34;&gt;YAML&lt;/a&gt; is both universally used, and universally reviled. It&#xA;has a lot of problems, but it also is so useful in solving specific tasks that&#xA;it&amp;rsquo;s hard to replace. Some new kids on the block (such as TOML) have&#xA;successfully taken over a &lt;em&gt;portion&lt;/em&gt; of its market share, but it remains in force&#xA;in places where those alternatives show their weaknesses.&lt;/p&gt;&#xA;&lt;p&gt;I think it&amp;rsquo;s clear to most that YAML is in dire need of replacement, which is&#xA;why many have tried. But many have also failed. So what are the key features of&#xA;YAML which demonstrate its strengths, and key weaknesses that could be improved&#xA;upon?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, July 2021</title>
      <link>https://drewdevault.com/2021/07/15/Status-update-July-2021.html</link>
      <pubDate>Thu, 15 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/07/15/Status-update-July-2021.html</guid>
      <description>&lt;p&gt;Hallo uit Nederland! I&amp;rsquo;m writing to you from a temporary workstation in&#xA;Amsterdam, pending the installation of a better one that I&amp;rsquo;ll put together after&#xA;I visit a furniture store today. I&amp;rsquo;ve had to slow a few things down somewhat&#xA;while I prepare for this move, and I&amp;rsquo;ll continue to be slower for some time&#xA;following it, but things are moving along regardless.&lt;/p&gt;&#xA;&lt;p&gt;One point of note is that the maintainer for &lt;a href=&#34;https://aerc-mail.org&#34;&gt;aerc&lt;/a&gt;, Reto Brunner, has&#xA;stepped down from his role. I&amp;rsquo;m looking for someone new to fill his shoes;&#xA;please &lt;a href=&#34;mailto:sir@cmpwn.com&#34;&gt;let me know&lt;/a&gt; if you are interested.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Is GitHub a derivative work of GPL&#39;d software?</title>
      <link>https://drewdevault.com/2021/07/04/Is-GitHub-a-derivative-work.html</link>
      <pubDate>Sun, 04 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/07/04/Is-GitHub-a-derivative-work.html</guid>
      <description>&lt;p&gt;GitHub recently announced a tool called &lt;a href=&#34;https://copilot.github.com&#34;&gt;Copilot&lt;/a&gt;, a tool which uses machine&#xA;learning to provide code suggestions, inciting no small degree of controversy.&#xA;One particular facet of the ensuing discussion piques my curiosity: what happens&#xA;if the model was trained using software licensed with the GNU General Public&#xA;License?&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Disclaimer: I am the founder of a company which competes with GitHub.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The GPL is among a family of licenses considered &amp;ldquo;copyleft&amp;rdquo;, which are&#xA;characterized by their &amp;ldquo;viral&amp;rdquo; nature. In particular, the trait common to&#xA;copyleft works is the requirement that &amp;ldquo;derivative works&amp;rdquo; are required to&#xA;publish their new work under the same terms as the original copyleft license.&#xA;Some weak copyleft licenses, like the Mozilla Public License, only apply to any&#xA;changes to specific files from the original code. Stronger licenses like the GPL&#xA;family affect the broader work that any GPL&amp;rsquo;d code has been incorporated into.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How does IRC&#39;s federation model compare to ActivityPub?</title>
      <link>https://drewdevault.com/2021/07/03/How-does-IRC-federate.html</link>
      <pubDate>Sat, 03 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/07/03/How-does-IRC-federate.html</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s federated revolution is led by ActivityPub, leading to the rise of&#xA;services like Mastodon, PeerTube, PixelFed, and more. These new technologies&#xA;have a particular approach to federation, which is coloring perceptions on what&#xA;it actually means for a system to be federated at all. Today&amp;rsquo;s post will explain&#xA;how &lt;a href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;&gt;Internet Relay Chat&lt;/a&gt;&#xA;(IRC), a technology first introduced in the late 1980&amp;rsquo;s, does federation&#xA;differently, and why.&lt;/p&gt;&#xA;&lt;p&gt;As IRC has aged, many users today have only ever used a few networks, such as&#xA;Liberachat (or Freenode, up until several weeks ago), which use a particular IRC&#xA;model which does not, at first glance, appear to utilize federation. After all,&#xA;everyone types &amp;ldquo;irc.libera.chat&amp;rdquo; into their client and they all end up on the&#xA;same network and in the same namespace. However, this domain name is backed by a&#xA;round-robin resolver which will connect you to any of &lt;a href=&#34;https://netsplit.de/servers/?net=Libera.Chat&#34;&gt;several dozen&#xA;servers&lt;/a&gt;, which are connected to each other&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and exchange messages on&#xA;behalf of the users who reside on each. This is why we call them IRC &lt;em&gt;networks&lt;/em&gt;&#xA;— each is composed of a network of servers that work together.&lt;/p&gt;</description>
    </item>
    <item>
      <title>You can&#39;t capture the nuance of my form fields</title>
      <link>https://drewdevault.com/2021/06/27/You-cant-capture-the-nuance.html</link>
      <pubDate>Sun, 27 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/06/27/You-cant-capture-the-nuance.html</guid>
      <description>&lt;p&gt;Check out this text box:&lt;/p&gt;&#xA;&lt;style&gt;&#xA;textarea {&#xA;  width: 100%;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;textarea rows=&#34;10&#34; autocomplete=&#34;off&#34; autocorrect=&#34;off&#34; autocapitalize=&#34;off&#34; spellcheck=&#34;false&#34;&gt;Consectetur qui consequatur voluptatibus voluptatem sit sint perspiciatis. Eos aspernatur ad laboriosam quam numquam quo. Quia reiciendis illo quo praesentium. Dolor porro et et sit dolorem quisquam totam quae.&#xA;Ea molestias a aspernatur dignissimos suscipit incidunt. Voluptates in vel qui quaerat. Asperiores vel sit rerum est ipsam. Odio aut aut voluptate qui voluptatem.&#xA;Quia consequatur provident fugiat voluptatibus consequatur. Est sunt aspernatur velit. Officiis a dolorum accusantium. Sint est ut inventore.&lt;/textarea&gt;&#xA;&lt;p&gt;Here are some of the nuances of using this text box on my operating system&#xA;(Linux) and web browser (Firefox):&lt;/p&gt;</description>
    </item>
    <item>
      <title>A finger client</title>
      <link>https://drewdevault.com/2021/06/24/finger-client.html</link>
      <pubDate>Thu, 24 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/06/24/finger-client.html</guid>
      <description>&lt;p&gt;This is a short follow-up to the &lt;a href=&#34;https://drewdevault.com/2021/05/24/io_uring-finger-server.html&#34;&gt;io_uring finger server&lt;/a&gt; article posted&#xA;about a month ago. In the time since, we have expanded our language with a more&#xA;complete networking stack, most importantly by adding a DNS resolver. I have&#xA;used these improvements to write a small client implementation of the &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc1288&#34;&gt;finger&#xA;protocol&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-hare&#34; data-lang=&#34;hare&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@init&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;registersvc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;registersvc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;finger&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[],&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;79&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@noreturn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Usage: {} &amp;lt;user&amp;gt;[@&amp;lt;host&amp;gt;]&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;@&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;execute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strerror&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strerror&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#x9;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;execute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dial&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;finger&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;{}&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\r\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Technically, we could do more, but I chose to just address the most common&#xA;use-case for finger servers in active use today: querying a specific user.&#xA;Expanding this with full support for all finger requests would probably only&#xA;grow this code by 2 or 3 times.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, June 2021</title>
      <link>https://drewdevault.com/2021/06/15/Status-update-June-2021.html</link>
      <pubDate>Tue, 15 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/06/15/Status-update-June-2021.html</guid>
      <description>&lt;p&gt;Hiya! Got another status update for you. First, let me share this picture that&#xA;my dad and I took on our recent astronomy trip (click for full res):&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/l.sr.ht/o750.jpg&#34;&gt;&lt;img src=&#34;https://drewdevault.com/l.sr.ht/o750.jpg&#34; alt=&#34;A long-exposure picture of the night sky. Thousands of stars are visible, as well as the band of the milky way.&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Bonus Venus:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/6574aa37.png&#34; alt=&#34;A bright white circle against a dark background&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;So, what&amp;rsquo;s new? With SourceHut, there are a few neat goings-on. For one, thanks&#xA;to Michael Forney putting the finishing touches on the patchset, the&#xA;long-awaited NetBSD image is now available for builds.sr.ht. Also, the initial&#xA;lists.sr.ht GraphQL API design is in place, and Simon Ser is working on a new&#xA;and improved implementation of email discussion parsing for us to use. I&amp;rsquo;ve also&#xA;redesigned the registration &amp;amp; onboarding flow based on a maintainer/contributor&#xA;distinction, which should help people understand how sourcehut works a bit&#xA;better. Also, as promised, the writable GraphQL API for builds.sr.ht is now&#xA;available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Provided &#34;as is&#34;, without warranty of any kind</title>
      <link>https://drewdevault.com/2021/06/14/Provided-as-is-without-warranty.html</link>
      <pubDate>Mon, 14 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/06/14/Provided-as-is-without-warranty.html</guid>
      <description>&lt;p&gt;The MIT license contains the following text, in all uppercase no less:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;THE SOFTWARE IS PROVIDED &amp;ldquo;AS IS&amp;rdquo;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&#xA;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&#xA;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The BSD licenses, GPL family of licenses, Apache 2.0, Mozilla Public License,&#xA;and likely any other license you&amp;rsquo;d care to name, have similar clauses of their&#xA;own. It&amp;rsquo;s worth taking a moment to consider the implications of this statement&#xA;and what it says about the social aspects of free and open source software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I will be moving to the Netherlands</title>
      <link>https://drewdevault.com/2021/06/07/The-Netherlands.html</link>
      <pubDate>Mon, 07 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/06/07/The-Netherlands.html</guid>
      <description>&lt;p&gt;I had been planning a move to the Netherlands for a while, at least until a&#xA;large COVID-shaped wrench was thrown into the gears. However, I was fully&#xA;vaccinated by early April, and there are signs of the border opening up now, so&#xA;my plans have been slowly getting back on track. I sent off my visa application&#xA;today, and assuming I can navigate the pandemic-modified procedures, I should be&#xA;able to make my move fairly soon. It&amp;rsquo;s a little bit intimidating, but I am&#xA;looking forward to it!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build your project in our new language</title>
      <link>https://drewdevault.com/2021/05/30/Come-build-your-project.html</link>
      <pubDate>Sun, 30 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/30/Come-build-your-project.html</guid>
      <description>&lt;p&gt;Do you have a new systems programming project on your todo list? If you&amp;rsquo;re&#xA;feeling adventurous, I would like you to give it a crack in our new systems&#xA;programming language, and to use it to drive improvements in the less-developed&#xA;areas of our standard library.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: we have enough projects on board now. Keep an eye on the blog, I&amp;rsquo;ll&#xA;publish another announcement when we&amp;rsquo;re ready for more.&lt;/p&gt;&#xA;&lt;p&gt;Are you making a new coreutils implementation? A little OS kernel? A new shell?&#xA;A GUI toolkit? Database system? Web server? Whatever your systems programming&#xA;use-case, we think that our language is likely to be a good fit for you, and&#xA;your help in proving that, and spurring development to rise to meet your needs,&#xA;would be quite welcome.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using io_uring to make a high-performance... finger server</title>
      <link>https://drewdevault.com/2021/05/24/io_uring-finger-server.html</link>
      <pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/24/io_uring-finger-server.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m working on adding a wrapper for the &lt;a href=&#34;https://unixism.net/loti/what_is_io_uring.html&#34;&gt;Linux io_uring interface&lt;/a&gt; to my&#xA;&lt;a href=&#34;https://drewdevault.com/2021/03/19/A-new-systems-language.html&#34;&gt;secret programming language project&lt;/a&gt;. To help learn more about io_uring and&#xA;to test out the interface I was designing, I needed a small project whose design&#xA;was well-suited for the value-add of io_uring. The &lt;a href=&#34;https://en.wikipedia.org/wiki/Finger_protocol&#34;&gt;Finger protocol&lt;/a&gt; is&#xA;perfect for this! After being designed in the 70&amp;rsquo;s and then completely forgotten&#xA;about for 50 years, it&amp;rsquo;s the perfect small and simple network protocol to test&#xA;drive this new interface with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to write release notes</title>
      <link>https://drewdevault.com/2021/05/19/How-to-write-release-notes.html</link>
      <pubDate>Wed, 19 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/19/How-to-write-release-notes.html</guid>
      <description>&lt;p&gt;Release notes are a concept most of us are familiar with. When a new software&#xA;release is prepared, the release notes tell you what changed, so you understand&#xA;what you can expect and how to prepare for the update. They are also&#xA;occasionally used to facilitate conversations:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://xkcd.com/2010/&#34;&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/update_notes_2x.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Many of the people tasked with writing release notes have never found themselves&#xA;on that side of the screen before. If that describes you, I would like to offer&#xA;some advice on how to nail it. Note that this mostly applies to free and open&#xA;source software, which is the only kind of software which is valid.&lt;/p&gt;</description>
    </item>
    <item>
      <title>aerc, mbsync, and postfix for maximum comfy offline email</title>
      <link>https://drewdevault.com/2021/05/17/aerc-with-mbsync-postfix.html</link>
      <pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/17/aerc-with-mbsync-postfix.html</guid>
      <description>&lt;p&gt;I am the original author of the &lt;a href=&#34;https://aerc-mail.org&#34;&gt;aerc mail client&lt;/a&gt;, though my official&#xA;relationship with it today is marginal at best. I think that, with hindsight,&#xA;I&amp;rsquo;ve come to understand that the &amp;ldquo;always online&amp;rdquo; approach of aerc&amp;rsquo;s IMAP&#xA;implementation is less than ideal. The next email client (which will exist at&#xA;some point!) will improve on this design, but, since it&amp;rsquo;s still my favorite&#xA;email client despite these flaws, they will have to be worked around.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, May 2021</title>
      <link>https://drewdevault.com/2021/05/16/Status-update-May-2021.html</link>
      <pubDate>Sun, 16 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/16/Status-update-May-2021.html</guid>
      <description>&lt;p&gt;Hello! This update is a bit late. I was travelling all day yesterday without&#xA;internet, so I could not prepare these. After my sister and I got vaccinated, I&#xA;took a trip to visit her at her home in beautiful Hawaii — it felt great&#xA;after a year of being trapped within these same four walls. I hope you get that&#xA;vaccine and things start to improve for you, too!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pinebook Pro review</title>
      <link>https://drewdevault.com/2021/05/14/Pinebook-Pro-review.html</link>
      <pubDate>Fri, 14 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/14/Pinebook-Pro-review.html</guid>
      <description>&lt;p&gt;I received the original Pinebook for free from the good folks at Pine64 a few&#xA;years ago, when I visited Berlin to work with the KDE developers. Honestly, I&#xA;was underwhelmed. The performance was abysmal and ARM is a nightmare to work&#xA;with. For these reasons, I was skeptical when I bought the Pinebook Pro. I have&#xA;also &lt;a href=&#34;https://drewdevault.com/2020/02/18/Fucking-laptops.html&#34;&gt;spoken of my disdain for modern laptops in general before&lt;/a&gt;: the state&#xA;of laptops in $CURRENTYEAR is abysmal. As such, I have been using a ThinkPad&#xA;X200, an 11 year old laptop, as my sole laptop for several years now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I try not to make unlikable software (and features)</title>
      <link>https://drewdevault.com/2021/05/08/Try-not-to-make-unlikable-software.html</link>
      <pubDate>Sat, 08 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/08/Try-not-to-make-unlikable-software.html</guid>
      <description>&lt;p&gt;I am writing to you from The Sky. On my flight today, I noticed an example of&#xA;&amp;ldquo;unlikable&amp;rdquo; software — something I&amp;rsquo;ve been increasingly aware of recently&#xA;— inspiring me to pull out my laptop and write. On this plane, there are&#xA;displays in the back of each seat which provides entertainment for the person&#xA;seated one row back. Newer planes no longer include these, given that in&#xA;$CURRENTYEAR everyone would just prefer some power for their phone or laptop.&#xA;Nevertheless, you can still end up a plane with this design. You can shut the&#xA;thing off by repeatedly pressing the &amp;ldquo;☀️ -&amp;rdquo; button, though that button is rated&#xA;for half the cycles it will have already received by the time you press it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>godocs.io six months later</title>
      <link>https://drewdevault.com/2021/05/07/godocs.io-six-months-later.html</link>
      <pubDate>Fri, 07 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/07/godocs.io-six-months-later.html</guid>
      <description>&lt;p&gt;We&amp;rsquo;re six months on from &lt;a href=&#34;https://drewdevault.com/2020/12/18/godocs.io.html&#34;&gt;forking godoc.org&lt;/a&gt; following its upstream&#xA;deprecation, and we&amp;rsquo;ve made a lot of great improvements since. For those&#xA;unaware, the original godoc.org was replaced with pkg.go.dev, and a redirect was&#xA;set up. The new website isn&amp;rsquo;t right for many projects — one of the most&#xA;glaring issues is the narrow list of software licenses pkg.go.dev will display&#xA;documentation for. To continue serving the needs of projects which preferred the&#xA;old website, we forked the project and set up &lt;a href=&#34;https://godocs.io&#34;&gt;godocs.io&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In praise of Alpine Linux</title>
      <link>https://drewdevault.com/2021/05/06/Praise-for-Alpine-Linux.html</link>
      <pubDate>Thu, 06 May 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/05/06/Praise-for-Alpine-Linux.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: this blog post was originally only available via Gemini, but has been&#xA;re-formatted for the web.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The traits I prize most in an operating system are the following:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Simplicity&lt;/li&gt;&#xA;&lt;li&gt;Stability&lt;/li&gt;&#xA;&lt;li&gt;Reliability&lt;/li&gt;&#xA;&lt;li&gt;Robustness&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;As a bonus, I&amp;rsquo;d also like to have:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Documentation&lt;/li&gt;&#xA;&lt;li&gt;Professionalism&lt;/li&gt;&#xA;&lt;li&gt;Performance&lt;/li&gt;&#xA;&lt;li&gt;Access to up-to-date software&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Alpine meets all of the essential criteria and most of the optional criteria&#xA;(documentation is the weakest link), and far better than any other Linux&#xA;distribution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cryptocurrency is an abject disaster</title>
      <link>https://drewdevault.com/2021/04/26/Cryptocurrency-is-a-disaster.html</link>
      <pubDate>Mon, 26 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/26/Cryptocurrency-is-a-disaster.html</guid>
      <description>&lt;p&gt;This post is long overdue. Let&amp;rsquo;s get it over with.&lt;/p&gt;&#xA;&lt;div class=&#34;alert alert-danger&#34;&gt;&#xA;  🛑 &lt;strong&gt;Hey!&lt;/strong&gt; If you write a comment about this article online,&#xA;  disclose your stake in cryptocurrency. I will explain why later in this post.&#xA;  For my part, I held &amp;lt;$10,000 USD worth of Bitcoin prior to 2016, plus small&#xA;  amounts of altcoins. I made a modest profit on my holdings. Today my stake in&#xA;  all cryptocurrency is $0.&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Starting on May 1st, users of sourcehut&amp;rsquo;s CI service will be required to be on a&#xA;paid account, a change which will affect about half of all builds.sr.ht&#xA;users.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Over the past several months, everyone in the industry who provides&#xA;any kind of free CPU resources has been dealing with a massive outbreak of abuse&#xA;for cryptocurrency mining. The industry has been setting up informal working&#xA;groups to pool knowledge of mitigations, communicate when our platforms are&#xA;being leveraged against one another, and cumulatively wasting thousands of hours&#xA;of engineering time implementing measures to deal with this abuse, and&#xA;responding as attackers find new ways to circumvent them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recommended read: Why Lichess will always be free</title>
      <link>https://drewdevault.com/2021/04/23/Lichess.html</link>
      <pubDate>Fri, 23 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/23/Lichess.html</guid>
      <description>&lt;p&gt;Signal-boosting this excellent article from Lichess: &lt;a href=&#34;https://lichess.org/blog/YF-ZORQAACAA89PI/why-lichess-will-always-be-free.&#34;&gt;Why Lichess will always be free.&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parsers all the way down: writing a self-hosting parser</title>
      <link>https://drewdevault.com/2021/04/22/Our-self-hosted-parser-design.html</link>
      <pubDate>Thu, 22 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/22/Our-self-hosted-parser-design.html</guid>
      <description>&lt;p&gt;One of the things we&amp;rsquo;re working on in &lt;a href=&#34;https://drewdevault.com/2021/03/19/A-new-systems-language.html&#34;&gt;my new programming language&lt;/a&gt; is a&#xA;self-hosting compiler. Having a self-hosted compiler is a critical step in the&#xA;development of (some) programming languages: it signals that the language is&#xA;mature enough to be comfortably used to implement itself. While this isn&amp;rsquo;t right&#xA;for some languages (e.g. shell scripts), for a systems programming language like&#xA;ours, this is a crucial step in our bootstrapping plan. Our self-hosted parser&#xA;design was completed this week, and today I&amp;rsquo;ll share some details about how it&#xA;works and how it came to be.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, April 2021</title>
      <link>https://drewdevault.com/2021/04/15/Status-update-April-2021.html</link>
      <pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/15/Status-update-April-2021.html</guid>
      <description>&lt;p&gt;Another month goes by! I&amp;rsquo;m afraid that I have very little to share this month.&#xA;You can check out the &lt;a href=&#34;https://sourcehut.org/blog/2021-04-15-whats-cooking-april-2021/&#34;&gt;sourcehut &amp;ldquo;what&amp;rsquo;s cooking&amp;rdquo; post&lt;/a&gt; for sourcehut news,&#xA;but outside of that I have focused almost entirely on the programming language&#xA;project this month, for which the details are kept private.&lt;/p&gt;&#xA;&lt;p&gt;The post &lt;a href=&#34;https://drewdevault.com/2021/03/19/A-new-systems-language.html&#34;&gt;calling for contributors&lt;/a&gt; led to a lot of answers and we&amp;rsquo;ve brought&#xA;several new people on board — thanks for answering the call! I&amp;rsquo;d like to&#xA;narrow the range of problems we still need help with. If you&amp;rsquo;re interested in&#xA;(and experienced in) the following problems, we need your help:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Developer Certificate of Origin is a great alternative to a CLA</title>
      <link>https://drewdevault.com/2021/04/12/DCO.html</link>
      <pubDate>Mon, 12 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/12/DCO.html</guid>
      <description>&lt;p&gt;Today Amazon released their fork of ElasticSearch, &lt;a href=&#34;https://github.com/opensearch-project/OpenSearch&#34;&gt;OpenSearch&lt;/a&gt;, and I want&#xA;to take a moment to draw your attention to one good decision in particular: its&#xA;use of the &lt;a href=&#34;https://github.com/opensearch-project/OpenSearch/blob/main/CONTRIBUTING.md#developer-certificate-of-origin&#34;&gt;Developer Certificate of Origin&lt;/a&gt; (or &amp;ldquo;DCO&amp;rdquo;).&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Previously:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/2021/01/19/Elasticsearch-does-not-belong-to-Elastic.html&#34;&gt;ElasticSearch does not belong to Elastic&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/2021/01/20/FOSS-is-to-surrender-your-monopoly.html&#34;&gt;Open source means surrendering your monopoly over commercial exploitation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/2018/10/05/Dont-sign-a-CLA.html&#34;&gt;Don&amp;rsquo;t sign a CLA&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Elastic betrayed its community when they changed to a proprietary license.  We&#xA;could have seen it coming because of a particular trait of their contribution&#xA;process: the use of a Contributor License Agreement, or CLA. In principle, a CLA&#xA;aims to address legitimate concerns of ownership and copyright, but in practice,&#xA;they are a promise that one day the stewards of the codebase will take your work&#xA;and relicense it under a nonfree license. And, ultimately, this is exactly what&#xA;Elastic did, and exactly what most other projects which ask you to sign a CLA&#xA;are &lt;em&gt;planning&lt;/em&gt; to do. If you ask me, that&amp;rsquo;s a crappy deal, and I refrain from&#xA;contributing to those projects as a result.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What should the next chat app look like?</title>
      <link>https://drewdevault.com/2021/04/07/The-next-chat-app.html</link>
      <pubDate>Wed, 07 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/07/The-next-chat-app.html</guid>
      <description>&lt;p&gt;As you&amp;rsquo;re surely aware, Signal has officially jumped the shark with the&#xA;introduction of cryptocurrency to their chat app. Back in 2018, I &lt;a href=&#34;https://drewdevault.com/2018/08/08/Signal.html&#34;&gt;wrote about&#xA;my concerns with Signal&lt;/a&gt;, and those concerns were unfortunately validated by&#xA;this week&amp;rsquo;s announcement. Moxie&amp;rsquo;s insistence on centralized ownership,&#xA;governance, and servers for Signal puts him in a position of power which is&#xA;easily, and inevitably, abused. In that 2018 article, and in &lt;a href=&#34;https://drewdevault.com/2020/09/20/The-potential-of-federation.html&#34;&gt;articles since&lt;/a&gt;,&#xA;I have spoken about the important of federation to address these problems. In&#xA;addition to federation, what else does a chat app need?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go is a great programming language</title>
      <link>https://drewdevault.com/2021/04/02/Go-is-a-great-language.html</link>
      <pubDate>Fri, 02 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/04/02/Go-is-a-great-language.html</guid>
      <description>&lt;p&gt;No software is perfect, and thus even for software I find very pleasant, I can&#xA;usually identify some problems in it — often using my blog to do so. Even&#xA;my all-time favorite software project, Plan 9, has some painful flaws! For some&#xA;projects, it may be my fondness for them that drives me to criticise them even&#xA;more, in the hope that they&amp;rsquo;ll live up to the level of respect I feel for them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The world&#39;s stupidest IRC bot</title>
      <link>https://drewdevault.com/2021/03/29/The-worlds-dumbest-IRC-bot.html</link>
      <pubDate>Mon, 29 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/29/The-worlds-dumbest-IRC-bot.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m an &lt;a href=&#34;https://en.wikipedia.org/wiki/Internet_Relay_Chat&#34;&gt;IRC&lt;/a&gt; power user,&#xA;having been hanging out in 200+ channels on 10+ networks 24/7 for the past 10&#xA;years or so. Because IRC is&#xA;&lt;a href=&#34;https://tools.ietf.org/html/rfc2812&#34;&gt;standardized&lt;/a&gt; and simple, a common&#xA;pastime for IRC enthusiasts is the creation of bots. In one of the social&#xA;channels I hang out in, we&amp;rsquo;ve spent the past 6 years gradually building the&#xA;world&amp;rsquo;s stupidest IRC bot: wormy.&lt;/p&gt;&#xA;&lt;p&gt;For a start, wormy is highly schizophrenic. Though it presents itself as a&#xA;single bot, it is in fact a&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/BNC_(software)&#34;&gt;bouncer&lt;/a&gt; which combines the&#xA;connections of 7 independent bots. At one point, this number was higher —&#xA;as many as 11 — but some bots were consolidated.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The complete guide for open sourcing video games</title>
      <link>https://drewdevault.com/2021/03/23/Open-sourcing-video-games.html</link>
      <pubDate>Tue, 23 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/23/Open-sourcing-video-games.html</guid>
      <description>&lt;p&gt;Video games are an interesting class of software. Unlike most software, they are&#xA;a creative endeavour, rather than a practical utility. Where most software&#xA;calls for new features to address practical needs of their users, video games&#xA;call for new features to serve the creative vision of their makers. Similarly,&#xA;matters like refactoring and paying down tech debt are often heavily&#xA;de-prioritized in favor of shipping something ASAP. Many of the collaborative&#xA;benefits of open source are less applicable to video games. It is perhaps for&#xA;these reasons that there are very few commercial open source games.&lt;/p&gt;</description>
    </item>
    <item>
      <title>We are building a new systems programming language</title>
      <link>https://drewdevault.com/2021/03/19/A-new-systems-language.html</link>
      <pubDate>Fri, 19 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/19/A-new-systems-language.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s an open secret: the &amp;ldquo;secret project&amp;rdquo; I&amp;rsquo;ve been talking about is a new&#xA;systems programming language. It&amp;rsquo;s been underway since December &amp;lsquo;19, and we hope&#xA;to release the first version in early 2022. The language is pretty small —&#xA;we have a mostly complete specification which clocks in at 60 pages. It has&#xA;manual memory management, no runtime, and it uses a superset of the C ABI,&#xA;making it easy to link with libraries and C code. It should be suitable almost&#xA;anywhere C is useful: compilers, system utilities, operating systems, network&#xA;servers and clients, and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, March 2021</title>
      <link>https://drewdevault.com/2021/03/15/Status-update-March-2021.html</link>
      <pubDate>Mon, 15 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/15/Status-update-March-2021.html</guid>
      <description>&lt;p&gt;After the brief illusion of spring, this morning meets us with a cold apartment&#xA;indoors and fierce winds outdoors. Today concludes a productive month, mainly&#xA;for the secret project and for sourcehut, but also marked by progress in some&#xA;smaller projects as well. I&amp;rsquo;ll start with those smaller projects.&lt;/p&gt;&#xA;&lt;p&gt;I have written a feed reader for Gemini, which is (1) &lt;a href=&#34;https://sr.ht/~sircmpwn/gemreader&#34;&gt;free&#xA;software&lt;/a&gt;, and (2) &lt;a href=&#34;gemini://feeds.drewdevault.com&#34;&gt;available as a free&#xA;hosted service&lt;/a&gt;. Big thanks to adnano, the&#xA;author of the &lt;a href=&#34;https://sr.ht/~adnano/go-gemini&#34;&gt;go-gemini&lt;/a&gt; library, which has&#xA;been very helpful for many of my Gemini-related exploits, and who has been a&#xA;great collaborator. I also used it to provide Gemini support for the new&#xA;&lt;a href=&#34;https://srht.site&#34;&gt;pages.sr.ht&lt;/a&gt;, which offers static web and gemini hosting for&#xA;sr.ht users. I also updated &lt;a href=&#34;https://sr.ht/~sircmpwn/gmni&#34;&gt;gmni&lt;/a&gt; to use BearSSL&#xA;instead of OpenSSL this month.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The corporate surveillance machine is killing people</title>
      <link>https://drewdevault.com/2021/03/06/Corporate-surveillance-murder.html</link>
      <pubDate>Sat, 06 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/06/Corporate-surveillance-murder.html</guid>
      <description>&lt;p&gt;I have never been angrier about the corporate surveillance complex, which I have&#xA;rallied against for &lt;em&gt;years&lt;/em&gt;, than I am today. Buying and selling user&amp;rsquo;s private&#xA;information on the open market is bad enough for the obvious reasons, but today,&#xA;I learned that the depths of depravity this market will descend to are without&#xA;limit. Today I am more angry and ashamed at this industry than I have ever been.&#xA;Corporate surveillance and adtech has turned your phone into an informant&#xA;against you and brought about the actual &lt;strong&gt;murder&lt;/strong&gt; of the user.&lt;/p&gt;</description>
    </item>
    <item>
      <title>To make money in FOSS, build a business first</title>
      <link>https://drewdevault.com/2021/03/03/To-make-money-in-FOSS-build-a-business.html</link>
      <pubDate>Wed, 03 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/03/03/To-make-money-in-FOSS-build-a-business.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve &lt;a href=&#34;https://drewdevault.com/2020/11/20/A-few-ways-to-make-money-in-FOSS.html&#34;&gt;written about&lt;/a&gt; making money in free and open source software before,&#xA;but it&amp;rsquo;s a deep topic that merits additional discussion. While previously I&#xA;focused on what an individual can do in order to build a career in FOSS, but&#xA;today I want to talk about how you can build a sustainable business in FOSS.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s a common mistake to do this the wrong way around: build the software, then&#xA;the business. Because FOSS &lt;a href=&#34;https://drewdevault.com/2021/01/20/FOSS-is-to-surrender-your-monopoly.html&#34;&gt;requires you to surrender your sole monetization&#xA;rights&lt;/a&gt;, building the software first and worrying about the money later puts&#xA;you at a huge risk of losing your first-mover advantage. If you&amp;rsquo;re just making a&#xA;project which is useful to you and you don&amp;rsquo;t want the overhead of running a&#xA;business, then that may be totally okay — you can just build the software&#xA;without sweating the business issues. If you choose this path, however, be aware&#xA;that the promise of free and open source software entitles anyone else to build&#xA;that business without you. If you lapse in your business-building efforts and&#xA;your software project starts making someone else money, then they&amp;rsquo;re not at&#xA;fault for &amp;ldquo;taking your work&amp;rdquo; — you gave it to them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gmail is a huge source of spam</title>
      <link>https://drewdevault.com/2021/02/25/Gmail-is-a-huge-source-of-spam.html</link>
      <pubDate>Thu, 25 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/02/25/Gmail-is-a-huge-source-of-spam.html</guid>
      <description>&lt;p&gt;5× as many spam registrations on sourcehut are from gmail than from the&#xA;second-largest offender.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# SELECT&#xA;  SPLIT_PART(email, &amp;#39;@&amp;#39;, 2) as domain, count(*) as count&#xA;  FROM &amp;#34;user&amp;#34;&#xA;  WHERE user_type = &amp;#39;suspended&amp;#39;&#xA;  GROUP BY domain&#xA;  ORDER BY count DESC;&#xA;          domain           | count&#xA;---------------------------+-------&#xA; gmail.com                 |   119&#xA; qq.com                    |    26&#xA; mail.ru                   |    17&#xA; mailinator.com            |    10&#xA; yopmail.com               |     6&#xA; aol.com                   |     6&#xA; yahoo.com                 |     6&#xA;[...more omitted...]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is just the ones which got through: most spam registrations are detected&#xA;and ignored before they make it to the database.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A great alternative is rarely fatter than what it aims to replace</title>
      <link>https://drewdevault.com/2021/02/21/On-the-traits-of-good-replacements.html</link>
      <pubDate>Sun, 21 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/02/21/On-the-traits-of-good-replacements.html</guid>
      <description>&lt;p&gt;This is not always true, but in my experience, it tends to hold up. We often&#xA;build or evaluate tools which aim to replace something kludgy^Wvenerable.&#xA;Common examples include shells, programming languages, system utilities, and so&#xA;on. Rust, Zig, etc, are taking on C in this manner; so too does zsh, fish, and&#xA;oil take on bash, which in turn takes on the Bourne shell. There are many&#xA;examples.&lt;/p&gt;&#xA;&lt;p&gt;All of these tools are fine in their own respects, but they have all failed to&#xA;completely supplant the software they&amp;rsquo;re seeking to improve upon.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; What these&#xA;projects have in common is that they &lt;em&gt;expand&lt;/em&gt; on the ideas of their&#xA;predecessors, rather than &lt;em&gt;refining&lt;/em&gt; them. A truly great alternative finds the&#xA;nugget of truth at the center of the idea, cuts out the cruft, and solves the&#xA;same problem with less.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, February 2021</title>
      <link>https://drewdevault.com/2021/02/15/Status-update-February-2021.html</link>
      <pubDate>Mon, 15 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/02/15/Status-update-February-2021.html</guid>
      <description>&lt;p&gt;&#xA;Salutations! It&#39;s officially a year of pandemic life. I hear the vaccine&#xA;distribution is going well, so hopefully there won&#39;t be another year of this. In&#xA;the meanwhile, I&#39;ve been working hard on free software, what with having little&#xA;else to do. However, I&#39;m afraid I cannot tell you about most of it!&#xA;&#xA;&lt;p&gt;&#xA;I&#39;ve been working on todo.sr.ht&#39;s GraphQL API, and it&#39;s going quite well. I hope&#xA;to ship a working read-only version later this month. There have been a number&#xA;of bug fixes and rote maintenance work on sr.ht as well, but nothing&#xA;particularly exciting. We did upgrade everything for Alpine 3.13, which went off&#xA;without a hitch. Anyway, I&#39;ll go over the minor details in the sr.ht &#34;what&#39;s&#xA;cooking&#34; post later today.&#xA;&#xA;&lt;p&gt;&#xA;The rest of the progress was made in secret. Secret! You will have to live in&#xA;ignorance for now. Sorry!&#xA;&#xA;&lt;details&gt;&#xA;&lt;summary&gt;(unless you click this)&lt;/summary&gt;&#xA;&lt;p&gt;Here&#39;s a peek at our progress:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to make your downstream users happy</title>
      <link>https://drewdevault.com/2021/02/09/How-to-make-your-downstreams-happy.html</link>
      <pubDate>Tue, 09 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/02/09/How-to-make-your-downstreams-happy.html</guid>
      <description>&lt;p&gt;There are a number of things that your FOSS project can be doing which will make&#xA;the lives of your downstream users easier, particularly if you&amp;rsquo;re writing a&#xA;library or programmer-facing tooling. Many of your downstreams (Linux distros,&#xA;pkgsrc, corporate users, etc) are dealing with lots of packages, and some minor&#xA;tweaks to your workflow will help them out a lot.&lt;/p&gt;&#xA;&lt;p&gt;The first thing to do is &lt;em&gt;avoid&lt;/em&gt; using any build system or packaging system&#xA;which is not the norm for your language. Also avoid incorporating information&#xA;into your build which relies on being in your git repo — most packagers&#xA;prefer to work with tarball snapshots, or to fetch your package from e.g. PyPI.&#xA;These two issues are definitely the worst offenders. If you do have to use a&#xA;custom build system, take your time to document it thoroughly, so that users who&#xA;run into problems are well-equipped to address them. The typical build system or&#xA;packaging process in use for your language already addressed most of those edge&#xA;cases long ago, which is why we like it better. If you must fetch, say, version&#xA;information from git, then please add a fallback, such as an environment&#xA;variable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use open platforms — or else</title>
      <link>https://drewdevault.com/2021/01/28/Use-open-platforms-or-else.html</link>
      <pubDate>Thu, 28 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/28/Use-open-platforms-or-else.html</guid>
      <description>&lt;p&gt;The ongoing events around &lt;a href=&#34;https://old.reddit.com/r/wallstreetbets&#34;&gt;/r/wallstreetbets&lt;/a&gt; teaches us, once again, about&#xA;the value of open platforms, and the tremendous &lt;em&gt;risk&lt;/em&gt; involved in using&#xA;proprietary platforms. The economic elites who control those proprietary&#xA;platforms, backed by their venture capital interests, &lt;em&gt;will&lt;/em&gt; shut us down if we&#xA;threaten them. We&amp;rsquo;re taking serious risk by casting our lot with them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Discord_(software)&#34;&gt;Discord&lt;/a&gt;, a proprietary instant messaging and VoIP platform, kicked out the&#xA;/r/WSB community yesterday. They claimed it was due to spam and abuse from bots.&#xA;These are convenient excuses when considered in the broader context of Discord&amp;rsquo;s&#xA;conflict of interest, between its retail investor users and its wall-street&#xA;investor backers. However, even if we take their explanation at face value, we&#xA;can easily question Discord&amp;rsquo;s draconian policies about its proprietary chat&#xA;protocol. They have a history of cracking down on third-party bots and clients&#xA;with the same excuses of preventing spam and abuse. If Discord accepts&#xA;responsibility for preventing spam and abuse, then why are they deplatforming&#xA;users when they, Discord, failed to prevent it?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Open source means surrendering your monopoly over commercial exploitation</title>
      <link>https://drewdevault.com/2021/01/20/FOSS-is-to-surrender-your-monopoly.html</link>
      <pubDate>Wed, 20 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/20/FOSS-is-to-surrender-your-monopoly.html</guid>
      <description>&lt;p&gt;Participation in open source requires you to surrender your monopoly over&#xA;commercial exploitation. This is a profound point about free and open source&#xA;software which seems to be causing a lot of companies to struggle with their&#xA;understanding of the philosophy of FOSS, and it&amp;rsquo;s worth addressing on its own.&#xA;It has been apparent for some years now that FOSS is eating the software world,&#xA;and corporations are trying to figure out their relationship with it. One fact&#xA;that you will have to confront in this position is that you cannot monopolize&#xA;the commercial potential of free and open source software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elasticsearch does not belong to Elastic</title>
      <link>https://drewdevault.com/2021/01/19/Elasticsearch-does-not-belong-to-Elastic.html</link>
      <pubDate>Tue, 19 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/19/Elasticsearch-does-not-belong-to-Elastic.html</guid>
      <description>&lt;p&gt;Elasticsearch belongs to its 1,573 contributors, who retain their copyright, and&#xA;granted Elastic a license to distribute their work without restriction. This is&#xA;the loophole which Elastic exploited when they decided that Elasticsearch &lt;a href=&#34;https://www.elastic.co/blog/licensing-change&#34;&gt;would&#xA;no longer be open source&lt;/a&gt;, a&#xA;loophole that they introduced with this very intention from the start. When you&#xA;read their announcement, don&amp;rsquo;t be gaslit by their deceptive language: Elastic is&#xA;no longer open source, and this is a move against open source. It is not&#xA;&amp;ldquo;doubling down on open&amp;rdquo;. &lt;strong&gt;Elastic has spit in the face of every single one of&#xA;1,573 contributors, and everyone who gave Elastic their trust, loyalty, and&#xA;patronage&lt;/strong&gt;. This is an Oracle-level move.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spooky action at a distance</title>
      <link>https://drewdevault.com/2021/01/19/Spooky-code-at-a-distance.html</link>
      <pubDate>Tue, 19 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/19/Spooky-code-at-a-distance.html</guid>
      <description>&lt;p&gt;Einstein famously characterized the strangeness of quantum mechanics as &amp;ldquo;spooky&#xA;action at a distance&amp;rdquo;, which, if I had to pick one phrase about physics to be my&#xA;favorite, would be a strong contender. I like to relate this to programming&#xA;language design: there are some language features which are similarly spooky.&#xA;Perhaps the most infamous of these is operator overloading. Consider the&#xA;following:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;x + y&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If this were written in C, without knowing anything other than the fact that&#xA;this code compiles correctly, I can tell you that x and y are numeric types, and&#xA;the result is their sum. I can even make an educated guess about the CPU&#xA;instructions which will be generated to perform this task. However, if this were&#xA;a language with operator overloading&amp;hellip; who knows? What if x and y are some kind&#xA;of some Vector class? It could compile to this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, January 2021</title>
      <link>https://drewdevault.com/2021/01/15/Status-update-January-2021.html</link>
      <pubDate>Fri, 15 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/15/Status-update-January-2021.html</guid>
      <description>&lt;p&gt;&#xA;Hello from the future! My previous status update was last year, but it feels&#xA;like it was only a month ago. I hope you didn&#39;t miss my crappy jokes too much&#xA;during the long wait.&#xA;&#xA;&lt;p&gt;&#xA;One of the advancements that I would like to mention this month is the general&#xA;availability of &lt;a href=&#34;https://godocs.io&#34;&gt;godocs.io&lt;/a&gt;, which is a replacement for the&#xA;soon-to-be-obsolete godoc.org, based on a fork of their original codebase.&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/godocs.io&#34;&gt;Our fork&lt;/a&gt; has already attracted&#xA;interest from many contributors who wanted to work on godoc.org, but found the&#xA;Google CLA distasteful. We&#39;ve been hard at work excising lots of Google crap,&#xA;rewriting the indexer to use PostgreSQL instead of GCP, and making the little&#xA;JavaScript bits more optional &amp;amp; more conservative in their implementation.&#xA;We also plan to update it with first-class support for Go modules, which was&#xA;never added to the upstream gddo codebase. Beyond this, we do not plan on&#xA;making any large-scale changes: we just want godoc.org to keep being a thing.&#xA;Enjoy!&#xA;&#xA;&lt;p&gt;&#xA;On SourceHut, the first point of note is the new dark theme, which is&#xA;automatically enabled when your user-agent configures&#xA;&lt;code&gt;prefers-color-scheme: dark&lt;/code&gt;. It has gone through a couple of&#xA;iterations of refinement, and I have a few more changes queued up for my next&#xA;round of improvements. Please let me know if you notice anything unusual!&#xA;Additionally, I broke ground on the todo.sr.ht API 2.0 implementation this&#xA;month. It required some minor changes to our underlying GraphQL approach, but&#xA;in general it should be fairly straightforward &amp;mdash; albeit time consuming&#xA;&amp;mdash; to implement. Ludovic has also started working on an API 2.0 branch for&#xA;hg.sr.ht, which I plan on reviewing shortly.&#xA;&#xA;&lt;p&gt;&#xA;Small projects have enjoyed some improvements as well.&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/mkproof/&#34;&gt;mkproof&lt;/a&gt; grew multi-processor&#xA;support and had its default difficulty tweaked accordingly &amp;mdash; thanks, Tom!&#xA;Zach DeCook and Nolan Prescott also sent some bugfixes for&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/gmnisrv/&#34;&gt;gmnisrv&lt;/a&gt;, and René Wagner and&#xA;Giuseppe Lumia both helped fix some issues with&#xA;&lt;a href=&#34;https://sr.ht/~sircmpwn/gmni&#34;&gt;gmni&lt;/a&gt; as well. Jason Phan sent an&#xA;improvement for &lt;a href=&#34;https://sr.ht/~sircmpwn/dowork&#34;&gt;dowork&lt;/a&gt; which adds&#xA;random jitter to the exponential backoff calculation. Thanks to all of these&#xA;folks for their help!&#xA;&#xA;&lt;p&gt;&#xA;That&#39;s all for today. Thanks again for your support and attention, and I&#39;ll see&#xA;you again soon!&#xA;&#xA;&lt;details&gt;&#xA;&lt;summary&gt;...&lt;/summary&gt;&#xA;&lt;p&gt;I have actually been working on this a lot this month. Progress is good.&#xA;&lt;pre&gt;fn measurements() void = {&#xA;&#x9;const x = &#34;Hello!&#34;;&#xA;&#x9;assert(len(x) == 6z);&#xA;&#x9;assert(size(str) == size(*u8) + size(size) * 2z);&#xA;&#x9;const align: size =&#xA;&#x9;&#x9;if (size(*u8) &amp;gt; size(size)) size(*u8)&#xA;&#x9;&#x9;else size(size);&#xA;&#x9;assert(&amp;amp;x: uintptr: size % align == 0z);&#xA;};&#xA;&#xA;fn charptr() void = {&#xA;&#x9;const x = &#34;Hello!&#34;;&#xA;&#x9;const y = x: *const char;&#xA;&#x9;const z = y: *[*]u8;&#xA;&#x9;const expected = [&#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;, &#39;!&#39;, &#39;\0&#39;];&#xA;&#x9;for (let i = 0z; i &amp;lt; len(expected); i += 1z) {&#xA;&#x9;&#x9;assert(z[i] == expected[i]: u32: u8);&#xA;&#x9;};&#xA;};&#xA;&#xA;fn storage() void = {&#xA;&#x9;const string = &#34;こんにちは&#34;;&#xA;&#x9;const ptr = &amp;amp;string: *struct {&#xA;&#x9;&#x9;data: *[*]u8,&#xA;&#x9;&#x9;length: size,&#xA;&#x9;&#x9;capacity: size,&#xA;&#x9;};&#xA;&#x9;assert(ptr.length == 15z &amp;amp;&amp;amp; ptr.capacity == 15z);&#xA;&#xA;&#x9;// UTF-8 encoded&#xA;&#x9;const expected = [&#xA;&#x9;&#x9;0xE3u8, 0x81u8, 0x93u8, 0xE3u8, 0x82u8, 0x93u8, 0xE3u8, 0x81u8,&#xA;&#x9;&#x9;0xABu8, 0xE3u8, 0x81u8, 0xA1u8, 0xE3u8, 0x81u8, 0xAFu8, 0x00u8,&#xA;&#x9;];&#xA;&#x9;for (let i = 0z; i &amp;lt; len(expected); i += 1z) {&#xA;&#x9;&#x9;assert(ptr.data[i] == expected[i]);&#xA;&#x9;};&#xA;};&#xA;&#xA;export fn main() void = {&#xA;&#x9;measurements();&#xA;&#x9;charptr();&#xA;&#x9;storage();&#xA;};&lt;/pre&gt;&#xA;&lt;/details&gt;</description>
    </item>
    <item>
      <title>History will not remember us fondly</title>
      <link>https://drewdevault.com/2021/01/07/History-will-not-remember-us-fondly.html</link>
      <pubDate>Thu, 07 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/07/History-will-not-remember-us-fondly.html</guid>
      <description>&lt;p&gt;Today, we recall the Middle Ages as an unenlightened time (quite literally, in&#xA;fact). We view the Middle Ages with a critical eye towards its brutality, lack&#xA;of individual freedoms, and societal and technological regression. But we rarely&#xA;turn that same critical lens on ourselves to consider how we&amp;rsquo;ll be perceived by&#xA;future generations. I expect the answer, upsetting as it may be, is this: the&#xA;future will think poorly of us.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fostering a culture that values stability and reliability</title>
      <link>https://drewdevault.com/2021/01/04/A-culture-of-stability-and-reliability.html</link>
      <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/04/A-culture-of-stability-and-reliability.html</guid>
      <description>&lt;p&gt;There&amp;rsquo;s an idea which encounters a bizarre level of resistance from the broader&#xA;software community: that software can be completed. This resistance manifests in&#xA;several forms, perhaps the most common being the notion that a git repository&#xA;which doesn&amp;rsquo;t receive many commits is abandoned or less worthwhile. For my part,&#xA;I consider software that aims to be &lt;em&gt;completed&lt;/em&gt; to be more worthwhile most of&#xA;the time.&lt;/p&gt;&#xA;&lt;p&gt;There are two sources of change which projects are affected by: external and&#xA;internal. An internal source of change is, for example, a planned feature, or a&#xA;discovered bug. External sources of change are, say, when a dependency makes a&#xA;breaking change and your software has to be updated accordingly. Some projects&#xA;will necessarily have an indefinite source of external change to consider, often&#xA;as part of their value proposition. &lt;a href=&#34;https://youtube-dl.org/&#34;&gt;youtube-dl&lt;/a&gt; will always evolve to add&#xA;new sites and workarounds, &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt; will continue to grow to take advantage&#xA;of new graphics and input hardware features, and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A megacorp is not your dream job</title>
      <link>https://drewdevault.com/2021/01/01/Megacorps-are-not-your-dream-job.html</link>
      <pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2021/01/01/Megacorps-are-not-your-dream-job.html</guid>
      <description>&lt;p&gt;Megacorporations&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;em&gt;do not&lt;/em&gt; care about you. You&amp;rsquo;re worth nothing to them.&#xA;Google made $66 billion in 2014 — even if you made an exorbitant $500K&#xA;salary, you only cost them .00075% of that revenue. They are not invested in&#xA;you. Why should you invest in them? Why should you give a company that isn&amp;rsquo;t&#xA;invested in you 40+ hours of your week, half your waking life, the &lt;em&gt;only&lt;/em&gt; life&#xA;you get?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to design a new programming language from scratch</title>
      <link>https://drewdevault.com/2020/12/25/How-to-design-a-new-programming-language.html</link>
      <pubDate>Fri, 25 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/12/25/How-to-design-a-new-programming-language.html</guid>
      <description>&lt;p&gt;There is a long, difficult road from vague, pie-in-the-sky ideas about what&#xA;would be cool to have in a new programming language, to a robust,&#xA;self-consistent, practical implementation of those ideas. Designing and&#xA;implementing a new programming language from scratch is one of the most&#xA;challenging tasks a programmer can undertake.&lt;/p&gt;&#xA;&lt;p&gt;Note: this post is targeted at motivated programmers who want to make a&#xA;serious attempt at designing a useful programming language. If you just want to&#xA;make a language as a fun side project, then you can totally just wing it. Taking&#xA;on an unserious project of that nature is also a good way to develop some&#xA;expertise which will be useful for a serious project later on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>godocs.io is now available</title>
      <link>https://drewdevault.com/2020/12/18/godocs.io.html</link>
      <pubDate>Fri, 18 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/12/18/godocs.io.html</guid>
      <description>&lt;p&gt;Due to the coming sunsetting of godoc.org in favor of pkg.go.dev, I&amp;rsquo;m happy to&#xA;announce that &lt;a href=&#34;https://godocs.io&#34;&gt;godocs.io&lt;/a&gt; is now available as a replacement.&#xA;We have &lt;a href=&#34;https://sr.ht/~sircmpwn/godocs.io&#34;&gt;forked the codebase&lt;/a&gt; and cleaned&#xA;things up quite a bit, removing lots of dead or obsolete features, cleaning out&#xA;a bunch of Google-specific code and analytics, reducing the JavaScript&#xA;requirements, and rewriting the search index for Postgres. We will commit to its&#xA;maintenance going forward for anyone who prefers the original godoc.org&#xA;experience over the new website.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, December 2020</title>
      <link>https://drewdevault.com/2020/12/15/Status-update-December-2020.html</link>
      <pubDate>Tue, 15 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/12/15/Status-update-December-2020.html</guid>
      <description>&lt;p&gt;Happy holidays! I hope everyone&amp;rsquo;s having a great time staying at home and not&#xA;spending any time with your families. It&amp;rsquo;s time for another summary of the&#xA;month&amp;rsquo;s advances in FOSS development. Let&amp;rsquo;s get to it!&lt;/p&gt;&#xA;&lt;p&gt;One of my main focuses has been on sourcehut&amp;rsquo;s API 2.0 planning. This month, the&#xA;meta.sr.ht and git.sr.ht GraphQL APIs have shipped feature parity with the REST&#xA;APIs, and the RFC 6749 compatible OAuth 2.0 implementation has shipped. I&amp;rsquo;ve&#xA;broken ground on the todo.sr.ht GraphQL API — it&amp;rsquo;ll be next. Check out the&#xA;&lt;a href=&#34;https://man.sr.ht/graphql.md&#34;&gt;GraphQL docs on man.sr.ht&lt;/a&gt; if you want to kick&#xA;the tires.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Become shell literate</title>
      <link>https://drewdevault.com/2020/12/12/Shell-literacy.html</link>
      <pubDate>Sat, 12 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/12/12/Shell-literacy.html</guid>
      <description>&lt;p&gt;Shell literacy is one of the most important skills you ought to possess as a&#xA;programmer. The Unix shell is one of the most powerful ideas ever put to code,&#xA;and should be second nature to you as a programmer. No other tool is nearly as&#xA;effective at commanding your computer to perform complex tasks quickly —&#xA;or at storing them as scripts you can use later.&lt;/p&gt;&#xA;&lt;p&gt;In my workflow, I use Vim as my editor, and Unix as my &amp;ldquo;IDE&amp;rdquo;. I don&amp;rsquo;t trick out&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/dotfiles/tree/master/.vimrc&#34;&gt;my vimrc&lt;/a&gt; to add a&#xA;bunch of IDE-like features — the most substantial plugin I use on a daily&#xA;basis is &lt;a href=&#34;https://github.com/ctrlpvim/ctrlp.vim&#34;&gt;Ctrl+P&lt;/a&gt;, and that just makes it&#xA;easier to open files. Being Vim literate is a valuable skill, but an important&#xA;detail is knowing when to drop it. My daily workflow involves several open&#xA;terminals, generally one with Vim, another to run builds or daemons, and a third&#xA;which just keeps a shell handy for anything I might ask of it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web analytics should at least meet the standards of informed consent</title>
      <link>https://drewdevault.com/2020/12/04/Analytics-and-informed-consent.html</link>
      <pubDate>Fri, 04 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/12/04/Analytics-and-informed-consent.html</guid>
      <description>&lt;p&gt;Research conducted on human beings, at least outside of the domain of&#xA;technology, has to meet a minimum standard of ethical reasoning called&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Informed_consent&#34;&gt;informed consent&lt;/a&gt;. Details&#xA;vary, but the general elements of informed consent are:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Disclosure of the nature and purpose of the research and its implications&#xA;(risks and benefits) for the participant, and the confidentiality of the&#xA;collected information.&lt;/li&gt;&#xA;&lt;li&gt;An adequate understanding of these facts on the part of the participant,&#xA;requiring an accessible explanation in lay terms and an assessment of&#xA;understanding.&lt;/li&gt;&#xA;&lt;li&gt;The participant must exercise voluntary agreement, without coercion or fear&#xA;of repercussions (e.g. not being allowed to use your website).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;So, I pose the following question: if your analytics script wouldn&amp;rsquo;t pass muster&#xA;at your university&amp;rsquo;s ethics board, then what the hell is it doing on your&#xA;website? Can we not meet this basic minimum standard of ethical decency and&#xA;respect for our users?&lt;/p&gt;</description>
    </item>
    <item>
      <title>A few ways to make money in FOSS</title>
      <link>https://drewdevault.com/2020/11/20/A-few-ways-to-make-money-in-FOSS.html</link>
      <pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/11/20/A-few-ways-to-make-money-in-FOSS.html</guid>
      <description>&lt;p&gt;I work on free and open-source software full time, and I make a comfortable&#xA;living doing it. And I don&amp;rsquo;t half-ass it: 100% of my code is free and&#xA;open-source. There&amp;rsquo;s no proprietary add-ons, no periodic code dumps, just&#xA;100% bona-fide free and open source software. Others have often sought my advice&#xA;— how can they, too, make a living doing open source?&lt;/p&gt;&#xA;&lt;p&gt;Well, there&amp;rsquo;s more than one way to skin a cat. There are many varieties of&#xA;software, each with different needs, and many kinds of people, each with&#xA;different needs. The exact approach which works for you and your project will&#xA;vary quite a bit depending on the nature of your project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>We can do better than DuckDuckGo</title>
      <link>https://drewdevault.com/2020/11/17/Better-than-DuckDuckGo.html</link>
      <pubDate>Tue, 17 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/11/17/Better-than-DuckDuckGo.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://duckduckgo.com&#34;&gt;DuckDuckGo&lt;/a&gt; is one of the long-time darlings of the&#xA;technophile&amp;rsquo;s pro-privacy recommendations, and in fact the search engine that I&#xA;use myself on the daily. They certainly present a more compelling option than&#xA;many of the incumbents, like Google or Bing. Even so, DuckDuckGo is not good&#xA;enough, and we ought to do better.&lt;/p&gt;&#xA;&lt;p&gt;I have three grievances with DuckDuckGo:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s not open source.&lt;/strong&gt; Almost all of DDG&amp;rsquo;s software is proprietary, and&#xA;they&amp;rsquo;ve demonstrated &lt;a href=&#34;https://github.com/duckduckgo/Android/issues/527&#34;&gt;gross incompetence&lt;/a&gt; in privacy in what little&#xA;software they have made open source. Who knows what else is going on in the&#xA;proprietary code?&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DuckDuckGo is not a search engine&lt;/strong&gt;. It&amp;rsquo;s more aptly described as a search&#xA;engine frontend. They &lt;em&gt;do&lt;/em&gt; handle features like bangs and instant answers&#xA;internally, but their actual search results come from third-parties like&#xA;Bing. They don&amp;rsquo;t operate a crawler for their search results, and are not&#xA;independent.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The search results suck!&lt;/strong&gt; The authoritative sources for anything I want to&#xA;find are almost always buried beneath 2-5 results from content scrapers and&#xA;blogspam. This is also true of other search engines like Google. Search&#xA;engines are highly vulnerable to abuse and they aren&amp;rsquo;t doing enough to&#xA;address it.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There are some FOSS attempts to do better here, but they all fall flat.&#xA;&lt;a href=&#34;https://github.com/bauruine/searx/&#34;&gt;searX&lt;/a&gt; is also a false search engine&#xA;— that is, they serve someone else&amp;rsquo;s results. &lt;a href=&#34;https://yacy.net/&#34;&gt;YaCy&lt;/a&gt;&#xA;has their own crawler, but the distributed design makes results untolerably&#xA;slow, poor quality, and vulnerable to abuse, and it&amp;rsquo;s missing strong central&#xA;project leadership.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, November 2020</title>
      <link>https://drewdevault.com/2020/11/15/Status-update-November-2020.html</link>
      <pubDate>Sun, 15 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/11/15/Status-update-November-2020.html</guid>
      <description>&lt;p&gt;Greetings, humanoids! Our fleshy vessels have aged by 2.678×10⁶ seconds, and you&#xA;know what that means: time for another status update! Pour a cup of your&#xA;favorite beverage stimulant and gather &amp;lsquo;round for some news.&lt;/p&gt;&#xA;&lt;p&gt;First off, today is the second anniversary of SourceHut&amp;rsquo;s alpha being opened to&#xA;the public, and as such, I&amp;rsquo;ve prepared a special &lt;a href=&#34;https://sourcehut.org/blog/2020-11-15-sourcehut-2-year-alpha/&#34;&gt;blog post&lt;/a&gt; for&#xA;you to read. I&amp;rsquo;ll leave the sr.ht details out of this post and just send you off&#xA;to read about it there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Utility vs usability</title>
      <link>https://drewdevault.com/2020/11/06/Utility-vs-usability.html</link>
      <pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/11/06/Utility-vs-usability.html</guid>
      <description>&lt;p&gt;In many fields, professional-grade tooling requires a high degree of knowledge&#xA;and training to use properly, usually more than is available to the amateur. The&#xA;typical mechanic&amp;rsquo;s tool chest makes my (rather well-stocked, in my opinion) tool&#xA;bag look quite silly. A racecar driver is using a vehicle which is much more&#xA;complex than, say, the soccer mom&amp;rsquo;s mini-van. Professional-grade tools are,&#xA;necessarily, more complex and require skill to use.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is this Gemini thing anyway, and why am I excited about it?</title>
      <link>https://drewdevault.com/2020/11/01/What-is-Gemini-anyway.html</link>
      <pubDate>Sun, 01 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/11/01/What-is-Gemini-anyway.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing about some specific topics in the realm of Gemini on my blog&#xA;over the past two months or so, but I still haven&amp;rsquo;t written a broader&#xA;introduction to Gemini, what I&amp;rsquo;m doing with it, and why you should be excited&#xA;about it, too. Let&amp;rsquo;s do that today!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gemini.circumlunar.space/&#34;&gt;Gemini&lt;/a&gt; is a network protocol for exchanging&#xA;hypertext documents — &amp;ldquo;hypertext&amp;rdquo; in the general sense of the word, not&#xA;with respect to the hypertext markup language (HTML) that web browsers&#xA;understand. It&amp;rsquo;s a simple network protocol which allows clients to request&#xA;hypertext documents (in its own document format, gemtext). It is, in some&#xA;respects, an evolution of &lt;a href=&#34;https://en.wikipedia.org/wiki/Gopher_(protocol)&#34;&gt;Gopher&lt;/a&gt;, but more modernized and streamlined.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m handing over maintenance of wlroots and sway to Simon Ser</title>
      <link>https://drewdevault.com/2020/10/23/Im-handing-wlroots-and-sway-to-Simon.html</link>
      <pubDate>Fri, 23 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/10/23/Im-handing-wlroots-and-sway-to-Simon.html</guid>
      <description>&lt;p&gt;Over the past several months, I&amp;rsquo;ve been gradually weaning down my role in both&#xA;projects, and as a contributor to Wayland in general. I feel that I&amp;rsquo;ve already&#xA;accomplished everything I set out to do with Wayland — and more! I have&#xA;been happily using sway as my daily driver for well over a year with no&#xA;complaints or conspicuously absent features. For me, there&amp;rsquo;s little reason to&#xA;stay involved. This will likely come as no surprise to many who&amp;rsquo;ve kept their&#xA;ear to the ground in these communities.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firefox: The Jewel^WEmbarassment of Open Source</title>
      <link>https://drewdevault.com/2020/10/22/Firefox-the-embarassment-of-FOSS.html</link>
      <pubDate>Thu, 22 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/10/22/Firefox-the-embarassment-of-FOSS.html</guid>
      <description>&lt;p&gt;Circa 2006, the consensus on Firefox was concisely stated by this classic xkcd:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://xkcd.com/198/&#34;&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/perspective.png&#34; alt=&#34;A stick-figure comic. The title reads “Sometimes, when I first wake up, I am caught in the horrible grip of perspective.” The character, waking up, says “It may be a jewel of open source, but Firefox is just a browser. It shows webpages. What the hell is wrong with us?” The caption reads “Fortunately, this subsides quickly.”&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, October 2020</title>
      <link>https://drewdevault.com/2020/10/15/Status-update-October-2020.html</link>
      <pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/10/15/Status-update-October-2020.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m writing this month&amp;rsquo;s status update from a brand-new desktop workstation&#xA;(well, I re-used the GPU), my first new workstation in about 10 years. I hope&#xA;this new one lasts for another decade! I aimed for something smaller and&#xA;lightweight this time — it&amp;rsquo;s a Mini-ITX build. I&amp;rsquo;ve only been running this&#xA;for a few days, so let me tell you about the last few accomplishments which are&#xA;accountable to my venerable workstation&amp;rsquo;s final days of life.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Four principles of software engineering</title>
      <link>https://drewdevault.com/2020/10/09/Four-principles-of-software-engineering.html</link>
      <pubDate>Fri, 09 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/10/09/Four-principles-of-software-engineering.html</guid>
      <description>&lt;p&gt;Software should be &lt;strong&gt;robust&lt;/strong&gt;. It should be designed to accommodate all known&#xA;edge cases. In practice, this means predicting and handling all known error&#xA;cases, enumerating and addressing all classes of user inputs, reasoning about&#xA;and planning for the performance characteristics of your program, and so on.&lt;/p&gt;&#xA;&lt;p&gt;Software should be &lt;strong&gt;reliable&lt;/strong&gt;. It should be expected to work for an extended&#xA;length of time under design conditions without failures. Ideally, it should work&#xA;outside of design conditions up to some threshold.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spamtoberfest</title>
      <link>https://drewdevault.com/2020/10/01/Spamtoberfest.html</link>
      <pubDate>Thu, 01 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/10/01/Spamtoberfest.html</guid>
      <description>&lt;p&gt;As I&amp;rsquo;ve &lt;a href=&#34;https://drewdevault.com/2020/08/10/How-to-contribute-to-FOSS.html&#34;&gt;written before&lt;/a&gt;, the best contributors to a FOSS project are&#xA;intrinsically motivated to solve problems in your software. This sort of&#xA;contribution is often fixing an important problem and places a smaller burden on&#xA;maintainers to spend their time working with the contributor. I&amp;rsquo;ve previously&#xA;contrasted this with the &amp;ldquo;I want to help out!&amp;rdquo; contributions, where a person&#xA;just has a vague desire to help out. Those contributions are, generally, less&#xA;valuable and place a greater burden on the maintainer. Now, DigitalOcean has&#xA;lowered the bar even further with Hacktoberfest.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A tale of two libcs</title>
      <link>https://drewdevault.com/2020/09/25/A-story-of-two-libcs.html</link>
      <pubDate>Fri, 25 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/09/25/A-story-of-two-libcs.html</guid>
      <description>&lt;p&gt;I received a bug report from Debian today, who had fed some garbage into&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/scdoc&#34;&gt;scdoc&lt;/a&gt;, and it gave them a SIGSEGV back.&#xA;Diving into this problem gave me a good opportunity to draw a comparison between&#xA;musl libc and glibc. Let&amp;rsquo;s start with the stack trace:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;==26267==ERROR: AddressSanitizer: SEGV on unknown address 0x7f9925764184&#xA;(pc 0x0000004c5d4d bp 0x000000000002 sp 0x7ffe7f8574d0 T0)&#xA;==26267==The signal is caused by a READ memory access.&#xA;    0 0x4c5d4d in parse_text /scdoc/src/main.c:223:61&#xA;    1 0x4c476c in parse_document /scdoc/src/main.c&#xA;    2 0x4c3544 in main /scdoc/src/main.c:763:2&#xA;    3 0x7f99252ab0b2 in __libc_start_main&#xA;/build/glibc-YYA7BZ/glibc-2.31/csu/../csu/libc-start.c:308:16&#xA;    4 0x41b3fd in _start (/scdoc/scdoc+0x41b3fd)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And if we pull up that line of code, we find&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>TOFU recommendations for Gemini</title>
      <link>https://drewdevault.com/2020/09/21/Gemini-TOFU.html</link>
      <pubDate>Mon, 21 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/09/21/Gemini-TOFU.html</guid>
      <description>&lt;p&gt;I will have more to say about &lt;a href=&#34;https://gemini.circumlunar.space/&#34;&gt;Gemini&lt;/a&gt; in the future, but for now, I wanted to&#xA;write up some details about one thing in particular: the trust-on-first-use&#xA;algorithm I implemented for my client, &lt;a href=&#34;https://sr.ht/~sircmpwn/gmni&#34;&gt;gmni&lt;/a&gt;. I think you should implement&#xA;this algorithm, too!&lt;/p&gt;&#xA;&lt;p&gt;First of all, it&amp;rsquo;s important to note that the Gemini specification explicitly&#xA;mentions TOFU and the role of self-signed certificates: they are the norm in&#xA;Geminiland, and if your client does not support them then you&amp;rsquo;re going to be&#xA;unable to browse many sites. However, the exact details are left up to the&#xA;implementation. Here&amp;rsquo;s what mine does:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The unrealized potential of federation</title>
      <link>https://drewdevault.com/2020/09/20/The-potential-of-federation.html</link>
      <pubDate>Sun, 20 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/09/20/The-potential-of-federation.html</guid>
      <description>&lt;p&gt;There are some major problems on the internet which may seem intractable. How do&#xA;we prevent centralization of our communication tools under the authority of a&#xA;few, whose motivations may not align with our interests? How do we build&#xA;internet-scale infrastructure without a megacorp-scale budget? Can we make our&#xA;systems reliable and fault-tolerant — in the face of technical &lt;em&gt;and&lt;/em&gt;&#xA;social problems?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Federation&lt;/strong&gt; is an idea which takes a swing at all of these problems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, September 2020</title>
      <link>https://drewdevault.com/2020/09/15/Status-update-September-2020.html</link>
      <pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/09/15/Status-update-September-2020.html</guid>
      <description>&lt;p&gt;A mercifully cool September is upon us, and after years of searching, I finally&#xA;was able to secure Club Mate in the US. Let&amp;rsquo;s decant a bottle and recant the&#xA;story of this month&amp;rsquo;s progress in free software development.&lt;/p&gt;&#xA;&lt;p&gt;First of all, I&amp;rsquo;ve been able to put a pin on operations work on SourceHut for&#xA;the time being, and focus again on its software development. The GraphQL APIs&#xA;are a major focus area here, and I&amp;rsquo;ve made a lot of progress towards OAuth 2.0&#xA;support and writable GraphQL APIs. Additionally, I&amp;rsquo;ve laid out a number of&#xA;prioritized tickets for the beta — with the &amp;ldquo;beta&amp;rdquo; label on todo.sr.ht&#xA;— and have been picking items off of the list one at a time, mainly&#xA;focusing on meta.sr.ht improvements at first. I&amp;rsquo;ll go into more detail in the&#xA;What&amp;rsquo;s Cooking post for SourceHut later today, stay tuned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux development is distributed - profoundly so</title>
      <link>https://drewdevault.com/2020/09/02/Linux-development-is-profoundly-distributed.html</link>
      <pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/09/02/Linux-development-is-profoundly-distributed.html</guid>
      <description>&lt;p&gt;The standard introduction to git starts with an explanation of what it means to&#xA;use a &amp;ldquo;distributed&amp;rdquo; version control system. It&amp;rsquo;s pointed out that every&#xA;developer has a complete local copy of the repository and can work independently&#xA;and offline, often contrasting this design with systems like SVN and CVS.  The&#xA;explanation usually stops here. If you want to learn more, consider git&amp;rsquo;s roots:&#xA;it is the version control system purpose-built for Linux, the largest and most&#xA;active open source project in the world. To learn more about the true nature of&#xA;distributed development, we should observe Linux.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embrace, extend, and finally extinguish - Microsoft plays their hand</title>
      <link>https://drewdevault.com/2020/08/27/Microsoft-plays-their-hand.html</link>
      <pubDate>Thu, 27 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/27/Microsoft-plays-their-hand.html</guid>
      <description>&lt;p&gt;GitHub took a note out of the Microsoft &amp;ldquo;&lt;abbr title=&#34;Embrace, Extend,&#xA;Extinguish&#34;&gt;EEE&lt;/abbr&gt;&amp;rdquo; playbook when designing their git services. They&#xA;&lt;strong&gt;embraced&lt;/strong&gt; git, and then rather than building an interface on top of email&#xA;— the collaboration mechanism that git was designed to use, and which is&#xA;still used for Linux kernel development&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; — they built their &amp;ldquo;pull&#xA;requests&amp;rdquo; mechanism.&lt;/p&gt;&#xA;&lt;p&gt;They took terminology which already had meaning — &amp;ldquo;fork&amp;rdquo;, meaning the&#xA;creation a separate governing body and development upstream for a codebase, a&#xA;rather large task; and &amp;ldquo;pull request&amp;rdquo;, a git workflow which prepares an email&#xA;asking a receipient to pull a large branch of changes from a non-centralized&#xA;source — and replaced these decentralized, open systems with a completely&#xA;incompatible system designed to keep you on GitHub and to teach you to&#xA;collaborate using GitHub&amp;rsquo;s proprietary tools. They &lt;strong&gt;extended&lt;/strong&gt; git in a&#xA;proprietary way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Alice in Wonderland and the theft of the public domain</title>
      <link>https://drewdevault.com/2020/08/24/Alice-in-Wonderland.html</link>
      <pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/24/Alice-in-Wonderland.html</guid>
      <description>&lt;p&gt;Disney&amp;rsquo;s &lt;em&gt;Alice in Wonderland&lt;/em&gt; is one of my favorite movies and an undisputed&#xA;classic. After its release in 1951, &lt;em&gt;Alice&lt;/em&gt; holds a fond place in billions of&#xA;children&amp;rsquo;s hearts, over almost four generations. And it has been stolen from&#xA;those generations, as part of the theft of one of these generations&amp;rsquo; greatest&#xA;treasures: the public domain.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://redacted.moe/f/5e5f11ef.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I often use this film as an example when arguing about copyright. Almost&#xA;everyone I speak to was born well after the film&amp;rsquo;s release (in fact, this is&#xA;true of almost everyone &lt;em&gt;alive today&lt;/em&gt;), but they remember it fondly regardless.&#xA;Many people I&amp;rsquo;ve spoken to would agree that it even played a formative role in&#xA;their childhoods; it&amp;rsquo;s a film dear to many hearts. My mom is very fond of the&#xA;Cheshire Cat in particular, and owns quite a bit of relevant merchandise.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software engineers solve problems</title>
      <link>https://drewdevault.com/2020/08/17/Engineers-solve-problems.html</link>
      <pubDate>Mon, 17 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/17/Engineers-solve-problems.html</guid>
      <description>&lt;p&gt;Software engineers solve problems. A problem you may have encountered is, for&#xA;example, &amp;ldquo;this function has a bug&amp;rdquo;, and you&amp;rsquo;re probably already more or less&#xA;comfortable solving these problems. Here are some other problems you might&#xA;encounter on the way:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Actually, the bug ultimately comes from a third-party program&lt;/li&gt;&#xA;&lt;li&gt;Hm, it uses a programming language I don&amp;rsquo;t know&lt;/li&gt;&#xA;&lt;li&gt;Oh, the bug is in that programming language&amp;rsquo;s compiler&lt;/li&gt;&#xA;&lt;li&gt;This subsystem of the compiler would have to be overhauled&lt;/li&gt;&#xA;&lt;li&gt;And the problem is overlooked by the language specification&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve met many engineers who, when standing at the base of this mountain,&#xA;conclude that the summit is too far away and clearly not their responsibility,&#xA;and subsequently give up. But remember: as an engineer, your job is to apply&#xA;creativity to solving problems. Are these not themselves problems to which the&#xA;engineering process may be applied?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, August 2020</title>
      <link>https://drewdevault.com/2020/08/16/Status-update.html</link>
      <pubDate>Sun, 16 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/16/Status-update.html</guid>
      <description>&lt;p&gt;Greetings! Today is another rainy day here in Philadelphia, which rather sours&#xA;my plans of walking over to the nearby cafe to order some breakfast to-go. But I&#xA;am tired, and if I&amp;rsquo;m going to make it to the end of this blog post in one piece,&#xA;I&amp;rsquo;m gonna need a coffee. brb.&lt;/p&gt;&#xA;&lt;p&gt;Hey, that was actually pretty refreshing. It&amp;rsquo;s just drizzling, and the rain is&#xA;nice and cool. Alright, here goes! What&amp;rsquo;s new? I&amp;rsquo;ll leave the Wayland news for&#xA;&lt;a href=&#34;https://emersion.fr/blog&#34;&gt;Simon Ser&amp;rsquo;s blog&lt;/a&gt; this month - he&amp;rsquo;s been working on&#xA;some exciting stuff. The &lt;a href=&#34;https://baremessages.org/&#34;&gt;BARE encoding&lt;/a&gt; announced&#xA;last month has received some great feedback and refinements, and there are now&#xA;six projects providing BARE support for their author&amp;rsquo;s favorite programming&#xA;language&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. There have also been some improvements to the Go implementation&#xA;which should help with some SourceHut plans later on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web browsers need to stop</title>
      <link>https://drewdevault.com/2020/08/13/Web-browsers-need-to-stop.html</link>
      <pubDate>Thu, 13 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/13/Web-browsers-need-to-stop.html</guid>
      <description>&lt;p&gt;Enough is enough.&lt;/p&gt;&#xA;&lt;p&gt;The web and web browsers have become Lovecraftian horrors of an unprecedented&#xA;scale. They&amp;rsquo;ve long since left &amp;ldquo;scope creep&amp;rdquo; territory and entered &amp;ldquo;oh my god&#xA;please just stop&amp;rdquo; territory, and are trucking on through to hitherto unexplored&#xA;degrees of &lt;em&gt;obscene&lt;/em&gt; scope. And we &lt;em&gt;don&amp;rsquo;t want&lt;/em&gt; what they&amp;rsquo;re selling. Google&#xA;pitches garbage like AMP&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and pushing dubious half-assed specs like Web&#xA;Components. Mozilla just fired everyone relevant&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; to focus on crap no one&#xA;asked for like Pocket, and fad nonsense like a paid VPN service and &lt;del&gt;virtual&#xA;reality tech&lt;/del&gt;.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;em&gt;[2020-08-14: It has been pointed out that the VR team was&#xA;also fired.]&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>I want to contribute to your project, how do I start?</title>
      <link>https://drewdevault.com/2020/08/10/How-to-contribute-to-FOSS.html</link>
      <pubDate>Mon, 10 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/10/How-to-contribute-to-FOSS.html</guid>
      <description>&lt;p&gt;I get this question a lot! The answer is usually&amp;hellip; don&amp;rsquo;t. If you already know&#xA;what you want to do, then the question doesn&amp;rsquo;t need to be asked.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; But, if you&#xA;don&amp;rsquo;t already know what you want to do, then your time might be better spent&#xA;elsewhere!&lt;/p&gt;&#xA;&lt;p&gt;The best contributors are always intrinsically motivated. Some contributors show&#xA;up every now and then who appreciate the value the project gives to them and&#xA;want to give something back. Their gratitude is definitely appreciated&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, but&#xA;these kinds of contributions tend to require more effort from the maintainers,&#xA;and don&amp;rsquo;t generally lead to recurring contributions. Projects you already like&#xA;are less likely to need help when compared to incomplete projects that you don&amp;rsquo;t&#xA;already depend on — so this model leaves newer projects with fewer&#xA;contributors and encourages established projects to grow in complexity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pkg.go.dev is more concerned with Google&#39;s interests than good engineering</title>
      <link>https://drewdevault.com/2020/08/01/pkg-go-dev-sucks.html</link>
      <pubDate>Sat, 01 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/08/01/pkg-go-dev-sucks.html</guid>
      <description>&lt;p&gt;pkg.go.dev sucks. It&amp;rsquo;s certainly &lt;em&gt;prettier&lt;/em&gt; than godoc.org, but under the&#xA;covers, it&amp;rsquo;s a failure of engineering characteristic of the Google approach.&lt;/p&gt;&#xA;&lt;p&gt;Go is a &lt;em&gt;pretty good&lt;/em&gt; programming language. I have long held that this is not&#xA;attributable to Google&amp;rsquo;s stewardship, but rather to a small number of language&#xA;designers and a clear line of influences which is drawn entirely from outside of&#xA;Google — mostly from Bell Labs. pkg.go.dev provides renewed support for my&#xA;argument: it has all the hallmarks of Google crapware and none of the&#xA;deliberate, good engineering work that went into Go&amp;rsquo;s design.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The falsehoods of anti-AGPL propaganda</title>
      <link>https://drewdevault.com/2020/07/27/Anti-AGPL-propaganda.html</link>
      <pubDate>Mon, 27 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/07/27/Anti-AGPL-propaganda.html</guid>
      <description>&lt;p&gt;Google is well-known for &lt;a href=&#34;https://opensource.google/docs/using/agpl-policy/&#34;&gt;forbidding the use of&lt;/a&gt; software&#xA;using the &lt;a href=&#34;https://www.gnu.org/licenses/agpl-3.0.en.html&#34;&gt;GNU Affero General Public License&lt;/a&gt;, commonly known as &amp;ldquo;AGPL&amp;rdquo;.&#xA;Google is also well-known for being the subject of cargo-culting by fad&#xA;startups. Unfortunately, this means that they are susceptible to what is&#xA;ultimately anti-AGPL propaganda from Google, with little to no basis in fact.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Obligatory: I&amp;rsquo;m not a lawyer; this is for informational purposes only.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;In truth, the terms of the AGPL are pretty easy to comply with. The basic&#xA;obligations of the AGPL which set it apart from other licenses are as follows:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, July 2020</title>
      <link>https://drewdevault.com/2020/07/15/Status-update-July-2020.html</link>
      <pubDate>Wed, 15 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/07/15/Status-update-July-2020.html</guid>
      <description>&lt;p&gt;Hello again! Another month of FOSS development behind us, and we&amp;rsquo;re back again&#xA;to share the results. I took a week off at the end of June, so my progress this&#xA;month is somewhat less than usual. Regardless, I have some updates for you,&#xA;mainly in the domain of SourceHut work.&lt;/p&gt;&#xA;&lt;p&gt;But before we get to that, let&amp;rsquo;s go over this month&amp;rsquo;s small victories. One was&#xA;the invention of the &lt;a href=&#34;https://baremessages.org&#34;&gt;BARE message format&lt;/a&gt;, which I&#xA;wrote &lt;a href=&#34;https://drewdevault.com/2020/06/21/BARE-message-encoding.html&#34;&gt;a blog post about&lt;/a&gt; if you want to learn more. Since that&#xA;article, five new implementations have appeared from various authors: Rust,&#xA;Python, JavaScript, D, and Zig.&lt;/p&gt;</description>
    </item>
    <item>
      <title>March 2nd, 1943</title>
      <link>https://drewdevault.com/2020/07/14/March-2nd-1943.html</link>
      <pubDate>Tue, 14 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/07/14/March-2nd-1943.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s March 2nd, 1943. The user asks your software to schedule a meeting with&#xA;Acmecorp at &amp;ldquo;9 AM on the first Monday of next month&amp;rdquo;.&lt;/p&gt;&#xA;&lt;pre&gt;&#xA;&lt;code&gt;&#xA;[6:17:45] homura ~ $ cal -3 2 March 1943&#xA;    February 1943          March 1943            April 1943&#xA;Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa&#xA;    1  2  3  4  5  6      1 &lt;span style=&#34;background: black; color: white&#34;&gt; 2&lt;/span&gt; 3  4  5  6               1  2  3&#xA; 7  8  9 10 11 12 13   7  8  9 10 11 12 13   4 &lt;span style=&#34;background: #666; color: white&#34;&gt; 5&lt;/span&gt;  6  7  8  9 10&#xA;14 15 16 17 18 19 20  14 15 16 17 18 19 20  11 12 13 14 15 16 17&#xA;21 22 23 24 25 26 27  21 22 23 24 25 26 27  18 19 20 21 22 23 24&#xA;28                    28 29 30 31           25 26 27 28 29 30&#xA;&lt;/code&gt;&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;Right now, California is on Pacific Standard Time (PST) and Arizona is on&#xA;Mountain Standard Time (MST). On March 8th, California will transition to&#xA;Pacific Daylight Time (PDT), one hour ahead. Arizona does not observe DST, so&#xA;they&amp;rsquo;ll stay behind.&lt;/p&gt;</description>
    </item>
    <item>
      <title>General-purpose OS, special-purpose OS, and now: vendor-purpose OS</title>
      <link>https://drewdevault.com/2020/06/26/Vendor-purpose-OS.html</link>
      <pubDate>Fri, 26 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/06/26/Vendor-purpose-OS.html</guid>
      <description>&lt;p&gt;There have, historically, been two kinds of operating systems: general-purpose,&#xA;and special-purpose. These roles are defined by the function they serve for the&#xA;user. Examples of general-purpose operating systems include Unix (Linux, BSD,&#xA;etc), Solaris, Haiku, Plan 9, and so on. These are well-suited to general&#xA;computing tasks, and are optimized to solve the most problems possible, perhaps&#xA;at the expense of those in some niche domains. Special-purpose operating systems&#xA;serve those niche domains, and are less suitable for general computing. Examples&#xA;of these include FreeRTOS, Rockbox, Genode, and so on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing the BARE message encoding</title>
      <link>https://drewdevault.com/2020/06/21/BARE-message-encoding.html</link>
      <pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/06/21/BARE-message-encoding.html</guid>
      <description>&lt;p&gt;I like stateless tokens. We started with state&lt;em&gt;ful&lt;/em&gt; tokens: where a generated&#xA;string acts as a unique identifier for a resource, and the resource itself is&#xA;looked up separately. For example, your sr.ht OAuth token is a stateful token:&#xA;we just generate a random number and hand it to you, something like&#xA;&amp;ldquo;a97c4aeeec705f81539aa&amp;rdquo;. To find the information associated with this token, we&#xA;query the database — our local &lt;em&gt;state&lt;/em&gt; — to find it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, June 2020</title>
      <link>https://drewdevault.com/2020/06/15/Status-update-June-2020.html</link>
      <pubDate>Mon, 15 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/06/15/Status-update-June-2020.html</guid>
      <description>&lt;p&gt;Like last month, I am writing to you from the past, preparing this status update&#xA;a day earlier than usual. This time it&amp;rsquo;s because I expect to be busy with&#xA;planned sr.ht maintenance tomorrow, so I&amp;rsquo;m getting the status updates written&#xA;ahead of time.&lt;/p&gt;&#xA;&lt;p&gt;aerc has seen lots of patches merged recently thanks to the hard work of&#xA;co-maintainer Reto Brunner and the many contributors who sent patches, ranging&#xA;from a scrollable folder list to improvements and bugfixes for PGP support. We&#xA;wrapped all of this up in the aerc 0.4.0 release in late May. Thanks to Reto and&#xA;all of the other contributors for their hard work on aerc!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Can we talk about client-side certificates?</title>
      <link>https://drewdevault.com/2020/06/12/Can-we-talk-about-client-side-certs.html</link>
      <pubDate>Fri, 12 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/06/12/Can-we-talk-about-client-side-certs.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m working on improving the means by which API users authenticate with the&#xA;SourceHut API. Today, I was reading &lt;a href=&#34;https://tools.ietf.org/html/rfc6749&#34;&gt;RFC 6749&lt;/a&gt; (OAuth2) for this purpose,&#xA;and it got me thinking about the original OAuth spec. I recalled vaguely that it&#xA;had the API clients actually &lt;em&gt;sign&lt;/em&gt; every request, and&amp;hellip; &lt;a href=&#34;https://tools.ietf.org/html/rfc5849&#34;&gt;yep, indeed it&#xA;does&lt;/a&gt;. This also got me thinking: what else signs requests? TLS!&lt;/p&gt;&#xA;&lt;p&gt;OAuth is very complicated. The RFC is 76 pages long, the separate bearer token&#xA;RFC (6750) is another 18, and no one has ever read either of them. Add JSON Web&#xA;Tokens (RFC 7519, 30 pages), too. The process is complicated and everyone&#xA;implements it themselves — a sure way to make mistakes in a&#xA;security-critical component. Not all of the data is authenticated, no&#xA;cryptography is involved at any step, and it&amp;rsquo;s easy for either party to end up&#xA;in an unexpected state. The server has to deal with problems of revocation and&#xA;generating a secure token itself. Have you ever met anyone who feels positively&#xA;about OAuth?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Add a &#34;contrib&#34; directory to your projects</title>
      <link>https://drewdevault.com/2020/06/06/Add-a-contrib-directory.html</link>
      <pubDate>Sat, 06 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/06/06/Add-a-contrib-directory.html</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a common pattern among free- and open-source software projects to&#xA;include a &amp;ldquo;contrib&amp;rdquo; directory at the top of their source code tree. I&amp;rsquo;ve seen&#xA;this in many projects for many years, but I&amp;rsquo;ve seen it discussed only rarely&#xA;— so here we are!&lt;/p&gt;&#xA;&lt;p&gt;The contrib directory is used as an unorganized (or, at best, lightly organized)&#xA;bin of various useful things &lt;strong&gt;contrib&lt;/strong&gt;uted by the community around the&#xA;software, but which is not necessarily a good candidate for being a proper part&#xA;of the software. Things in contrib should not be wired into your build system,&#xA;shouldn&amp;rsquo;t be part of your automated testing, shouldn&amp;rsquo;t be included in your&#xA;documentation, and should not be installed with your packages. contrib entries&#xA;are not supported by the maintainers, and are given only a light code review at&#xA;the most. There is no guarantee whatsoever of workitude or maintenance for&#xA;anything found in contrib.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, May 2020</title>
      <link>https://drewdevault.com/2020/05/15/Status-update-May-2020.html</link>
      <pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/05/15/Status-update-May-2020.html</guid>
      <description>&lt;p&gt;Hello, future readers! I am writing to you from one day in the past. I finished&#xA;my plans for today early and thought I&amp;rsquo;d get a head start on writing the status&#xA;updates for tomorrow, or rather, for today. From your reference frame, that is.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start with Wayland. First, as you might have heard, &lt;a href=&#34;https://wayland-book.com&#34;&gt;The Wayland&#xA;Protocol&lt;/a&gt; is now free for anyone to read, and has been&#xA;relicensed as CC-BY-SA. Enjoy! It&amp;rsquo;s still not quite done, but most of it&amp;rsquo;s&#xA;there. In development news, wlroots continues to enjoy incremental improvements,&#xA;and is being refined further and further towards a perfect citizen of the&#xA;ecosystem in which it resides. Sway as well has seen many small bugfixes and&#xA;improvements. Both have been been stable for a while now: the only meaningful&#xA;changes will be, for the most part, a steady stream of bug fixes and performance&#xA;improvements.&lt;/p&gt;</description>
    </item>
    <item>
      <title>We are complicit in our employer&#39;s deeds</title>
      <link>https://drewdevault.com/2020/05/05/We-are-complicit-in-our-employers-deeds.html</link>
      <pubDate>Tue, 05 May 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/05/05/We-are-complicit-in-our-employers-deeds.html</guid>
      <description>&lt;p&gt;Tim Bray&amp;rsquo;s excellent &amp;ldquo;&lt;a href=&#34;https://www.tbray.org/ongoing/When/202x/2020/04/29/Leaving-Amazon&#34;&gt;Bye Amazon&lt;/a&gt;&amp;rdquo; post inspired me to take this&#xA;article off of my backlog, where it has been sitting for a few weeks. I applaud&#xA;Tim for stepping down from a company that has demonstrated itself incompatible&#xA;with his sense of right and wrong, and I want to take a moment to remind you&#xA;that the rest of us in the tech industry have the same opportunity — no,&#xA;the same &lt;em&gt;obligation&lt;/em&gt; as Tim did.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to store data forever</title>
      <link>https://drewdevault.com/2020/04/22/How-to-store-data-forever.html</link>
      <pubDate>Wed, 22 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/04/22/How-to-store-data-forever.html</guid>
      <description>&lt;p&gt;As someone who has been often maligned by the disappearance of my data for&#xA;various reasons — companies going under, hard drive failure, etc —&#xA;and as someone who is responsible for the safekeeping of other people&amp;rsquo;s data,&#xA;I&amp;rsquo;ve put a lot of thought into solutions for long-term data retention.&lt;/p&gt;&#xA;&lt;p&gt;There are two kinds of long-term storage, with different concerns: cold storage&#xA;and hot storage. The former is like a hard drive in your safe — it stores&#xA;your data, but you&amp;rsquo;re not actively using it or putting wear on the storage&#xA;medium. By contrast, hot storage is storage which is available immediately and&#xA;undergoing frequent reads and writes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Configuring aerc for git via email</title>
      <link>https://drewdevault.com/2020/04/20/Configuring-aerc-for-git.html</link>
      <pubDate>Mon, 20 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/04/20/Configuring-aerc-for-git.html</guid>
      <description>&lt;p&gt;I use &lt;a href=&#34;https://aerc-mail.org&#34;&gt;aerc&lt;/a&gt; as my email client (naturally — I&#xA;wrote it, after all), and I use &lt;a href=&#34;https://git-send-email.io&#34;&gt;git send-email&lt;/a&gt; to&#xA;receive patches to many of my projects. I designed aerc specifically to be&#xA;productive for this workflow, but there are a few extra things that I use in my&#xA;personal aerc configuration that I thought were worth sharing briefly. This blog&#xA;post will be boring and clerical, feel free to skip it unless it&amp;rsquo;s something&#xA;you&amp;rsquo;re interested in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, April 2020</title>
      <link>https://drewdevault.com/2020/04/15/Status-update-April-2020.html</link>
      <pubDate>Wed, 15 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/04/15/Status-update-April-2020.html</guid>
      <description>&lt;p&gt;Wow, it&amp;rsquo;s already time for another status update? I&amp;rsquo;m starting to lose track of&#xA;the days stuck inside. I have it easier than many - I was already used to&#xA;working from home before any of this began. But, weeks and weeks of not spending&#xA;IRL time with anyone else is starting to get to me. Remember to call your&#xA;friends and family and let them know how you&amp;rsquo;re doing. Meanwhile, I&amp;rsquo;ve had a&#xA;productive month - let&amp;rsquo;s get you up to date!&lt;/p&gt;</description>
    </item>
    <item>
      <title>My unorthodox, branchless git workflow</title>
      <link>https://drewdevault.com/2020/04/06/My-weird-branchless-git-workflow.html</link>
      <pubDate>Mon, 06 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/04/06/My-weird-branchless-git-workflow.html</guid>
      <description>&lt;p&gt;I have been using git for a while, and I took the time to learn about it in&#xA;great detail. Equipped with an understanding of its internals and a comfortable&#xA;familiarity with tools like &lt;a href=&#34;https://git-rebase.io&#34;&gt;git rebase&lt;/a&gt; — and a&#xA;personal, intrinsic desire to strive for minimal and lightweight solutions&#xA;— I have organically developed a workflow which is, admittedly, somewhat&#xA;unorthodox.&lt;/p&gt;&#xA;&lt;p&gt;In short, I use git branches very rarely, preferring to work on my local master&#xA;branch almost every time. When I want to work on multiple tasks in the same&#xA;repository (i.e. often), I just&amp;hellip; work on all of them on master. I waste no&#xA;time creating a new branch, or switching to another branch to change contexts; I&#xA;just start writing code and committing changes, all directly on master,&#xA;intermixing different workstreams freely.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; This reduces my startup time to&#xA;zero, both for starting new tasks and revisiting old work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Designing and 3D printing a new part for my truck</title>
      <link>https://drewdevault.com/2020/03/25/Designing-a-replacement-part-for-my-truck.html</link>
      <pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/03/25/Designing-a-replacement-part-for-my-truck.html</guid>
      <description>&lt;p&gt;I drove a car daily for many years while I was living in Colorado, California,&#xA;and New Jersey, but since I moved to Philadelphia I have not needed a car. The&#xA;public transit here is not great, but it&amp;rsquo;s good enough to get where I need to be&#xA;and it&amp;rsquo;s a lot easier than worrying about parking a car. However, in the past&#xA;couple of years, I have been moving more and more large server parts back and&#xA;forth to the datacenter for SourceHut. I&amp;rsquo;ve also developed an interest in&#xA;astronomy, which benefits from being able to carry large equipment to remote&#xA;places. These reasons, among others, put me into the market for a vehicle once&#xA;again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The reckless, infinite scope of web browsers</title>
      <link>https://drewdevault.com/2020/03/18/Reckless-limitless-scope.html</link>
      <pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/03/18/Reckless-limitless-scope.html</guid>
      <description>&lt;p&gt;Since the first browser war between Netscape and Internet Explorer, web browsers&#xA;have been using features as their primary means of competing with each other.&#xA;This strategy of unlimited scope and perpetual feature creep is reckless, and&#xA;has been allowed to go on for far too long.&lt;/p&gt;&#xA;&lt;p&gt;I used wget to download all 1,217 of the &lt;a href=&#34;https://www.w3.org/TR/&#34;&gt;W3C specifications&lt;/a&gt;&#xA;which have been published at the time of writing&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, of which web browsers need&#xA;to implement a substantial subset in order to provide a modern web experience.&#xA;I ran a word count on all of these specifications. How complex would you guess&#xA;the web is?&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub&#39;s new notifications: a case of regressive design</title>
      <link>https://drewdevault.com/2020/03/13/GitHub-notifications.html</link>
      <pubDate>Fri, 13 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/03/13/GitHub-notifications.html</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: I am the founder of a company which competes with GitHub. However,&#xA;I still use tools like GitHub, GitLab, and so on, as part of regular&#xA;contributions to projects all over the FOSS ecosystem. I don&amp;rsquo;t dislike GitHub,&#xA;and I use it frequently in my daily workflow.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;GitHub is rolling out a new notifications UI. A few weeks ago, I started seeing&#xA;the option to try it. Yesterday, I received a warning that the old UI will soon&#xA;be deprecated. At this pace, I would not be surprised to see the new UI become&#xA;mandatory in a week or two. I&amp;rsquo;m usually optimistic about trying out new&#xA;features, but this change worried me right away. I still maintain a few projects&#xA;on GitHub, and I frequently contribute to many projects there. Using the&#xA;notification page to review these projects is a ritual I usually conduct several&#xA;times throughout the workday. So, I held my breath and tried it out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An open letter to Senator Bob Casey on end-to-end encryption</title>
      <link>https://drewdevault.com/2020/03/07/Open-letter-to-Senator-Casey.html</link>
      <pubDate>Sat, 07 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/03/07/Open-letter-to-Senator-Casey.html</guid>
      <description>&lt;p&gt;To Senator Bob Casey, I&amp;rsquo;m writing this open letter.&lt;/p&gt;&#xA;&lt;p&gt;As your constituent, someone who voted for you in 2018, and an expert in&#xA;software technology, I am disappointed in your support of the EARN IT Act. I am&#xA;aware that encryption is a challenging technology to understand, even for us&#xA;software engineers, and that it raises difficult problems for the legislature.&#xA;The EARN IT Act does not protect our children, and it has grave implications for&#xA;the freedoms of our citizens.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Abiopause</title>
      <link>https://drewdevault.com/2020/03/03/Abiopause.html</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/03/03/Abiopause.html</guid>
      <description>&lt;p&gt;The sun has an influence on its surroundings. One of these is in the form of&#xA;small particles that are constantly ejected from the sun in all directions,&#xA;which exerts an outward pressure, creating an expanding sphere of particles that&#xA;moves away from the sun. These particles are the solar wind. As the shell of&#xA;particles expands, the density (and pressure) falls. Eventually the solar wind&#xA;reaches the &lt;em&gt;interstellar medium&lt;/em&gt; — the space between the stars —&#xA;which, despite not being very dense, is not empty. It exerts a pressure that&#xA;pushes inwards, towards the sun.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thoughts on performance &amp; optimization</title>
      <link>https://drewdevault.com/2020/02/21/Thoughts-on-performance.html</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/02/21/Thoughts-on-performance.html</guid>
      <description>&lt;p&gt;The idea that programmers ought to or ought not to be called &amp;ldquo;software&#xA;engineers&amp;rdquo; is a contentious one. How you approach optimization and performance&#xA;is one metric which can definitely push my evaluation of a developer towards the&#xA;engineering side. Unfortunately, I think that a huge number of software&#xA;developers today, even senior ones, are approaching this problem poorly.&lt;/p&gt;&#xA;&lt;p&gt;Centrally, I believe that you cannot effectively optimize a system which you do&#xA;not understand. Say, for example, that you&amp;rsquo;re searching for a member of a&#xA;linked list, which is an O(n) operation. You know this can be improved by&#xA;switching from a linked list to a sorted array and using a binary search. So,&#xA;you spend a few hours refactoring, commit the implementation, and&amp;hellip; the&#xA;application is no faster. What you failed to consider is that the lists are&#xA;populated from data received over the network, whose latency and bandwidth&#xA;constraints make the process much slower than any difference made by the kind of&#xA;list you&amp;rsquo;re using.  If you&amp;rsquo;re not optimizing your bottleneck, then you&amp;rsquo;re&#xA;wasting your time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fucking laptops</title>
      <link>https://drewdevault.com/2020/02/18/Fucking-laptops.html</link>
      <pubDate>Tue, 18 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/02/18/Fucking-laptops.html</guid>
      <description>&lt;p&gt;The best laptop ever made is the ThinkPad X200, and I have two of them. The&#xA;caveats are: I get only 2-3 hours of battery life even with conservative use;&#xA;and it struggles to deal with 1080p videos.&lt;/p&gt;&#xA;&lt;p&gt;The integrated GPU, Bluetooth and WiFi, internal sensors, and even the&#xA;fingerprint reader can all be driven by the upstream Linux kernel. In fact, the&#xA;hardware is so well understood that I have successfully used almost all of the&#xA;laptop&amp;rsquo;s features on Linux, FreeBSD, NetBSD, Minix, Haiku, and Plan 9. Plan&#xA;fucking 9. It can run coreboot, too. The back of the laptop has all of the&#xA;screws (Phillips head) labelled so you know which to remove to service which&#xA;parts. User replacable parts include the screen, keyboard (multiple layouts are&#xA;available and are interchangeable), the RAM, hard drive (I put a new SSD in one&#xA;of mine a few weeks ago, and it took about 30 seconds) — actually, there&#xA;are a total of 26 replacable parts in this laptop.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; There is a detailed&#xA;278-page service manual to assist you or your local repair tech in addressing&#xA;any problems that arise.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, February 2020</title>
      <link>https://drewdevault.com/2020/02/15/Status-update-February-2020.html</link>
      <pubDate>Sat, 15 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/02/15/Status-update-February-2020.html</guid>
      <description>&lt;p&gt;Today I thought it&amp;rsquo;d try out something new: I have an old family recipe&#xA;simmering on the stove right now, but instead of beef I&amp;rsquo;m trying out impossible&#xA;beef. It cooked up a bit weird — it doesn&amp;rsquo;t brown up in the same way I&#xA;expect of ground beef, and it made a lot more fond than I expected. Perhaps the&#xA;temperature is too high? We&amp;rsquo;ll see how it fares when it&amp;rsquo;s done. In the&#xA;meanwhile, let&amp;rsquo;s get you up to speed on my free software projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dependencies and maintainers</title>
      <link>https://drewdevault.com/2020/02/06/Dependencies-and-maintainers.html</link>
      <pubDate>Thu, 06 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/02/06/Dependencies-and-maintainers.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m 34,018 feet over the Atlantic at the moment, on my way home from FOSDEM. It&#xA;was as always a lovely event, with far too many events of interest for any&#xA;single person to consume. One of the few talks I was able to attend&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; left a&#xA;persistent worm of thought in my brain. This talk was put on by representatives&#xA;of Microsoft and GitHub and discusses whether or not there is a sustainability&#xA;problem in open source (&lt;a href=&#34;https://fosdem.org/2020/schedule/event/foss_sustainability_issues/&#34;&gt;link&lt;/a&gt;). The content of the talk,&#xA;interpreted within the framework in which it was presented, was moderately&#xA;interesting. It was more fascinating to me, however, as a lens for interpreting&#xA;GitHub&amp;rsquo;s (and, indirectly, Microsoft&amp;rsquo;s) approach to open source, and of the&#xA;mindset of developers who approach problems in the same ways.&lt;/p&gt;</description>
    </item>
    <item>
      <title>KnightOS was an interesting operating system</title>
      <link>https://drewdevault.com/2020/01/27/KnightOS-was-interesting.html</link>
      <pubDate>Mon, 27 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/27/KnightOS-was-interesting.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://knightos.org&#34;&gt;KnightOS&lt;/a&gt; is an operating system I started writing about&#xA;10 years ago, for Texas Instruments line of z80 calculators — the TI-73,&#xA;TI-83+, TI-84+, and similar calculators are supported. It still gets the rare&#xA;improvements, but these days myself and most of the major contributors are just&#xA;left with starry eyed empty promises to themselves that one day they&amp;rsquo;ll do one&#xA;of those big refactorings we&amp;rsquo;ve been planning&amp;hellip; for 4 or 5 years now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The happinesses and stresses of full-time FOSS work</title>
      <link>https://drewdevault.com/2020/01/21/Stress-and-happiness.html</link>
      <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/21/Stress-and-happiness.html</guid>
      <description>&lt;p&gt;In the past few days, several free software maintainers have come out to discuss&#xA;the stresses of their work. Though the timing was suggestive, my article last&#xA;week on the philosophy of project governance was, at best, only tangentially&#xA;related to this topic - I had been working on that article for a while. I do&#xA;have some thoughts that I&amp;rsquo;d like to share about what kind of stresses I&amp;rsquo;ve&#xA;dealt with as a FOSS maintainer, and how I&amp;rsquo;ve managed (or often mismanaged) it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A philosophy of project governance</title>
      <link>https://drewdevault.com/2020/01/17/Effective-project-governance.html</link>
      <pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/17/Effective-project-governance.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been in the maintainer role for dozens of projects for a while now, and&#xA;have moderated my fair share of conflicts. I&amp;rsquo;ve also been on the other side,&#xA;many times, as a minor contributor watching or participating in conflict within&#xA;other projects. Over the years, I&amp;rsquo;ve developed an approach to project governance&#xA;which I believe is lightweight, effective, and inclusive.&lt;/p&gt;&#xA;&lt;p&gt;I hold the following axioms to be true:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Computer projects are organized by humans, creating a social system.&lt;/li&gt;&#xA;&lt;li&gt;Social systems are fundamentally different from computer systems.&lt;/li&gt;&#xA;&lt;li&gt;Objective rules cannot be programmed into a social system.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;And the following is true of individuals within those systems:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, January 2020</title>
      <link>https://drewdevault.com/2020/01/15/Status-update-January-2020.html</link>
      <pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/15/Status-update-January-2020.html</guid>
      <description>&lt;p&gt;I forgot to write this post this morning, and I&amp;rsquo;m on cup 3 of coffee while&#xA;knee-deep in some arcane work with tarballs in Python. Forgive the brevity of&#xA;this introduction. Let&amp;rsquo;s get right into the status update.&lt;/p&gt;&#xA;&lt;p&gt;First of all, &lt;a href=&#34;https://fosdem.org/2020/&#34;&gt;FOSDEM 2020&lt;/a&gt; is taking place on February 1st and 2nd, and&#xA;I&amp;rsquo;m planning on being there again this year. I hope to see you there! I&amp;rsquo;ll be&#xA;hosting another &lt;a href=&#34;https://fosdem.org/2020/schedule/event/bof_sourcehut/&#34;&gt;small session&lt;/a&gt; for SourceHut and aerc users&#xA;where I&amp;rsquo;ll take questions, demo some new stuff, and give out stickers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Following up on &#34;Hello world&#34;</title>
      <link>https://drewdevault.com/2020/01/08/Re-Slow.html</link>
      <pubDate>Wed, 08 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/08/Re-Slow.html</guid>
      <description>&lt;p&gt;This is a follow-up to my last article, &lt;a href=&#34;https://drewdevault.com/2020/01/04/Slow.html&#34;&gt;Hello&#xA;world&lt;/a&gt;, which is easily the most&#xA;negatively received article I&amp;rsquo;ve written — a remarkable feat for someone&#xA;who&amp;rsquo;s written as much flame bait as me. Naturally, the fault lies with the&#xA;readers.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://xkcd.com/1984/&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/misinterpretation_2x.png&#34; width=&#34;294&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;All jokes aside, I&amp;rsquo;ll try to state my point better. The &amp;ldquo;Hello world&amp;rdquo; article&#xA;was a lot of work to put together — frustrating work — by the time&#xA;I had finished collecting numbers, I was exhausted and didn&amp;rsquo;t pay much mind to&#xA;putting context to them. This left a lot of it open to interpretation, and a lot&#xA;of those interpretations didn&amp;rsquo;t give the benefit of the doubt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello world</title>
      <link>https://drewdevault.com/2020/01/04/Slow.html</link>
      <pubDate>Sat, 04 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2020/01/04/Slow.html</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you ask your programming language to do the simplest possible task:&#xA;print out &amp;ldquo;hello world&amp;rdquo;. Generally this takes two syscalls: write and exit.&#xA;The following assembly program is the ideal Linux x86_64 program for this&#xA;purpose. A perfect compiler would emit this hello world program for any&#xA;language.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bits 64&#xA;section .text&#xA;global _start&#xA;_start:&#xA;&#x9;mov rdx, len&#xA;&#x9;mov rsi, msg&#xA;&#x9;mov rdi, 1&#xA;&#x9;mov rax, 1&#xA;&#x9;syscall&#xA;&#xA;&#x9;mov rdi, 0&#xA;&#x9;mov rax, 60&#xA;&#x9;syscall&#xA;&#xA;section .rodata&#xA;msg: db &amp;#34;hello world&amp;#34;, 10&#xA;len: equ $-msg&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Most languages do a whole lot of other crap other than printing out &amp;ldquo;hello&#xA;world&amp;rdquo;, even if that&amp;rsquo;s all you asked for.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing my dotfiles as a git repository</title>
      <link>https://drewdevault.com/2019/12/30/dotfiles.html</link>
      <pubDate>Mon, 30 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/12/30/dotfiles.html</guid>
      <description>&lt;p&gt;There are many tools for managing your dotfiles - user-specific configuration&#xA;files. GNU stow is an example. I&amp;rsquo;ve tried a few solutions over the years, but I&#xA;settled on a very simple system several years ago which has served me very well&#xA;in the time since: my $HOME is a git repository. &lt;a href=&#34;https://git.sr.ht/~sircmpwn/dotfiles&#34;&gt;This&#xA;repository&lt;/a&gt;, in fact. This isn&amp;rsquo;t an&#xA;original idea, but I&amp;rsquo;m not sure where I first heard it from either, and I&amp;rsquo;ve&#xA;extended upon it somewhat since.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PinePhone review</title>
      <link>https://drewdevault.com/2019/12/18/PinePhone-review.html</link>
      <pubDate>Wed, 18 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/12/18/PinePhone-review.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;: Holy shit! This is the phone I have always wanted. I have never been&#xA;this excited about the mobile sector before. However: the software side is&#xA;totally absent — phone calls are very dubious, SMS is somewhat dubious,&#xA;LTE requires some hacks, and everything will have to be written from the ground&#xA;up.&lt;/p&gt;&#xA;&lt;p&gt;I have a PinePhone developer edition model, which I paid for out of pocket&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;and which took an excruciatingly long time to arrive. When it finally arrived,&#xA;it came with no SIM or microSD card (expected), and the eMMC had some half-assed&#xA;version of Android on it which just boot looped without POSTing to anything&#xA;useful&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. This didn&amp;rsquo;t bother me in the slightest — like any other&#xA;computer I&amp;rsquo;ve purchased, I planned on immediately flashing my own OS on it. My&#xA;Linux distribution of choice for it is&#xA;&lt;a href=&#34;https://postmarketos.org/&#34;&gt;postmarketOS&lt;/a&gt;, which is basically the mobile OS I&amp;rsquo;d&#xA;build if I wanted to build a mobile OS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, December 2019</title>
      <link>https://drewdevault.com/2019/12/15/Status-update-December-2019.html</link>
      <pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/12/15/Status-update-December-2019.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s December 15th and it still hasn&amp;rsquo;t snowed here. Why did I move to this&#xA;godforsaken den of unholy heat and rain? I think I have chosen a latitude &lt;em&gt;just&lt;/em&gt;&#xA;southerly enough to deprive me of the climate I yearn for. I take some comfort&#xA;in the knowledge that I&amp;rsquo;m travelling home to see the family in a couple of&#xA;weeks, and sure enough Colorado has been covered in snow for some time now.&#xA;Anyway, none of this is relevant to my work, which is what you came here for.&#xA;Let&amp;rsquo;s take a look at this past month.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developers shouldn&#39;t distribute their own software</title>
      <link>https://drewdevault.com/2019/12/09/Developers-shouldnt-distribute.html</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/12/09/Developers-shouldnt-distribute.html</guid>
      <description>&lt;p&gt;An oft-heard complaint about Linux is that software distribution often takes&#xA;several forms: a Windows version, a macOS version, and&amp;hellip; a Debian version, an&#xA;Ubuntu version, a Fedora version, a CentOS version, an openSUSE version&amp;hellip; but&#xA;these complaints miss the point. The true distributable form for Linux software,&#xA;and rather for Unix software in general, is a .tar.gz file containing the source&#xA;code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This article presumes that proprietary/nonfree software is irrelevant,&#xA;and so should you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Take action to save .org and prosecute those who sold out the internet</title>
      <link>https://drewdevault.com/2019/11/29/dotorg.html</link>
      <pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/11/29/dotorg.html</guid>
      <description>&lt;p&gt;As many of you have no doubt heard, control of the .org registry has been sold&#xA;to private interests. There have been attempts to call them to reason, like&#xA;&lt;a href=&#34;https://savedotorg.org/&#34;&gt;Save .ORG&lt;/a&gt;, but let&amp;rsquo;s be realistic: they knew what&#xA;they&amp;rsquo;re doing is wrong, the whole time. If they were a commercial entity, our&#xA;appeals would fall on deaf ears and that would be the end of it. But, they&amp;rsquo;re&#xA;not a commercial entity - so our appeals may fall on deaf ears, but that doesn&amp;rsquo;t&#xA;have to be the end of it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software developers should avoid traumatic changes</title>
      <link>https://drewdevault.com/2019/11/26/Avoid-traumatic-changes.html</link>
      <pubDate>Tue, 26 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/11/26/Avoid-traumatic-changes.html</guid>
      <description>&lt;p&gt;A lot of software has gone through changes which, in retrospect, I would&#xA;describe as &amp;ldquo;traumatic&amp;rdquo; to their communities. I recognize these sorts of changes&#xA;by their effect: we might have pulled through in the end, but only after a lot&#xA;of heartbreak, struggle, and hours of wasted hacking; but the change left a scar&#xA;on the community.&lt;/p&gt;&#xA;&lt;p&gt;There are two common cases in which a change risks introducing this kind of&#xA;trauma:&lt;/p&gt;</description>
    </item>
    <item>
      <title>China</title>
      <link>https://drewdevault.com/2019/11/20/China.html</link>
      <pubDate>Wed, 20 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/11/20/China.html</guid>
      <description>&lt;p&gt;This article will be difficult to read and was difficult to write. I hope that&#xA;you can stomach the uncomfortable nature of this topic and read my thoughts in&#xA;earnest.  I usually focus on technology-related content, but at the end of the&#xA;day, this is my personal blog and I feel that it would betray my personal&#xA;principles to remain silent. I&amp;rsquo;ve made an effort to provide citations for all of&#xA;my assertions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, November 2019</title>
      <link>https://drewdevault.com/2019/11/15/Status-update-November-2019.html</link>
      <pubDate>Fri, 15 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/11/15/Status-update-November-2019.html</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s update is especially exciting, because today marks the 1 year&#xA;anniversary of Sourcehut &lt;a href=&#34;https://drewdevault.com/2018/11/15/sr.ht-general-availability.html&#34;&gt;opening it&amp;rsquo;s alpha&lt;/a&gt; to public&#xA;registration. I wrote a &lt;a href=&#34;https://sourcehut.org/blog/2019-11-15-sourcehut-1-year-alpha/&#34;&gt;nice long article&lt;/a&gt; which goes into&#xA;detail about what Sourcehut accomplished in 2019, what&amp;rsquo;s to come for 2020, and&#xA;it lays out the entire master plan for your consideration. Be sure to give that&#xA;a look if you have the time. I haven&amp;rsquo;t slowed down on my other projects, though,&#xA;so here&amp;rsquo;re some more updates!&lt;/p&gt;</description>
    </item>
    <item>
      <title>An old-school shell hack on a line printer</title>
      <link>https://drewdevault.com/2019/10/30/Line-printer-shell-hack.html</link>
      <pubDate>Wed, 30 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/10/30/Line-printer-shell-hack.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been too long since I last did a good hack, for no practical reason other&#xA;than great hack value. In my case, these &lt;a href=&#34;https://drewdevault.com/2016/03/22/Integrating-a-VT220-into-my-life.html&#34;&gt;often amount&lt;/a&gt; to a nostalgia&#xA;for an age of computing I wasn&amp;rsquo;t present for. In a recent bid to capture more of&#xA;this nostalgia, I recently picked up a dot matrix line printer, specifically the&#xA;Epson LX-350 printer. This one is nice because it has a USB port, so I don&amp;rsquo;t&#xA;have to break out my pile of serial cable hacks to get it talking to Linux 😁&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, October 2019</title>
      <link>https://drewdevault.com/2019/10/15/Status-update-October-2019.html</link>
      <pubDate>Tue, 15 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/10/15/Status-update-October-2019.html</guid>
      <description>&lt;p&gt;Last month, I gave you an update at the conclusion of a long series of travels.&#xA;But, I wasn&amp;rsquo;t done yet - this month, I spent a week in Montreal for &lt;a href=&#34;https://xdc2019.x.org/&#34;&gt;XDC&lt;/a&gt;.&#xA;Simon Ser put up &lt;a href=&#34;https://emersion.fr/blog/2019/xdc2019-wrap-up/&#34;&gt;a great write-up&lt;/a&gt; which goes over a lot of the&#xA;important things we discussed there. It was a wonderful conference and well&#xA;worth the trip - but I truly am sick of travelling. Now, I can enjoy some time&#xA;at home, working on free and open source software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to fuck up software releases</title>
      <link>https://drewdevault.com/2019/10/12/how-to-fuck-up-releases.html</link>
      <pubDate>Sat, 12 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/10/12/how-to-fuck-up-releases.html</guid>
      <description>&lt;p&gt;I manage releases for a bunch of free &amp;amp; open-source software. Just about every&#xA;time I ship a release, I find a novel way to fuck it up. Enough of these&#xA;fuck-ups have accumulated now that I wanted to share some of my mistakes and how&#xA;I (try to) prevent them from happening twice.&lt;/p&gt;&#xA;&lt;p&gt;At first, I did everything manually. This is fine enough for stuff with simple&#xA;release processes - stuff that basically amounts to tagging a commit, pushing&#xA;it, and calling it a day. But even this gets tedious, and I&amp;rsquo;d often make a&#xA;mistake when picking the correct version number. So, I wrote a small script:&#xA;&lt;a href=&#34;https://paste.sr.ht/~sircmpwn/34bd575b4c37ae6102d6ede2a4ba17b2e1bb9cf8&#34;&gt;semver&lt;/a&gt;. &lt;code&gt;semver patch&lt;/code&gt; bumps the patch version, &lt;code&gt;semver minor&lt;/code&gt; bumps the minor version, and&#xA;&lt;code&gt;semver major&lt;/code&gt; bumps the major version, based on semantic versioning. I got into&#xA;the habit of using this script instead of making the tags manually. The next&#xA;fuckup soon presented itself: when preparing the&#xA;&lt;a href=&#34;https://git-scm.com/docs/git-shortlog&#34;&gt;shortlog&lt;/a&gt;, I would often feed it the&#xA;wrong commits, and the changelog would be messed up. So, I updated the script to&#xA;run the appropriate shortlog command and pre-populate the annotated tag with it,&#xA;launching the editor to adjust the changelog as necessary.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RaptorCS&#39;s redemption: the POWER9 machine works</title>
      <link>https://drewdevault.com/2019/10/10/RaptorCS-redemption.html</link>
      <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/10/10/RaptorCS-redemption.html</guid>
      <description>&lt;p&gt;This is a follow-up to my earlier article, &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2019/09/23/RaptorCS-Blackbird-a-horror-story.html&#34;&gt;RaptorCS POWER9 Blackbird PC: An&#xA;expensive mistake&lt;/a&gt;&amp;rdquo;. Since I published that article, I&amp;rsquo;ve been in&#xA;touch with Raptor and they&amp;rsquo;ve been much more communicative and helpful. I now&#xA;have a working machine!&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Update Feb. 2024: Seems the improvements I asked for may not have stuck. &lt;a href=&#34;https://posixcafe.org/blogs/2024/02/26/0/&#34;&gt;Buyer&#xA;beware&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://sr.ht/OTyo.jpeg&#34; alt=&#34;Picture of uname -sm showing &amp;ldquo;Linux ppcle64&amp;rdquo;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;After I published my article, Raptor reached out and apologised for my&#xA;experience. They offered a full refund, but I agreed to work on further&#xA;diagnosis now that we had opened a dialogue&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. They identified that my CPU was&#xA;defective and sent me a replacement, then we found the mainboard to be&#xA;defective, too, and the whole thing was shipped back and replaced. I installed&#xA;the new hardware into the datacenter today and it was quite pleasant to get up&#xA;and running. Raptor assures me that my nightmares with the old board are&#xA;atypical, and if the new board is representative of the usual user experience, I&#xA;would have to agree. The installation was completely painless.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Collabora really added Digital Restrictions Management to Weston</title>
      <link>https://drewdevault.com/2019/10/07/HDCP-in-Weston.html</link>
      <pubDate>Mon, 07 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/10/07/HDCP-in-Weston.html</guid>
      <description>&lt;p&gt;A recent article from Collabora, &lt;a href=&#34;https://www.collabora.com/news-and-blog/blog/2019/10/03/why-hdcp-support-in-weston-is-a-good-thing/&#34;&gt;Why HDCP support in Weston is a good&#xA;thing&lt;/a&gt;, proports to offer a lot of insight into why&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/High-bandwidth_Digital_Content_Protection&#34;&gt;HDCP&lt;/a&gt; - a Digital Restrictions Management (DRM) related technology - was&#xA;added to &lt;a href=&#34;https://gitlab.freedesktop.org/wayland/weston&#34;&gt;Weston&lt;/a&gt; - a well known basic Wayland compositor which was once&#xA;the reference compositor for Wayland. But this article is gaslighting you.&#xA;There is one reason and one reason alone that explains why HDCP support landed&#xA;in Weston.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RaptorCS POWER9 Blackbird PC review</title>
      <link>https://drewdevault.com/2019/09/23/RaptorCS-Blackbird-a-horror-story.html</link>
      <pubDate>Mon, 23 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/09/23/RaptorCS-Blackbird-a-horror-story.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;November 2018&lt;/strong&gt;: Ordered &lt;a href=&#34;https://www.raptorcs.com/content/BK1B01/intro.html&#34;&gt;Basic Blackbird&#xA;Bundle&lt;/a&gt; w/32 GB RAM:&#xA;$1,935.64&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update 2019-12-23&lt;/strong&gt;: This article was originally titled &amp;ldquo;RaptorCS POWER9&#xA;Blackbird PC: An expensive mistake&amp;rdquo;. Please read the follow-up article,&#xA;published 2019-10-10:&#xA;&lt;a href=&#34;https://drewdevault.com/2019/10/10/RaptorCS-redemption.html&#34;&gt;RaptorCS&amp;rsquo;s redemption: the POWER9 machine works&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;June 2019&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Order ships, and arrives without RAM. It had been long enough that I didn&amp;rsquo;t&#xA;realize the order had only been partially fulfilled, so I order some RAM from&#xA;the &lt;a href=&#34;https://wiki.raptorcs.com/wiki/POWER9_Hardware_Compatibility_List/Memory&#34;&gt;list of recommended chips&lt;/a&gt; ($338.40), along with the other necessities&#xA;that I didn&amp;rsquo;t purchase from Raptor: a case ($97.99) and a PSU ($68.49), and grab&#xA;some hard drives I have lying around. Total cost: about $2,440. Worth it to get&#xA;POWER9 builds working on builds.sr.ht!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t sacrifice the right ideas to win the right words</title>
      <link>https://drewdevault.com/2019/09/17/The-wrong-words-but-the-right-ideas.html</link>
      <pubDate>Tue, 17 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/09/17/The-wrong-words-but-the-right-ideas.html</guid>
      <description>&lt;p&gt;There is a difference between free software and open-source software. But you&#xA;have to squint to see it. Software licenses which qualify for one title but not&#xA;the other are exceptionally rare.&lt;/p&gt;&#xA;&lt;p&gt;A fascination with linguistics is common among hackers, and I encourage and&#xA;participate in language hacking myself. Unfortunately, that seems to seep into&#xA;the Free Software Foundation&amp;rsquo;s message a bit too much. Let&amp;rsquo;s see if any of this&#xA;rings familiar:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, September 2019</title>
      <link>https://drewdevault.com/2019/09/15/Status-update-September-2019.html</link>
      <pubDate>Sun, 15 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/09/15/Status-update-September-2019.html</guid>
      <description>&lt;p&gt;Finally home again after a long series of travels! I spent almost a month in&#xA;Japan, then visited my sister&amp;rsquo;s new home in Hawaii on the way eastwards, then&#xA;some old friends in Seattle, and finally after 5½ long weeks, it&amp;rsquo;s home sweet&#xA;home here in Philadelphia. At least until I leave for&#xA;&lt;a href=&#34;https://xdc2019.x.org/&#34;&gt;XDC&lt;/a&gt; in Montreal 2 weeks from now. Someday I&amp;rsquo;ll have&#xA;some rest&amp;hellip; throughout all of these wild travels, I&amp;rsquo;ve been hard at work on my&#xA;free software projects. Let&amp;rsquo;s get started with this month&amp;rsquo;s status update!&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I decide between many programming languages</title>
      <link>https://drewdevault.com/2019/09/08/Enough-to-decide.html</link>
      <pubDate>Sun, 08 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/09/08/Enough-to-decide.html</guid>
      <description>&lt;p&gt;I have a few old standards in my toolbelt that I find myself calling upon most&#xA;often, but I try to learn enough about many programming languages to reason&#xA;about whether or not they&amp;rsquo;re suitable to any use-case I&amp;rsquo;m thinking about. The&#xA;best way is to learn by doing, so getting a general impression of the utility of&#xA;many languages helps equip you with the knowledge of whether or not they&amp;rsquo;d be&#xA;useful for a particular problem even if you don&amp;rsquo;t know them yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building interactive SSH applications</title>
      <link>https://drewdevault.com/2019/09/02/Interactive-SSH-programs.html</link>
      <pubDate>Mon, 02 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/09/02/Interactive-SSH-programs.html</guid>
      <description>&lt;p&gt;After the announcement of &lt;a href=&#34;https://drewdevault.com/2019/08/19/Introducing-shell-access-for-builds.html&#34;&gt;shell access for builds.sr.ht jobs&lt;/a&gt;, a few people sent me some questions, wondering how this sort of&#xA;thing is done. Writing interactive SSH applications is actually pretty easy, but&#xA;it does require some knowledge of the pieces involved and a little bit of&#xA;general Unix literacy.&lt;/p&gt;&#xA;&lt;p&gt;On the server, there are three steps which you can meddle with using OpenSSH:&#xA;authentication, the shell session, and the command. The shell is pretty easily&#xA;manipulated. For example, if you set the user&amp;rsquo;s login shell to&#xA;&lt;code&gt;/usr/bin/nethack&lt;/code&gt;, then &lt;a href=&#34;https://www.nethack.org/&#34;&gt;nethack&lt;/a&gt; will run when they log in. Editing&#xA;this is pretty straightforward, just pop open &lt;code&gt;/etc/passwd&lt;/code&gt; as root and set&#xA;their shell to your desired binary. If the user SSHes into your server with a&#xA;TTY allocated (which is done by default), then you&amp;rsquo;ll be able to run a curses&#xA;application or something interactive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shell access for builds.sr.ht CI</title>
      <link>https://drewdevault.com/2019/08/19/Introducing-shell-access-for-builds.html</link>
      <pubDate>Mon, 19 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/08/19/Introducing-shell-access-for-builds.html</guid>
      <description>&lt;p&gt;Have you ever found yourself staring at a failed CI build, wondering desperately&#xA;what happened? Or, have you ever needed a fresh machine on-demand to test out an&#xA;idea in? Have you been working on Linux, but need to test something on OpenBSD?&#xA;Starting this week, builds.sr.ht can help with all of these problems, because&#xA;you can now SSH into the build environment.&lt;/p&gt;&#xA;&lt;small class=&#34;text-muted&#34;&gt;&#xA;  If you didn&#39;t know, &lt;a href=&#34;https://sourcehut.org&#34;&gt;Sourcehut&lt;/a&gt; is the 100%&#xA;  open/libre software forge for hackers, complete with git and Mercurial&#xA;  hosting, CI, mailing lists, and more - with no JavaScript. Try it out!&#xA;&lt;/small&gt;&#xA;&lt;p&gt;The next time your build fails on builds.sr.ht, you&amp;rsquo;ll probably notice the&#xA;following message:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, August 2019</title>
      <link>https://drewdevault.com/2019/08/15/Status-update-August-2019.html</link>
      <pubDate>Thu, 15 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/08/15/Status-update-August-2019.html</guid>
      <description>&lt;p&gt;Outside my window, the morning sun can be seen rising over the land of the&#xA;rising sun, as I sip from a coffee purchased at the konbini down the street. I&#xA;almost forgot to order it, as the staffer behind the counter pointed out with a&#xA;smile and a joke that, having been told in Japanese, mostly went over my head.&#xA;It&amp;rsquo;s on this quiet Osaka morning I write today&amp;rsquo;s status update - there are lots&#xA;of existing developments to share!&lt;/p&gt;</description>
    </item>
    <item>
      <title>DRM leasing: VR for Wayland</title>
      <link>https://drewdevault.com/2019/08/09/DRM-leasing-and-VR-for-Wayland.html</link>
      <pubDate>Fri, 09 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/08/09/DRM-leasing-and-VR-for-Wayland.html</guid>
      <description>&lt;p&gt;As those who read my &lt;a href=&#34;https://drewdevault.com/2019/07/15/Status-update-July-2019.html&#34;&gt;status updates&lt;/a&gt;&#xA;have been aware, recently I&amp;rsquo;ve been working on bringing VR to Wayland (and vice&#xA;versa). The deepest and most technical part of this work is &lt;em&gt;DRM leasing&lt;/em&gt;&#xA;(Direct Rendering Manager, &lt;em&gt;not&lt;/em&gt; Digital Restrictions Management), and I think&#xA;it&amp;rsquo;d be good to write in detail about what&amp;rsquo;s involved in this part of the&#xA;effort. This work has been sponsored by &lt;a href=&#34;https://status.im/&#34;&gt;Status.im&lt;/a&gt;, as part&#xA;of an effort to build a comprehensive Wayland-driven VR workspace. When we got&#xA;started, most of the plumbing was missing for VR headsets to be useful on&#xA;Wayland, so this has been my focus for a while. The result of this work is&#xA;summed up in this crappy handheld video:&lt;/p&gt;</description>
    </item>
    <item>
      <title>FOSS contributor tracks</title>
      <link>https://drewdevault.com/2019/07/29/FOSS-contributor-tracks.html</link>
      <pubDate>Mon, 29 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/07/29/FOSS-contributor-tracks.html</guid>
      <description>&lt;p&gt;Just like many companies have different advancement tracks for their employees&#xA;(for example, a management track and an engineering track), similar concepts&#xA;exist in free software projects. One of the roles of a maintainer is to help&#xA;contributors develop into the roles which best suit them. I&amp;rsquo;d like to explain&#xA;what this means to me in my role as a maintainer of several projects, though I&#xA;should mention upfront that I&amp;rsquo;m just some guy and, while I can explain what has&#xA;and hasn&amp;rsquo;t worked for me, I can&amp;rsquo;t claim to have all of the answers. People are&#xA;hard.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, July 2019</title>
      <link>https://drewdevault.com/2019/07/15/Status-update-July-2019.html</link>
      <pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/07/15/Status-update-July-2019.html</guid>
      <description>&lt;p&gt;Today I received the keys to my new apartment, which by way of not being&#xA;directly in the middle of the city&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; saves me a decent chunk of money - and&#xA;allows me to proudly announce that I have officially broken even on doing free&#xA;software full time! I owe a great deal of thanks to all of you who have &lt;a href=&#34;https://drewdevault.com/donate&#34;&gt;donated&#xA;to support my work&lt;/a&gt; or purchased a paid&#xA;&lt;a href=&#34;https://sourcehut.org&#34;&gt;SourceHut&lt;/a&gt; account. I&amp;rsquo;ve dreamed of sustainably working&#xA;on free software for a long, long time, and I&amp;rsquo;m very grateful for all of your&#xA;support in helping realize that dream. Now let me share with you what your money&#xA;has bought over the past month!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing code annotations for SourceHut</title>
      <link>https://drewdevault.com/2019/07/08/Announcing-annotations-for-sourcehut.html</link>
      <pubDate>Mon, 08 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/07/08/Announcing-annotations-for-sourcehut.html</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;m happy to announce that code annotations are now available for&#xA;&lt;a href=&#34;https://sourcehut.org&#34;&gt;SourceHut&lt;/a&gt;! &lt;img style=&#34;display: inline; height: 1.2rem&#34;&#xA;src=&#34;https://drewdevault.com/img/party.png&#34; /&gt; These allow you to decorate your code with arbitrary&#xA;links and markdown. The end result looks something like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;NOTICE&lt;/strong&gt;: Annotations were ultimately removed from sourcehut.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://drewdevault.com/l.sr.ht/w767.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;small class=&#34;text-muted&#34;&gt;&#xA;  &lt;a href=&#34;https://sourcehut.org&#34;&gt;SourceHut&lt;/a&gt; is the &#34;hacker&#39;s forge&#34;, a&#xA;  100% open-source platform for hosting Git &amp;amp; Mercurial repos, bug trackers,&#xA;  mailing lists, continuous integration, and more. No JavaScript required!&#xA;&lt;/small&gt;&#xA;&lt;p&gt;The annotations shown here are sourced from a JSON file which you can generate&#xA;and upload during your CI process. It looks something like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Absence of certain features in IRC considered a feature</title>
      <link>https://drewdevault.com/2019/07/01/Absence-of-features-in-IRC.html</link>
      <pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/07/01/Absence-of-features-in-IRC.html</guid>
      <description>&lt;p&gt;The other day a friend of mine (an oper on Freenode) wanted to talk about IRC&#xA;compared to its peers, such as Matrix, Slack, Discord, etc. The ensuing&#xA;discussion deserves summarization here. In short: I&amp;rsquo;m glad that IRC doesn&amp;rsquo;t have&#xA;the features that are &amp;ldquo;showstoppers&amp;rdquo; for people choosing other platforms, and&#xA;I&amp;rsquo;m worried that attempts to bring these showstopping &amp;ldquo;features&amp;rdquo; to IRC will&#xA;worsen the platform for the people who use it now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, June 2019</title>
      <link>https://drewdevault.com/2019/06/15/Status-update-June-2019.html</link>
      <pubDate>Sat, 15 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/06/15/Status-update-June-2019.html</guid>
      <description>&lt;p&gt;Summer is in full swing here in Philadelphia. Last night I got great views of&#xA;Jupiter and a nearly-full Moon, and my first Saturn observation of the year.  I&#xA;love astronomy on clear Friday nights, there&amp;rsquo;s always plenty of people coming&#xA;through the city. And today, on a relaxing lazy Saturday, waiting for friends&#xA;for dinner later, I have the privilege of sharing another status report with&#xA;you.&lt;/p&gt;&#xA;&lt;p&gt;First, I want to talk about some work I&amp;rsquo;ve done with blogs lately. On the bottom&#xA;of this article you&amp;rsquo;ll find a few blog posts from around the net. This is&#xA;populated with &lt;a href=&#34;https://git.sr.ht/~sircmpwn/openring&#34;&gt;openring&lt;/a&gt;, a small Go tool&#xA;I made to fetch a few articles from a list of RSS feeds. A couple of other&#xA;people have added this to their own sites as well, and I hope to use this to&#xA;encourage the growth of a network of bloggers supporting each other without any&#xA;nonfree or centralized software. I&amp;rsquo;ll write about this in its own article in&#xA;time. I&amp;rsquo;ve also made an &lt;a href=&#34;https://drewdevault.com/make-a-blog&#34;&gt;open offer&lt;/a&gt; to give $20 to anyone who&#xA;wants to make their own blog, and so far 5 new blogs have taken me up on the&#xA;offer. Maybe you&amp;rsquo;ll be the next?&lt;/p&gt;</description>
    </item>
    <item>
      <title>My personal journey from MIT to GPL</title>
      <link>https://drewdevault.com/2019/06/13/My-journey-from-MIT-to-GPL.html</link>
      <pubDate>Thu, 13 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/06/13/My-journey-from-MIT-to-GPL.html</guid>
      <description>&lt;p&gt;As I got started writing open source software, I generally preferred the MIT&#xA;license. I actually made fun of the &amp;ldquo;copyleft&amp;rdquo; GPL licenses, on the grounds that&#xA;they are less free. I still hold this opinion today: the GPL license is less&#xA;free than the MIT license - but today, I believe this in a good way.&lt;/p&gt;&#xA;&lt;p&gt;If you haven&amp;rsquo;t yet, I suggest reading the &lt;a href=&#34;https://opensource.org/licenses/MIT&#34;&gt;MIT&#xA;license&lt;/a&gt; - it&amp;rsquo;s very short. It satisfies&#xA;the four essential freedoms guaranteed of &lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;free&#xA;software&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Initial pre-release of aerc: an email client for your terminal</title>
      <link>https://drewdevault.com/2019/06/03/Announcing-aerc-0.1.0.html</link>
      <pubDate>Mon, 03 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/06/03/Announcing-aerc-0.1.0.html</guid>
      <description>&lt;p&gt;After years of painfully slow development, the &lt;a href=&#34;https://aerc-mail.org&#34;&gt;aerc email&#xA;client&lt;/a&gt; has seen a huge boost in its pace of development&#xA;recently. This leads to today&amp;rsquo;s announcement: &lt;a href=&#34;https://git.sr.ht/~sircmpwn/aerc/refs/0.1.0&#34;&gt;aerc 0.1.0 is now&#xA;available&lt;/a&gt;! After my transition to &lt;a href=&#34;https://drewdevault.com/2019/01/15/Im-doing-FOSS-full-time.html&#34;&gt;working on free software full&#xA;time&lt;/a&gt; allowed me to spend more time on more projects, I was able&#xA;to invest considerably more time into aerc. Your support led us here: thank you&#xA;to all of the people who &lt;a href=&#34;https://drewdevault.com/donate&#34;&gt;donate to my work&lt;/a&gt;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is a fork, really, and how GitHub changed its meaning</title>
      <link>https://drewdevault.com/2019/05/24/What-is-a-fork.html</link>
      <pubDate>Fri, 24 May 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/05/24/What-is-a-fork.html</guid>
      <description>&lt;p&gt;The fork button on GitHub - with the little number next to it for depositing&#xA;dopamine into your brain - is a bit misleading. GitHub co-opted the meaning of&#xA;&amp;ldquo;fork&amp;rdquo; to trick you into participating in their platform more. They did this in&#xA;a well-intentioned way, for the sake of their pull requests feature, but&#xA;ultimately this design is self-serving and causes some friction when&#xA;contributors venture out of their GitHub sandbox and into the rest of the&#xA;software development ecosystem. Let&amp;rsquo;s clarify what &amp;ldquo;fork&amp;rdquo; really means, and what&#xA;we do without GitHub&amp;rsquo;s concept of one - for it is in this difference that we&#xA;truly discover how git is a &lt;em&gt;distributed&lt;/em&gt; version control system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, May 2019</title>
      <link>https://drewdevault.com/2019/05/15/Status-update-May-2019.html</link>
      <pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/05/15/Status-update-May-2019.html</guid>
      <description>&lt;p&gt;This month, it seems the most exciting developments again come from the realm of&#xA;email. I&amp;rsquo;ve got cool email-related news to share for aerc, lists.sr.ht, and&#xA;todo.sr.ht, and many cool developments in my other projects to share.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start with lists.sr.ht: I have broken ground on the web-based patch review&#xA;tools! I promised these features when I started working on sourcehut, to make&#xA;the email-based workflow more enticing to those who would rather work on the&#xA;web. Basically, this gives us a Github or Gerrit-esque review UI for patches&#xA;which arrive on the mailing list. Thanks to &lt;a href=&#34;https://git.sr.ht/~emersion/python-emailthreads&#34;&gt;a cool&#xA;library&lt;/a&gt; Simon Ser wrote for&#xA;me&amp;hellip; almost a year ago&amp;hellip; I&amp;rsquo;m able to take a thread of emails discussing a&#xA;patch and organically convert them into inline feedback on the web.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Webcast: Reviewing git &amp; mercurial patches with email</title>
      <link>https://drewdevault.com/2019/05/13/Git-email-webcast.html</link>
      <pubDate>Mon, 13 May 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/05/13/Git-email-webcast.html</guid>
      <description>&lt;p&gt;With the availability of new resources like&#xA;&lt;a href=&#34;https://git-send-email.io&#34;&gt;git-send-email.io&lt;/a&gt;, I&amp;rsquo;ve been working on making the&#xA;email-based workflow more understandable and accessible to the world. One thing&#xA;that&amp;rsquo;s notably missing from this tutorial, however, is the maintainer side of&#xA;the work. I intend to do a full write-up in the future, but for now I thought&#xA;it&amp;rsquo;d be helpful to clarify my workflow a bit with a short webcast. In this&#xA;video, I narrate my workflow as I review a few&#xA;&lt;a href=&#34;https://sourcehut.org&#34;&gt;sourcehut&lt;/a&gt; patches and participate in some dicsussions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating your donation&#39;s value following Patreon&#39;s fee changes</title>
      <link>https://drewdevault.com/2019/05/06/Calculate-your-doation-fees-for-Patreon.html</link>
      <pubDate>Mon, 06 May 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/05/06/Calculate-your-doation-fees-for-Patreon.html</guid>
      <description>&lt;p&gt;In January 2018, I wrote a blog post which included a &lt;a href=&#34;https://drewdevault.com/2018/01/16/Fees-on-donation-platforms.html&#34;&gt;fee&#xA;calculator&lt;/a&gt;.&#xA;Patreon &lt;a href=&#34;https://www.patreon.com/new-creator-plans&#34;&gt;changes their fee model&#xA;tomorrow&lt;/a&gt;, and it&amp;rsquo;s time for an&#xA;updated calculator. I&amp;rsquo;m grandfathered into the old fees, so not much has changed&#xA;for me, but I want to equip Patreon users - creators and supporters - with more&#xA;knowledge of how their money is moving through the platform.&lt;/p&gt;&#xA;&lt;p&gt;Patreon makes money by siphoning some money off the top of a donation flow&#xA;between supporters and creators. Because of the nature of its business (a&#xA;private, VC-backed corporation), the siphon&amp;rsquo;s size and semantics are prone to&#xA;change in undesirable ways, since VC&amp;rsquo;s expect infinite growth and a private&#xA;business generally puts profit first. For this reason, I diversify my income, so&#xA;that when Patreon makes these changes it limits their impact on my financial&#xA;well-being.  Even so, Patreon is the biggest of my donation platforms,&#xA;representing over $500/month at the time of writing (&lt;a href=&#34;https://drewdevault.com/donate/&#34;&gt;full breakdown&#xA;here&lt;/a&gt;)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing Wio: A clone of Plan 9&#39;s Rio for Wayland</title>
      <link>https://drewdevault.com/2019/05/01/Announcing-wio.html</link>
      <pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/05/01/Announcing-wio.html</guid>
      <description>&lt;p&gt;For a few hours here and there over the past few months, I&amp;rsquo;ve been working on a&#xA;side project: &lt;a href=&#34;https://wio-project.org&#34;&gt;Wio&lt;/a&gt;. I&amp;rsquo;ll just let the (3 minute)&#xA;screencast do the talking first:&lt;/p&gt;&#xA;&lt;p&gt;&lt;video src=&#34;https://yukari.sr.ht/wio.webm&#34; controls&gt;&lt;/video&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: this video begins with several seconds of grey video. This is normal.&lt;/p&gt;&#xA;&lt;p&gt;In short, Wio is a Wayland compositor based on wlroots which has a similar look&#xA;and feel to Plan 9&amp;rsquo;s Rio desktop. It works by running each application in its&#xA;own nested Wayland compositor, based on &lt;a href=&#34;https://www.hjdskes.nl/projects/cage/&#34;&gt;Cage&lt;/a&gt; - yet another wlroots-based&#xA;Wayland compositor. I used Cage in &lt;a href=&#34;https://drewdevault.com/2019/04/23/Using-cage-for-a-seamless-RDP-Wayland-desktop.html&#34;&gt;last week&amp;rsquo;s RDP article&lt;/a&gt;, but&#xA;here&amp;rsquo;s another cool use-case for it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The &#34;shut up and get back to work&#34; coding style guide</title>
      <link>https://drewdevault.com/2019/04/29/Shut-up-and-get-back-to-work-style.html</link>
      <pubDate>Mon, 29 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/29/Shut-up-and-get-back-to-work-style.html</guid>
      <description>&lt;p&gt;So you&amp;rsquo;re starting a new website, and you open the first CSS file. What style do&#xA;you use? Well, you hate indenting with spaces passionately. You know tabs are&#xA;right because they&amp;rsquo;re literally made for this, and they&amp;rsquo;re only one byte, and&#xA;these god damn spaces people with their bloody spacebars&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Shut up and use spaces. That&amp;rsquo;s how CSS is written&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. And you, mister web&#xA;programmer, coming out of your shell and dipping your toes into the world of&#xA;Real Programming, writing your first Golang program: use tabs, jerk. There&amp;rsquo;s&#xA;only one principle that matters in coding style: don&amp;rsquo;t rock the boat. Just do&#xA;whatever the most common thing is in the language you&amp;rsquo;re working in. Write your&#xA;commit messages the same way as everyone else, too. Then shut up and get back to&#xA;work. This hill isn&amp;rsquo;t worth dying on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Cage for a seamless remote Wayland session</title>
      <link>https://drewdevault.com/2019/04/23/Using-cage-for-a-seamless-RDP-Wayland-desktop.html</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/23/Using-cage-for-a-seamless-RDP-Wayland-desktop.html</guid>
      <description>&lt;p&gt;Congratulations to Jente Hidskes on &lt;a href=&#34;https://www.hjdskes.nl/blog/cage-01/&#34;&gt;the first release of&#xA;Cage&lt;/a&gt;! Cage is a Wayland compositor&#xA;designed for kiosks - though, as you&amp;rsquo;ll shortly find out, is useful in many&#xA;unexpected ways. It launches a single application, in fullscreen, and exits the&#xA;compositor when that application exits. This lets you basically add a&#xA;DRM+KMS+libinput session to any Wayland-compatible application (or X application&#xA;via XWayland) and run it in a tiny wlroots compositor.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Choosing a VPN service is a serious decision</title>
      <link>https://drewdevault.com/2019/04/19/Your-VPN-is-a-serious-choice.html</link>
      <pubDate>Fri, 19 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/19/Your-VPN-is-a-serious-choice.html</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a disturbing trend in the past year or so of various VPN companies&#xA;advertising to the general, non-technical public. It&amp;rsquo;s great that the general&#xA;public is starting to become more aware of their privacy online, but I&amp;rsquo;m not a&#xA;fan of these companies exploiting public paranoia to peddle their wares. Using&#xA;a VPN in the first place has potentially grave consequences for your privacy -&#xA;and can often be worse than not using one in the first place.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing first-class Mercurial support on Sourcehut</title>
      <link>https://drewdevault.com/2019/04/15/Announcing-first-class-hg-support-on-sourcehut.html</link>
      <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/15/Announcing-first-class-hg-support-on-sourcehut.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m pleased to announce that the final pieces have fallen into place for&#xA;&lt;a href=&#34;https://www.mercurial-scm.org/&#34;&gt;Mercurial&lt;/a&gt; support on&#xA;&lt;a href=&#34;https://sourcehut.org&#34;&gt;SourceHut&lt;/a&gt;, which is now on-par with our git offering.&#xA;Special thanks are owed to SourceHut contributor Ludovic Chabant, who has been&#xA;instrumental in adding Mercurial support to SourceHut. You may have heard about&#xA;it while this was still experimental - but I&amp;rsquo;m happy to tell you that we have&#xA;now completely integrated Mercurial support into SourceHut! Want to try it out?&#xA;Check out &lt;a href=&#34;https://man.sr.ht/tutorials/set-up-account-and-hg.md&#34;&gt;the tutorial&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, April 2019</title>
      <link>https://drewdevault.com/2019/04/15/Status-update-April-2019.html</link>
      <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/15/Status-update-April-2019.html</guid>
      <description>&lt;p&gt;Spring is here, and I&amp;rsquo;m already miserable in the heat. Crazy weather here in&#xA;Philadelphia - I was woken up at 3 AM by my phone buzzing, telling me to take&#xA;immediate shelter from a tornado. But with my A/C cranked up and the tornado&#xA;safely passed, I&amp;rsquo;ve been able to get a lot of work done.&lt;/p&gt;&#xA;&lt;p&gt;The project with the most impressive progress is&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/aerc2&#34;&gt;aerc2&lt;/a&gt;. It can now read emails, including&#xA;filtering them through arbitrary commands for highlighting diffs or coloring&#xA;quotes, or even rendering HTML email with a TUI browser like w3m.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NewPipe represents the best of FOSS</title>
      <link>https://drewdevault.com/2019/04/02/NewPipe-represents-the-best-of-FOSS.html</link>
      <pubDate>Tue, 02 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/04/02/NewPipe-represents-the-best-of-FOSS.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://newpipe.schabi.org/&#34;&gt;NewPipe&lt;/a&gt; is a free and open-source Android&#xA;application for browsing &amp;amp; watching YouTube. In my opinion, NewPipe is a perfect&#xA;case-study in why free &amp;amp; open source software is great and how our values differ&#xA;from proprietary software in important ways. There&amp;rsquo;s one simple reason: it&amp;rsquo;s&#xA;better than the proprietary YouTube app, in every conceivable way, for free.&lt;/p&gt;&#xA;&lt;p&gt;NewPipe is better because it&amp;rsquo;s user-centric software. It exists to make its&#xA;users lives better, not to enrich its overseers. Because of this, NewPipe has&#xA;many features which are deliberately omitted from the proprietary app, such as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rust is not a good C replacement</title>
      <link>https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html</link>
      <pubDate>Mon, 25 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/03/25/Rust-is-not-a-good-C-replacement.html</guid>
      <description>&lt;p&gt;I have a saying that summarizes my opinion of Rust compared to Go: &amp;ldquo;Go is the&#xA;result of C programmers designing a new programming language, and Rust is the&#xA;result of C++ programmers designing a new programming language&amp;rdquo;. This isn&amp;rsquo;t just&#xA;a metaphor - Go was designed by plan9 alumni, an operating system written in C&#xA;and the source of inspiration for many of Go&amp;rsquo;s features, and Rust was designed&#xA;by the folks at Mozilla - whose flagship product is one of the largest C++&#xA;codebases in the world.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Status update, March 2019</title>
      <link>https://drewdevault.com/2019/03/15/Status-update-March-2019.html</link>
      <pubDate>Fri, 15 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/03/15/Status-update-March-2019.html</guid>
      <description>&lt;p&gt;My todo list is getting completed at a pace it&amp;rsquo;s never seen before, and growing&#xA;at a new pace, too. This full-time FOSS gig is really killing it! As the good&#xA;weather finally starts to roll in, it&amp;rsquo;s time for March&amp;rsquo;s status update. Note: I&#xA;posted updates &lt;a href=&#34;https://www.patreon.com/sircmpwn/posts&#34;&gt;on Patreon&lt;/a&gt; before, but will start posting here&#xA;instead. This medium doesn&amp;rsquo;t depend on a proprietary service, allows for richer&#xA;content, and is useful for my supporters who support my work via other donation&#xA;platforms.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing the release of sway 1.0</title>
      <link>https://drewdevault.com/2019/03/11/Sway-1.0-released.html</link>
      <pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/03/11/Sway-1.0-released.html</guid>
      <description>&lt;p&gt;1,315 days after I started the &lt;a href=&#34;https://swaywm.org&#34;&gt;sway&lt;/a&gt; project, it&amp;rsquo;s finally&#xA;time for &lt;a href=&#34;https://github.com/swaywm/sway/releases/tag/1.0&#34;&gt;sway 1.0&lt;/a&gt;! I had no&#xA;idea at the time how much work I was in for, or how many talented people would&#xA;join and support the project with me. In order to complete this project, we have&#xA;had to rewrite the entire Linux desktop nearly from scratch. Nearly 300 people&#xA;worked together, together writing over 9,000 commits and almost 100,000 lines of&#xA;code, to bring you this release.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sourcehut&#39;s spartan approach to web design</title>
      <link>https://drewdevault.com/2019/03/04/sourcehut-design.html</link>
      <pubDate>Mon, 04 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/03/04/sourcehut-design.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sourcehut.org&#34;&gt;Sourcehut&lt;/a&gt; is known for its brutalist design, with its&#xA;mostly shades-of-gray appearance, conservative color usage, and minimal&#xA;distractions throughout. This article aims to share some insights into the&#xA;philosophy that guides this design, both for the curious reader and for the&#xA;new contributor to the open-source project.&lt;/p&gt;&#xA;&lt;p&gt;The most important principle is that sr.ht is an engineering tool first and&#xA;foremost, and when you&amp;rsquo;re there it&amp;rsquo;s probably because you&amp;rsquo;re in engineering&#xA;mode. Therefore, it&amp;rsquo;s important to bring the information you&amp;rsquo;re there for to the&#xA;forefront, and minimize distractions. In practice, this means that the first&#xA;thing on any page to grab your attention should be the thing that brought you&#xA;there. Consider &lt;a href=&#34;https://git.sr.ht/~sircmpwn/git.sr.ht/tree/master/gitsrht/service.py&#34;&gt;the source file view on git.sr.ht&lt;/a&gt;. For&#xA;reference, here are similar pages on &lt;a href=&#34;https://github.com/torvalds/linux/blob/master/init/main.c&#34;&gt;GitHub&lt;/a&gt; and&#xA;&lt;a href=&#34;https://gitlab.freedesktop.org/libinput/libinput/blob/master/src/evdev.c&#34;&gt;Gitlab&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips for a disciplined git workflow</title>
      <link>https://drewdevault.com/2019/02/25/Using-git-with-discipline.html</link>
      <pubDate>Mon, 25 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/02/25/Using-git-with-discipline.html</guid>
      <description>&lt;p&gt;Basic git usage involves typing a few stock commands to &amp;ldquo;&lt;a href=&#34;https://xkcd.com/1597/&#34;&gt;sync everyone&#xA;up&lt;/a&gt;&amp;rdquo;. Many people who are frustrated with git become so&#xA;because they never progress beyond this surface-level understanding of how it&#xA;works. However, mastering git is easily worth your time. How much of your day is&#xA;spent using git? I would guess that there are many tools in your belt that you&#xA;use half as often and have spent twice the time studying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generics aren&#39;t ready for Go</title>
      <link>https://drewdevault.com/2019/02/18/Generics-arent-ready-for-Go.html</link>
      <pubDate>Mon, 18 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/02/18/Generics-arent-ready-for-Go.html</guid>
      <description>&lt;p&gt;In the distance, a gradual roar begins to grow in volume. A dust cloud is&#xA;visible over the horizon. As it nears, the shouts of the oncoming angry mob can&#xA;be heard. Suddenly, it stops, and a brief silence ensues. Then the air is filled&#xA;with the clackings of hundreds of keyboards, angrily typing the owner&amp;rsquo;s opinion&#xA;about generics and Go. The clans of Java, C#, Rust, C++, TypeScript, Haskell,&#xA;and more - usually mortal enemies - have combined forces to fight in what may&#xA;become one of the greatest flamewars of our time. And none of them read more&#xA;than the title of this article before writing their comment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wayland misconceptions debunked</title>
      <link>https://drewdevault.com/2019/02/10/Wayland-misconceptions-debunked.html</link>
      <pubDate>Sun, 10 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/02/10/Wayland-misconceptions-debunked.html</guid>
      <description>&lt;p&gt;This article has been on my backburner for a while, but it seems Wayland FUD is&#xA;making the news again recently, so I&amp;rsquo;ve bumped up the priority a bit. For those&#xA;new to my blog, I am the maintainer of&#xA;&lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;, a library which implements much of&#xA;the functionality required of a Wayland compositor and is arguably the single&#xA;most influential project in Wayland right now; and &lt;a href=&#34;https://swaywm.org&#34;&gt;sway&lt;/a&gt;, a&#xA;popular Wayland compositor which is nearing version 1.0. Let&amp;rsquo;s go over some of&#xA;the common misconceptions I hear about Wayland and why they&amp;rsquo;re wrong. Feel free&#xA;to pick and choose the misconceptions you believe to read and disregard the&#xA;rest.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My experiences at FOSDEM 2019</title>
      <link>https://drewdevault.com/2019/02/05/FOSDEM-recap.html</link>
      <pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/02/05/FOSDEM-recap.html</guid>
      <description>&lt;p&gt;Currently in a plane on my way home from FOSDEM and, as seems to be a recurring&#xA;pattern when I fly long distances home after attending a conference, a recap is&#xA;readily flowing from my fingertips. This was my first year at FOSDEM, and I&amp;rsquo;m&#xA;glad that I came. I&amp;rsquo;m already excited for next year! It was also my first year&#xA;volunteering, which was equally great and another thing I expect to repeat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why I chose Flask to build sr.ht&#39;s mini-services</title>
      <link>https://drewdevault.com/2019/01/30/Why-I-built-sr.ht-with-Flask.html</link>
      <pubDate>Wed, 30 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/01/30/Why-I-built-sr.ht-with-Flask.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sr.ht&#34;&gt;sr.ht&lt;/a&gt; is a large, production-scale suite of web applications (I&#xA;call them &amp;ldquo;mini-services&amp;rdquo;, as they strike a balance between microservices and&#xA;monolithic applications) which are built in Python with&#xA;&lt;a href=&#34;http://flask.pocoo.org/&#34;&gt;Flask&lt;/a&gt;. David Lord, one of the maintainers of Flask,&#xA;reached out to me when he heard about sr.ht and saw that it was built with&#xA;Flask. At his urging, I&amp;rsquo;d like to share the rationale behind the decision and&#xA;how it&amp;rsquo;s turned out in the long run.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why I use old hardware</title>
      <link>https://drewdevault.com/2019/01/23/Why-I-use-old-hardware.html</link>
      <pubDate>Wed, 23 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/01/23/Why-I-use-old-hardware.html</guid>
      <description>&lt;p&gt;Recently I was making sure my main laptop is ready for travel&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, which mostly&#xA;just entails syncing up the latest version of my music collection. This laptop&#xA;is a Thinkpad X200, which turns 11 years old in July and is my main workstation&#xA;away from home (though I bring a second monitor and an external keyboard for&#xA;long trips). This laptop is a great piece of hardware. 100% of the hardware is&#xA;supported by the upstream Linux kernel, including the usual offenders like WiFi&#xA;and Bluetooth. Niche operating systems like 9front and Minix work great, too.&#xA;Even coreboot works! It&amp;rsquo;s durable, user-serviceable, light, and still looks&#xA;brand new after all of these years. I love all of these things, but there&amp;rsquo;s no&#xA;denying that it&amp;rsquo;s 11 years behind on performance innovations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m going to work full-time on free software</title>
      <link>https://drewdevault.com/2019/01/15/Im-doing-FOSS-full-time.html</link>
      <pubDate>Tue, 15 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/01/15/Im-doing-FOSS-full-time.html</guid>
      <description>&lt;p&gt;Sorry for posting two articles so close to each other - but this is important!&#xA;As I&amp;rsquo;m certain many of you know, I maintain a large collection of free software&#xA;projects, including &lt;a href=&#34;https://github.com/swaywm/sway&#34;&gt;sway&lt;/a&gt;, &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;, &lt;a href=&#34;https://sr.ht&#34;&gt;sr.ht&lt;/a&gt;,&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/scdoc&#34;&gt;scdoc&lt;/a&gt;, &lt;a href=&#34;https://git.sr.ht/~sircmpwn/aerc2&#34;&gt;aerc&lt;/a&gt;, and &lt;a href=&#34;https://git.sr.ht/~sircmpwn&#34;&gt;many&lt;/a&gt;, &lt;a href=&#34;https://github.com/ddevault&#34;&gt;many&lt;/a&gt;&#xA;more. I contribute to more still, working on projects like &lt;a href=&#34;https://alpinelinux.org&#34;&gt;Alpine&#xA;Linux&lt;/a&gt;, &lt;a href=&#34;https://git.sr.ht/~emersion/mrsh&#34;&gt;mrsh&lt;/a&gt;, &lt;a href=&#34;https://musl-libc.org&#34;&gt;musl libc&lt;/a&gt;, and anything else I can. Until&#xA;now, I&amp;rsquo;ve been working on these in my spare time, but just under a year ago I&#xA;wrote &amp;ldquo;&lt;a href=&#34;https://drewdevault.com/2018/02/24/The-road-to-sustainable-FOSS.html&#34;&gt;The path to sustainably working on FOSS full-time&lt;/a&gt;&amp;rdquo; laying out&#xA;my future plans.  Today I&amp;rsquo;m proud to tell you that, thanks to everyone&amp;rsquo;s&#xA;support, I&amp;rsquo;ll be working on free software full-time starting in February.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backups &amp; redundancy at sr.ht</title>
      <link>https://drewdevault.com/2019/01/13/Backups-and-redundancy-at-sr.ht.html</link>
      <pubDate>Sun, 13 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/01/13/Backups-and-redundancy-at-sr.ht.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sr.ht&#34;&gt;sr.ht&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; is &lt;a href=&#34;https://git.sr.ht/~sircmpwn?search=sr.ht&#34;&gt;100% open source&lt;/a&gt; and I encourage&#xA;people to install it on their own infrastructure, especially if they&amp;rsquo;ll be&#xA;sending patches upstream. However, I am equally thrilled to host sr.ht for you&#xA;on the &amp;ldquo;official&amp;rdquo; instance, and most users find this useful because the&#xA;maintenance burden is non-trivial. Today I&amp;rsquo;ll give you an idea of what your&#xA;subscription fee pays for. In this first post on ops at sr.ht, I&amp;rsquo;ll talk about&#xA;backups and redundancy. In future posts, I&amp;rsquo;ll talk about security, high&#xA;availability, automation, and more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Patches welcome</title>
      <link>https://drewdevault.com/2019/01/01/Patches-welcome.html</link>
      <pubDate>Tue, 01 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2019/01/01/Patches-welcome.html</guid>
      <description>&lt;p&gt;Happy new year! This is always a weird &amp;ldquo;holiday&amp;rdquo; for me, since all of the fun&#xA;happened last night. Today is just kind of&amp;hellip; I guess a chance for everyone to&#xA;sober up before work tomorrow? It does tend to invite a sense of reflection and&#xA;is the ideal time to plan for the year ahead. One of my goals in 2019 is to&#xA;change more people&amp;rsquo;s thinking about the open source community and what it means&#xA;to count among their number.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anatomy of a shell</title>
      <link>https://drewdevault.com/2018/12/28/Anatomy-of-a-shell.html</link>
      <pubDate>Fri, 28 Dec 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/12/28/Anatomy-of-a-shell.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been contributing where I can to Simon Ser&amp;rsquo;s &lt;a href=&#34;https://git.sr.ht/~emersion/mrsh&#34;&gt;mrsh&lt;/a&gt; project, a&#xA;work-in-progress strictly POSIX shell implementation. I worked on some small&#xA;mrsh features during my holiday travels and it&amp;rsquo;s in the forefront of my mind, so&#xA;I&amp;rsquo;d like to share some of its design details with you.&lt;/p&gt;&#xA;&lt;p&gt;There are two main components to a shell: parsing and execution. mrsh uses a&#xA;simple &lt;a href=&#34;https://en.wikipedia.org/wiki/Recursive_descent_parser&#34;&gt;recursive descent parser&lt;/a&gt; to generate an AST (Abstract Syntax&#xA;Tree, or an in-memory model of the structure of the parsed source). This design&#xA;was chosen to simplify the code and avoid dependencies like flex/bison, and is a&#xA;good choice given that performance isn&amp;rsquo;t critical for parsing shell scripts.&#xA;Here&amp;rsquo;s an example of the input source and output AST:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Porting Alpine Linux to RISC-V</title>
      <link>https://drewdevault.com/2018/12/20/Porting-Alpine-Linux-to-RISC-V.html</link>
      <pubDate>Thu, 20 Dec 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/12/20/Porting-Alpine-Linux-to-RISC-V.html</guid>
      <description>&lt;p&gt;I recently received my &lt;a href=&#34;https://www.sifive.com/boards/hifive-unleashed&#34;&gt;HiFive Unleashed&lt;/a&gt;, after several excruciating&#xA;months of waiting, and it&amp;rsquo;s incredibly cool. For those unaware, the HiFive&#xA;Unleashed is the first consumer-facing Linux-capable &lt;a href=&#34;https://en.wikipedia.org/wiki/RISC-V&#34;&gt;RISC-V&lt;/a&gt; hardware.&#xA;For anyone who&amp;rsquo;s still lost, RISC-V is an &lt;a href=&#34;https://github.com/riscv&#34;&gt;open&lt;/a&gt;,&#xA;royalty-free &lt;a href=&#34;https://en.wikipedia.org/wiki/Instruction_set_architecture&#34;&gt;instruction set&#xA;architecture&lt;/a&gt;, and&#xA;the HiFive is an &lt;a href=&#34;https://github.com/sifive&#34;&gt;open&lt;/a&gt; CPU implementing it. And here&#xA;it is on my dining room table:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://drewdevault.com/l.sr.ht/JMao.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This board is &lt;em&gt;cool&lt;/em&gt;. I&amp;rsquo;m working on making this hardware available to&#xA;&lt;a href=&#34;https://meta.sr.ht&#34;&gt;builds.sr.ht&lt;/a&gt; users in the next few months, where I intend to use it to&#xA;automate the remainder of the Alpine Linux port and make it available to any&#xA;other operating systems (including non-Linux) and userspace software which are&#xA;interested in working on a RISC-V port. I&amp;rsquo;m fairly certain that this will be the&#xA;first time hardware-backed RISC-V cycles are being made available to the public.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to abandon a FLOSS project</title>
      <link>https://drewdevault.com/2018/12/04/How-to-abandon-a-FLOSS-project.html</link>
      <pubDate>Tue, 04 Dec 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/12/04/How-to-abandon-a-FLOSS-project.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s no secret that maintaining free and open source software is often&#xA;a burdensome and thankless job. I empathise with maintainers who lost interest&#xA;in a project, became demotivated by the endless demands of users, or are no&#xA;longer blessed with enough free time. Whatever the reason, FLOSS work is&#xA;volunteer work, and you&amp;rsquo;re free to stop volunteering at any time.&lt;/p&gt;&#xA;&lt;p&gt;In my opinion, there are two good ways to abandon a project: the &lt;em&gt;fork it&lt;/em&gt;&#xA;option and the &lt;em&gt;hand-off&lt;/em&gt; option. The former is faster and easier, and you can&#xA;pick this if you want to wash your hands of the project ASAP, but has a larger&#xA;effect on the community. The latter is not always possible, requires more work&#xA;on your part, and takes longer, but it has a minimal impact on the community.&lt;/p&gt;</description>
    </item>
    <item>
      <title>sr.ht, the hacker&#39;s forge, now open for public alpha</title>
      <link>https://drewdevault.com/2018/11/15/sr.ht-general-availability.html</link>
      <pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/11/15/sr.ht-general-availability.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m happy to announce today that I&amp;rsquo;m opening &lt;a href=&#34;https://sr.ht&#34;&gt;sr.ht&lt;/a&gt; (pronounced&#xA;&amp;ldquo;sir hat&amp;rdquo;, or any other way you want) to the general public for the remainder of&#xA;the alpha period. Though it&amp;rsquo;s missing some of the features which will be&#xA;available when it&amp;rsquo;s completed, sr.ht today represents a very capable software&#xA;forge which is already serving the needs of many projects in the free &amp;amp; open&#xA;source software community. If you&amp;rsquo;re familiar with the project and ready to&#xA;register your account, you can head straight to &lt;a href=&#34;https://sr.ht&#34;&gt;the sign up&#xA;page&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>It&#39;s not okay to pretend your software is open source</title>
      <link>https://drewdevault.com/2018/10/30/Its-not-okay-to-pretend-youre-open-source.html</link>
      <pubDate>Tue, 30 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/10/30/Its-not-okay-to-pretend-youre-open-source.html</guid>
      <description>&lt;p&gt;Unfortunately, I find myself writing about the Commons Clause again. For those&#xA;not in the know, the Commons Clause is an addendum designed to be added to free&#xA;software licenses. The restrictions it imposes (you cannot sell the software)&#xA;makes the resulting franken-license nonfree. I&amp;rsquo;m not going to link to the&#xA;project which brought this subject back into the discussion - they don&amp;rsquo;t deserve&#xA;the referral - but the continued proliferation of software using the Commons&#xA;Clause gives me reason to speak out against it some more.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How does virtual memory work?</title>
      <link>https://drewdevault.com/2018/10/29/How-does-virtual-memory-work.html</link>
      <pubDate>Mon, 29 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/10/29/How-does-virtual-memory-work.html</guid>
      <description>&lt;p&gt;Virtual memory is an essential part of your computer, and has been for several&#xA;decades. In my &lt;a href=&#34;https://drewdevault.com/2016/05/28/Understanding-pointers.html&#34;&gt;earlier article on pointers&lt;/a&gt;, I compared memory to a&#xA;giant array of octets (bytes), and explained some of the abstractions we make&#xA;on top of that. In actual fact, memory is more complicated than a flat array of&#xA;bytes, and in this article I&amp;rsquo;ll explain how.&lt;/p&gt;&#xA;&lt;p&gt;An astute reader of my earlier article may have considered that pointers on,&#xA;say, an x86_64 system, are 64 bits long&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. With this, we can address up to&#xA;18,446,744,073,709,551,616 bytes (16 exbibytes&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;) of memory. I only have 16&#xA;GiB of RAM on this computer, so what gives? What&amp;rsquo;s the rest of the address space&#xA;for? The answer: all kinds of things! Only a small subset of your address space&#xA;is mapped to physical RAM. A system on your computer called the MMU, or Memory&#xA;Management Unit, is responsible for managing the abstraction that enables this&#xA;and other uses of your address space. This abstraction is called virtual memory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sway 1.0-beta.1 release highlights</title>
      <link>https://drewdevault.com/2018/10/20/Sway-1.0-highlights.html</link>
      <pubDate>Sat, 20 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/10/20/Sway-1.0-highlights.html</guid>
      <description>&lt;p&gt;1,173 days ago, I wrote sway&amp;rsquo;s &lt;a href=&#34;https://github.com/swaywm/sway/commit/6a33e1e3cddac31b762e4376e29c03ccf8f92107&#34;&gt;initial commit&lt;/a&gt;, and 8,269 commits&#xA;followed&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, written by hundreds of contributors. What started as a side&#xA;project became the most fully featured and stable Wayland desktop available, and&#xA;drove the development of what has become the dominant solution for building&#xA;Wayland compositors - &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;, now the&#xA;basis of 10 Wayland compositors.&lt;/p&gt;&#xA;&lt;p&gt;Sway 1.0-beta.1 was just released and is 100% compatible with the &lt;a href=&#34;https://i3wm.org/&#34;&gt;i3 X11 window&#xA;manager&lt;/a&gt;. It&amp;rsquo;s faster, prettier, sips your battery, and&#xA;supports &lt;a href=&#34;https://wayland.freedesktop.org/&#34;&gt;Wayland&lt;/a&gt; clients. When we started, I&#xA;honestly didn&amp;rsquo;t think we&amp;rsquo;d get here. When I decided we&amp;rsquo;d rewrite our internals&#xA;and build wlroots over a year ago, I didn&amp;rsquo;t think we&amp;rsquo;d get here. It&amp;rsquo;s only&#xA;thanks to an amazing team of talented contributors that we did. So what can&#xA;users expect from this release? The difference between sway 0.15 and sway 1.0 is&#xA;like night and day. The annoying bugs which plauged sway 0.15 are gone, and in&#xA;their place is a rock solid Wayland compositor with loads of features you&amp;rsquo;ve&#xA;been asking after for years. The &lt;a href=&#34;https://github.com/swaywm/sway/releases/tag/1.0-beta.1&#34;&gt;official release&#xA;notes&lt;/a&gt; are a bit thick,&#xA;so let me give you a guided tour.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go 1.11 got me to stop ignoring Go</title>
      <link>https://drewdevault.com/2018/10/08/Go-1.11.html</link>
      <pubDate>Mon, 08 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/10/08/Go-1.11.html</guid>
      <description>&lt;p&gt;I took a few looks at Go over the years, starting who knows when. My first&#xA;serious attempt to sit down and learn some damn Go was in 2014, when I set a new&#xA;personal best at almost 200 lines of code before I got sick of it. I kept&#xA;returning to Go because I could see how much potential it had, but every time I&#xA;was turned off for the same reason: &lt;code&gt;GOPATH&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t sign a CLA</title>
      <link>https://drewdevault.com/2018/10/05/Dont-sign-a-CLA.html</link>
      <pubDate>Fri, 05 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/10/05/Dont-sign-a-CLA.html</guid>
      <description>&lt;p&gt;A large minority of open-source projects come with a CLA, or Contributor License&#xA;Agreement, and require you to sign one before they&amp;rsquo;ll merge your patch. These&#xA;agreements typically ask you to go above and beyond the rights you afford the&#xA;project by contributing under the license the software is distributed with. And&#xA;you should never sign one.&lt;/p&gt;&#xA;&lt;p&gt;Free and open source software licenses grant explicit freedoms to three groups:&#xA;the maintainers, the users, &lt;em&gt;and&lt;/em&gt; the contributors. An important freedom is the&#xA;freedom to make changes to the software and to distribute these changes to the&#xA;public. The natural place to do so is by contributing to the upstream project,&#xA;something a project should be thankful for. A CLA replaces this gratitude with&#xA;an attempt to weaken these freedoms in a manner which may stand up to the letter&#xA;of the license, but is far from the spirit.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sway &amp; wlroots at XDC 2018</title>
      <link>https://drewdevault.com/2018/09/30/Sway-wlroots-at-XDC-2018.html</link>
      <pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/09/30/Sway-wlroots-at-XDC-2018.html</guid>
      <description>&lt;p&gt;Just got my first full night of sleep after the return flight from Spain after&#xA;attending &lt;a href=&#34;https://xdc2018.x.org/&#34;&gt;XDC 2018&lt;/a&gt;. It was a lot of fun! I attended&#xA;along with four other major wlroots contributors. Joining me were &lt;a href=&#34;https://github.com/emersion&#34;&gt;Simon Ser&#xA;(emersion)&lt;/a&gt; (a volunteer) and &lt;a href=&#34;https://github.com/ascent12&#34;&gt;Scott Anderson&#xA;(ascent12)&lt;/a&gt; of&#xA;&lt;a href=&#34;https://www.collabora.com/&#34;&gt;Collabora&lt;/a&gt;, who work on both&#xA;&lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt; and&#xA;&lt;a href=&#34;https://github.com/swaywm/sway&#34;&gt;sway&lt;/a&gt;. &lt;a href=&#34;https://github.com/ongy&#34;&gt;ongy&lt;/a&gt; works on&#xA;wlroots, &lt;a href=&#34;https://github.com/swaywm/hsroots&#34;&gt;hsroots&lt;/a&gt;, and&#xA;&lt;a href=&#34;https://github.com/waymonad/waymonad&#34;&gt;waymonad&lt;/a&gt;, and joined us on behalf&#xA;of &lt;a href=&#34;https://www.igel.com/&#34;&gt;IGEL&lt;/a&gt;. Finally, we were joined by &lt;a href=&#34;https://github.com/agx&#34;&gt;Guido Günther&#xA;(agx)&lt;/a&gt; of &lt;a href=&#34;https://puri.sm/&#34;&gt;Purism&lt;/a&gt;, who works with us&#xA;on wlroots and on the Librem 5. This was my first time meeting most of them&#xA;face-to-face!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with qemu</title>
      <link>https://drewdevault.com/2018/09/10/Getting-started-with-qemu.html</link>
      <pubDate>Mon, 10 Sep 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/09/10/Getting-started-with-qemu.html</guid>
      <description>&lt;p&gt;I often get asked questions about using my software, particularly sway, on&#xA;hypervisors like VirtualBox and VMWare, as well as for general advice on&#xA;which hypervisor to choose. My answer is always the same: qemu. There&amp;rsquo;s no&#xA;excuse to use anything other than qemu, in my books. But I can admit that it&#xA;might be a bit obtuse to understand at first. qemu&amp;rsquo;s greatest strength is also&#xA;its greatest weakness: it has so many options that it&amp;rsquo;s hard to know which ones&#xA;you need just to get started.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Conservative web development</title>
      <link>https://drewdevault.com/2018/09/04/Conservative-web-development.html</link>
      <pubDate>Tue, 04 Sep 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/09/04/Conservative-web-development.html</guid>
      <description>&lt;p&gt;Today I turned off my ad blocker, enabled JavaScript, opened my network monitor,&#xA;and clicked the first link on Hacker News - a New York Times article. It started&#xA;by downloading a megabyte of data as it rendered the page over the course of&#xA;eight full seconds. The page opens with an advertisement 281 pixels tall, placed&#xA;before even the title of the article. As I scrolled down, more and more requests&#xA;were made, downloading a total of 2.8 MB of data with 748 HTTP requests. An&#xA;article was weaved between a grand total of 1419 vertical pixels of ad space,&#xA;greater than the vertical resolution of my display. Another 153-pixel ad is&#xA;shown at the bottom, after the article. Four of the ads were identical.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to make a self-hosted video livestream</title>
      <link>https://drewdevault.com/2018/08/26/Self-hosted-livestreaming.html</link>
      <pubDate>Sun, 26 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/08/26/Self-hosted-livestreaming.html</guid>
      <description>&lt;p&gt;I have seen some articles in the past which explain how to build the ecosystem&#xA;&lt;em&gt;around&lt;/em&gt; your video streaming, such as live chat and forums, but which leave the&#xA;actual video streaming to Twitch.tv. I made a note the last time I saw one of&#xA;these articles to write one of my own explaining the video bit. As is often the&#xA;case with video, we&amp;rsquo;ll be using the excellent &lt;a href=&#34;http://ffmpeg.org/&#34;&gt;ffmpeg&lt;/a&gt; tool&#xA;for this. If it&amp;rsquo;s A/V-related, ffmpeg can probably do it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Commons Clause will destroy open source</title>
      <link>https://drewdevault.com/2018/08/22/Commons-clause-will-destroy-open-source.html</link>
      <pubDate>Wed, 22 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/08/22/Commons-clause-will-destroy-open-source.html</guid>
      <description>&lt;p&gt;An alarmist title, I know, but it&amp;rsquo;s true. If the &lt;a href=&#34;https://commonsclause.com/&#34;&gt;Commons&#xA;clause&lt;/a&gt; were to be adopted by all open source&#xA;projects, they would cease to be open source&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, and therefore the Commons&#xA;clause is trying to destroy open source. When this first appeared I spoke out&#xA;about it in discussion threads around the net, but didn&amp;rsquo;t think anyone would&#xA;take it seriously. Well, yesterday, some parts of Redis &lt;a href=&#34;https://redislabs.com/community/commons-clause/&#34;&gt;became proprietary&#xA;software&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The Commons Clause promoted by Kevin Wang presents one of the greatest&#xA;existential threats to open source I&amp;rsquo;ve ever seen. It preys on a vulnerability&#xA;open source maintainers all suffer from, and one I can strongly relate to. It&#xA;&lt;em&gt;sucks&lt;/em&gt; to not be able to make money from your open source work. It &lt;em&gt;really&lt;/em&gt;&#xA;sucks when companies are using your work to make money for themselves. If a&#xA;solution presents itself, it&amp;rsquo;s tempting to jump at it. But the Commons Clause&#xA;doesn&amp;rsquo;t present a solution for supporting open source software. It presents a&#xA;framework for turning open source software into proprietary software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I don&#39;t trust Signal</title>
      <link>https://drewdevault.com/2018/08/08/Signal.html</link>
      <pubDate>Wed, 08 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/08/08/Signal.html</guid>
      <description>&lt;p&gt;Occasionally when Signal is in the press and getting a lot of favorable&#xA;discussion, I feel the need to step into various forums, IRC channels, and so&#xA;on, and explain why I don&amp;rsquo;t trust Signal. Let&amp;rsquo;s do a blog post instead.&lt;/p&gt;&#xA;&lt;p&gt;Off the bat, let me explain that I expect a tool which claims to be secure to&#xA;actually be secure. I don&amp;rsquo;t view &amp;ldquo;but that makes it harder for the average&#xA;person&amp;rdquo; as an acceptable excuse. If Edward Snowden and Bruce Schneier are going&#xA;to spout the virtues of the app, I expect it to &lt;em&gt;actually&lt;/em&gt; be secure when it&#xA;matters - when vulnerable people using it to encrypt sensitive communications&#xA;are targeted by smart and powerful adversaries.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up a local dev mail server</title>
      <link>https://drewdevault.com/2018/08/05/Local-mail-server.html</link>
      <pubDate>Sun, 05 Aug 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/08/05/Local-mail-server.html</guid>
      <description>&lt;p&gt;As part of my work on &lt;a href=&#34;https://meta.sr.ht&#34;&gt;lists.sr.ht&lt;/a&gt;, it was necessary for&#xA;me to configure a self-contained mail system on localhost that I could test&#xA;with. I hope that others will go through a similar process in the future when&#xA;they set up &lt;a href=&#34;https://git.sr.ht/~sircmpwn/lists.sr.ht&#34;&gt;the code&lt;/a&gt; for hacking on&#xA;locally or when working on other email related software, so here&amp;rsquo;s a guide on&#xA;how you can set it up.&lt;/p&gt;&#xA;&lt;p&gt;There are lots of things you can set up on a mail server, like virtual mail&#xA;accounts backed by a relational database, IMAP access, spam filtering, and so&#xA;on. We&amp;rsquo;re not going to do any of that in this article - we&amp;rsquo;re just interested in&#xA;something we can test our email code with. To start, install your distribution&#xA;of &lt;code&gt;postfix&lt;/code&gt; and pop open that &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a Wayland compositor with wlroots: shells</title>
      <link>https://drewdevault.com/2018/07/29/Wayland-shells.html</link>
      <pubDate>Sun, 29 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/07/29/Wayland-shells.html</guid>
      <description>&lt;p&gt;I apologise for not writing about wlroots more frequently. I don&amp;rsquo;t really enjoy&#xA;working on the McWayface codebase this series of blog posts was originally&#xA;about, so we&amp;rsquo;re just going to dismiss that and talk about the various pieces of&#xA;a Wayland compositor in a more free-form style. I hope you still find it useful!&lt;/p&gt;&#xA;&lt;p&gt;Today, we&amp;rsquo;re going to talk about shells. But to make sure we&amp;rsquo;re on the same page&#xA;first, a quick refresher on surfaces. A basic primitive of the Wayland protocol&#xA;is the concept of a &amp;ldquo;surface&amp;rdquo;. A surface is a rectangular box of pixels sent&#xA;from the client to the compositor to display on-screen. A surface can source&#xA;its pixels from a number of places, including raw pixel data in memory, or&#xA;opaque handles to GPU resources that can be rendered without copying pixels on&#xA;the CPU. These surfaces can also evolve over time, using &amp;ldquo;damage&amp;rdquo; to indicate&#xA;which parts have changed to reduce the workload of the compositor when&#xA;re-rendering them. However, making a surface and filling it with pixels is not&#xA;enough to get the compositor to show them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git is already federated &amp; decentralized</title>
      <link>https://drewdevault.com/2018/07/23/Git-is-already-distributed.html</link>
      <pubDate>Mon, 23 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/07/23/Git-is-already-distributed.html</guid>
      <description>&lt;p&gt;There have always been murmurs about &amp;ldquo;replacing GitHub with something&#xA;decentralized!&amp;rdquo;, but in the wake of the Microsoft acquisition these murmurs have&#xA;become conversations. In particular, this blog post is a direct response to&#xA;forge-net (formerly known as &lt;a href=&#34;https://github.com/git-federation/gitpub&#34;&gt;GitPub&lt;/a&gt;). They want to federate and&#xA;decentralize git using ActivityPub, the same technology leveraged by Mastodon&#xA;and PeerTube. But get this: git is already federated &lt;em&gt;and&lt;/em&gt; decentralized!&lt;/p&gt;&#xA;&lt;p&gt;I already spoke at length about how a large minority of the git community uses&#xA;email for collaboration in my &lt;a href=&#34;https://drewdevault.com/2018/07/02/Email-driven-git.html&#34;&gt;previous article&lt;/a&gt; on the subject.&#xA;Definitely give it a read if you haven&amp;rsquo;t already. In this article I want to&#xA;focus on comparing this model with the possibilities afforded by ActivityPub&#xA;and provide direction for new forge&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; projects to work towards embracing and&#xA;improving git&amp;rsquo;s email-based collaboration tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Input handling in wlroots</title>
      <link>https://drewdevault.com/2018/07/17/Input-handling-in-wlroots.html</link>
      <pubDate>Tue, 17 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/07/17/Input-handling-in-wlroots.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve said before that wlroots is a &amp;ldquo;batteries not included&amp;rdquo; kind of library, and&#xA;one of the places where that is most apparent is with our approach to input&#xA;handling. We implemented a very hands-off design for input, in order to support&#xA;many use-cases: desktop input, phones with and without USB-OTG HIDs plugged in,&#xA;multiple mice bound to a single cursor, multiple keyboards per seat, simulated&#xA;input from fake input devices, on-screen keyboards, input which is processed by&#xA;the compositor but not sent to clients&amp;hellip; we support all of these use-cases and&#xA;even more. However, the drawback of our powerful design is that it&amp;rsquo;s confusing.&#xA;Very confusing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple, correct, fast: in that order</title>
      <link>https://drewdevault.com/2018/07/09/Simple-correct-fast.html</link>
      <pubDate>Mon, 09 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/07/09/Simple-correct-fast.html</guid>
      <description>&lt;p&gt;The single most important quality in a piece of software is simplicity. It&amp;rsquo;s&#xA;more important than doing the task you set out to achieve. It&amp;rsquo;s more important&#xA;than performance. The reason is straightforward: if your solution is not simple,&#xA;it will not be correct or fast.&lt;/p&gt;&#xA;&lt;p&gt;Given enough time, you&amp;rsquo;ll find that all software which solves sufficiently&#xA;complex problems is going to (1) have bugs and (2) have performance problems.&#xA;Software with bugs is incorrect. Software with performance problems is not fast.&#xA;We will face this fact as surely as we will face death and taxes, and we should&#xA;prepare ourselves accordingly. Let&amp;rsquo;s consider correctness first.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The advantages of an email-driven git workflow</title>
      <link>https://drewdevault.com/2018/07/02/Email-driven-git.html</link>
      <pubDate>Mon, 02 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/07/02/Email-driven-git.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.18.0.txt&#34;&gt;git 2.18.0&lt;/a&gt; has been released, and with it my first contribution to&#xA;git has shipped! My patch was for a git feature which remains disappointingly&#xA;obscure: &lt;a href=&#34;https://git-scm.com/docs/git-send-email&#34;&gt;git send-email&lt;/a&gt;. I want to&#xA;introduce my readers to this feature and speak to the benefits of using an&#xA;email-driven git workflow - the workflow git was originally designed for.&lt;/p&gt;&#xA;&lt;p&gt;Email isn&amp;rsquo;t as sexy as GitHub (and its imitators), but it has several&#xA;advantages over the latter. Email is standardized, federated, well-understood,&#xA;and venerable. A very large body of email-related software exists and is equally&#xA;reliable and well-understood. You can interact with email using only open source&#xA;software and customize your workflow at every level of the stack - filtering,&#xA;organizing, forwarding, replying, and so on; in any manner you choose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A quick review of my Let&#39;s Encrypt setup</title>
      <link>https://drewdevault.com/2018/06/27/My-lets-encrypt-setup.html</link>
      <pubDate>Wed, 27 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/06/27/My-lets-encrypt-setup.html</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s Encrypt makes TLS much easier for pretty much everyone, but can still&#xA;be annoying to use. It took me a while to smooth over the cracks in my Let&amp;rsquo;s&#xA;Encrypt configuration across my (large) fleet of different TLS-enabled services.&#xA;I wanted to take a quick moment to share setup with you.&lt;/p&gt;&#xA;&lt;p&gt;2020-01-02 update: acme-client is unmaintained and caught the BSD disease&#xA;anyway. I use &lt;a href=&#34;https://github.com/ndilieto/uacme&#34;&gt;uacme&lt;/a&gt; and my current&#xA;procedure is documented on my &lt;a href=&#34;https://drewdevault.com/new-server.html&#34;&gt;new server checklist&lt;/a&gt;. It might&#xA;not be exactly applicable to your circumstances, YMMV.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Should you move from GitHub to sr.ht</title>
      <link>https://drewdevault.com/2018/06/05/Should-you-move-to-sr.ht.html</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/06/05/Should-you-move-to-sr.ht.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not terribly concerned about Microsoft&amp;rsquo;s acquisition of GitHub, but I&#xA;don&amp;rsquo;t fault those who are worried. I&amp;rsquo;ve been working on my alternative platform,&#xA;&lt;a href=&#34;https://sr.ht&#34;&gt;sr.ht&lt;/a&gt;, for quite a while. I&amp;rsquo;m not about to leave GitHub because&#xA;of Microsoft alone. I do have some political disagreements with GitHub and&#xA;Microsoft, but those are also not the main reason that I&amp;rsquo;m building sr.ht. I&#xA;simply think I can do it better. If my approach aligns with your needs, then&#xA;sr.ht may be the platform for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I maintain FOSS projects</title>
      <link>https://drewdevault.com/2018/06/01/How-I-maintain-FOSS-projects.html</link>
      <pubDate>Fri, 01 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/06/01/How-I-maintain-FOSS-projects.html</guid>
      <description>&lt;p&gt;Today&amp;rsquo;s is another blog post which has been on my to-write list for a while. I&#xA;have hesitated a bit to write about this, because I&amp;rsquo;m certain that my approach&#xA;isn&amp;rsquo;t perfect. I think it&amp;rsquo;s pretty good, though, and people who work with me in&#xA;FOSS agreed after a quick survey. So! Let&amp;rsquo;s at least put it out there and&#xA;discuss it.&lt;/p&gt;&#xA;&lt;p&gt;There are a few central principles I use to guide my maintainership work:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embedding files in C programs with koio</title>
      <link>https://drewdevault.com/2018/05/29/Embedding-files-in-C.html</link>
      <pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/05/29/Embedding-files-in-C.html</guid>
      <description>&lt;p&gt;Quick blog post today to introduce a new tool I wrote:&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/koio&#34;&gt;koio&lt;/a&gt;. This is a small tool which takes a&#xA;list of files and embeds them in a C file. A library provides an fopen shim&#xA;which checks the list of embedded files before resorting to the real filesystem.&lt;/p&gt;&#xA;&lt;p&gt;I made this tool for &lt;a href=&#34;https://github.com/SirCmpwn/chopsui&#34;&gt;chopsui&lt;/a&gt;, where I&#xA;eventually want to be able to bundle up sui markup, stylesheets, images, and so&#xA;on in a statically linked chopsui program. Many projects have small tools which&#xA;serve a similar purpose, but it was simple enough and useful enough that I chose&#xA;to make something generic so it could be used on several projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why did we replace wlc?</title>
      <link>https://drewdevault.com/2018/05/27/Why-rewrite-wlc.html</link>
      <pubDate>Sun, 27 May 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/05/27/Why-rewrite-wlc.html</guid>
      <description>&lt;p&gt;For a little over a year, I&amp;rsquo;ve been working with a bunch of talented C&#xA;developers to build a replacement for the &lt;a href=&#34;https://github.com/Cloudef/wlc&#34;&gt;wlc&lt;/a&gt;&#xA;library. The result is &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;, and we&amp;rsquo;re&#xA;still working on completing it and updating our software to use it. The&#xA;&lt;a href=&#34;https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/&#34;&gt;conventional&#xA;wisdom&lt;/a&gt;&#xA;suggests that rewriting your code from scratch is almost never the right idea.&#xA;So why did we do it, and how is it working out? I have spoken a little about&#xA;this in the past, but we&amp;rsquo;ll answer this question in detail today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing scdoc, a man page generator</title>
      <link>https://drewdevault.com/2018/05/13/scdoc.html</link>
      <pubDate>Sun, 13 May 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/05/13/scdoc.html</guid>
      <description>&lt;p&gt;A man page generator is one of those tools that I&amp;rsquo;ve said I would write for a&#xA;long time, being displeased with most of the other options. For a while I used&#xA;asciidoc, but was never fond of it. There are a few things I want to see in a&#xA;man page generator:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;A syntax which is easy to read and write&lt;/li&gt;&#xA;&lt;li&gt;Small and with minimal dependencies&lt;/li&gt;&#xA;&lt;li&gt;Designed with man pages as a first-class target&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;All of the existing tools failed some of these criteria.&#xA;&lt;a href=&#34;http://asciidoc.org/&#34;&gt;asciidoc&lt;/a&gt; hits #1, but fails #2 and #3 by being written&#xA;in XSLT+Python and targetting man pages as a second-class citizen.&#xA;&lt;a href=&#34;http://mandoc.bsd.lv/&#34;&gt;mdocml&lt;/a&gt; fails #1 (it&amp;rsquo;s not much better than writing raw&#xA;roff), and to a lesser extent also fails criteria #2&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Another option,&#xA;&lt;a href=&#34;https://github.com/rtomayko/ronn&#34;&gt;ronn&lt;/a&gt; meets criteria #1 and #3, but it&amp;rsquo;s&#xA;written in Ruby and fails #2. All of these are fine for the niches they fill,&#xA;but not what I&amp;rsquo;m looking for. And as for GNU info&amp;hellip; ugh.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redirecting stderr of a running process</title>
      <link>https://drewdevault.com/2018/05/04/Redirecitng-stderr-of-running-process.html</link>
      <pubDate>Fri, 04 May 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/05/04/Redirecitng-stderr-of-running-process.html</guid>
      <description>&lt;p&gt;During the KDE sprint in Berlin, &lt;a href=&#34;http://www.subdiff.de/&#34;&gt;Roman Gilg&lt;/a&gt; leaned&#xA;over to me and asked if I knew how to redirect the stderr of an already-running&#xA;process to a file. I Googled it and found underwhelming answers using strace and&#xA;trying to decipher the output by reading the write syscalls. Instead, I thought&#xA;a gdb based approach would work better, and after putting the pieces together&#xA;Roman insisted I wrote a blog post on the topic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Google embraces, extends, and extinguishes</title>
      <link>https://drewdevault.com/2018/05/03/Google-embraces-extends-extinguishes.html</link>
      <pubDate>Thu, 03 May 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/05/03/Google-embraces-extends-extinguishes.html</guid>
      <description>&lt;p&gt;Microsoft infamously coined the euphemism &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish&#34;&gt;embrace, extend,&#xA;extinguish&lt;/a&gt;&amp;rdquo; to&#xA;describe their strategy for disrupting markets dominated by open standards.&#xA;These days, Microsoft seems to have turned the other leaf, contributing to a&#xA;huge amount of open source and supporting open standards, and is becoming a good&#xA;citizen of the technology community. It&amp;rsquo;s time to turn our concerns to Google.&lt;/p&gt;&#xA;&lt;p&gt;Google famously &amp;ldquo;embraced&amp;rdquo; email on April Fool&amp;rsquo;s day, 2004, which is of course&#xA;based on an open standard and federates with the rest of the world. If you&amp;rsquo;ve&#xA;read the news lately, you might have seen that Google is shipping a big update&#xA;to GMail soon, which adds &amp;ldquo;self-destructing&amp;rdquo; emails that vanish from the&#xA;recipient&amp;rsquo;s inbox after a time. Leaving aside that this promise is impossible to&#xA;deliver, look at the implementation - Google emails a link to a webpage with the&#xA;actual email content, and does magic in their client to make it look seamless.&#xA;Thus, they &amp;ldquo;extend&amp;rdquo; email. The &amp;ldquo;extinguish&amp;rdquo; with GMail is also well underway -&#xA;it&amp;rsquo;s infamous for having an extremely strict spam filter for incoming emails&#xA;from people who run personal or niche mail servers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sway reporting in from KDE&#39;s Berlin development sprint</title>
      <link>https://drewdevault.com/2018/04/28/KDE-Sprint-retrospective.html</link>
      <pubDate>Sat, 28 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/04/28/KDE-Sprint-retrospective.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m writing to you from an airplane on my way back to Philadelphia, after&#xA;spending a week in Berlin working with the KDE team. It was great to meet those&#xA;folks and work with them for a while. It&amp;rsquo;ll take me some time to get the taste&#xA;of C++ out of my mouth, though! In all seriousness, it was a very productive&#xA;week and I feel like we have learned a lot about each other&amp;rsquo;s projects and have&#xA;a strengthened interest in collaborating more in the future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Achtung! Decentralize, decentralize, decentralize!</title>
      <link>https://drewdevault.com/2018/03/24/Decentralize-decentralize-decentralize.html</link>
      <pubDate>Sat, 24 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/03/24/Decentralize-decentralize-decentralize.html</guid>
      <description>&lt;p&gt;I can hardly believe it, but the media is finally putting Facebook&amp;rsquo;s feet to the&#xA;fire! No longer is it just the weird paranoid kids shouting at everyone to stop&#xA;giving all of their information to these companies. We need to take this bull by&#xA;the horns and drive it in a productive direction, and for that reason, it&amp;rsquo;s time&#xA;to talk about decentralization, federation, and open source.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;This article has been &lt;a href=&#34;http://getcolorings.com/ru-decentralize&#34;&gt;translated into&#xA;Russian&lt;/a&gt; by &lt;a href=&#34;http://getcolorings.com&#34;&gt;Get&#xA;Colorings&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hack everything without fear</title>
      <link>https://drewdevault.com/2018/03/17/Hack-everything-without-fear.html</link>
      <pubDate>Sat, 17 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/03/17/Hack-everything-without-fear.html</guid>
      <description>&lt;p&gt;We live in a golden age of open source, and it can sometimes be easy to forget&#xA;the privileges that this affords us. I&amp;rsquo;m writing this article with vim, in a&#xA;terminal emulator called urxvt, listening to music with mpv, in a Sway desktop&#xA;session, on the Linux kernel. Supporting this are libraries like glibc or musl,&#xA;harfbuzz, and mesa. I also have the support of the AMDGPU video driver, libinput&#xA;and udev, alsa and pulseaudio.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to write an IRC bot</title>
      <link>https://drewdevault.com/2018/03/10/How-to-write-an-IRC-bot.html</link>
      <pubDate>Sat, 10 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/03/10/How-to-write-an-IRC-bot.html</guid>
      <description>&lt;p&gt;My disdain for Slack and many other Silicon Valley chat clients is &lt;a href=&#34;https://drewdevault.com/2015/11/01/Please-stop-using-slack.html&#34;&gt;well&#xA;known&lt;/a&gt;, as is my undying love for IRC.&#xA;With Slack making the news lately after their recent decision to disable the IRC&#xA;and XMPP gateways in a classic &lt;a href=&#34;https://en.wikipedia.org/wiki/Embrace%2C_extend%2C_and_extinguish&#34;&gt;Embrace Extend&#xA;Extinguish&lt;/a&gt;&#xA;move, they&amp;rsquo;ve been on my mind and I feel like writing about them more. Let&amp;rsquo;s&#xA;compare writing a bot for Slack with writing an IRC bot.&lt;/p&gt;&#xA;&lt;p&gt;First of all, let&amp;rsquo;s summarize the process for making a Slack bot. Full details&#xA;are available in &lt;a href=&#34;https://api.slack.com/slack-apps&#34;&gt;their documentation&lt;/a&gt;. The&#xA;basic steps are:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a Wayland Compositor, Part 3: Rendering a window</title>
      <link>https://drewdevault.com/2018/02/28/Writing-a-wayland-compositor-part-3.html</link>
      <pubDate>Wed, 28 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/28/Writing-a-wayland-compositor-part-3.html</guid>
      <description>&lt;p&gt;This is the third in a series of articles on the subject of writing a Wayland&#xA;compositor from scratch using &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;.&#xA;Check out &lt;a href=&#34;https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html&#34;&gt;the first article&lt;/a&gt;&#xA;if you haven&amp;rsquo;t already. We left off with a Wayland server which accepts client&#xA;connections and exposes a handful of globals, but does not do anything&#xA;particularly interesting yet. Our goal today is to do something interesting -&#xA;render a window!&lt;/p&gt;&#xA;&lt;p&gt;The commit that this article dissects is&#xA;&lt;a href=&#34;https://github.com/SirCmpwn/mcwayland/commit/342b7b6&#34;&gt;342b7b6&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The path to sustainably working on FOSS full-time</title>
      <link>https://drewdevault.com/2018/02/24/The-road-to-sustainable-FOSS.html</link>
      <pubDate>Sat, 24 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/24/The-road-to-sustainable-FOSS.html</guid>
      <description>&lt;p&gt;This is an article I didn&amp;rsquo;t think I&amp;rsquo;d be writing any time soon. I&amp;rsquo;ve aspired to&#xA;work full-time on my free and open source software projects for a long time now,&#xA;but I have never expected that it could work. However, as of this week, I&#xA;finally have enough recurring donation revenue to break even on FOSS, and I&amp;rsquo;ve&#xA;started to put the extra cash away. I needed to set the next donation goal and&#xA;ran the numbers to figure out what it takes to work on FOSS full-time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a Wayland Compositor, Part 2: Rigging up the server</title>
      <link>https://drewdevault.com/2018/02/22/Writing-a-wayland-compositor-part-2.html</link>
      <pubDate>Thu, 22 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/22/Writing-a-wayland-compositor-part-2.html</guid>
      <description>&lt;p&gt;This is the second in a series of articles on the subject of writing a Wayland&#xA;compositor from scratch using &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;.&#xA;Check out &lt;a href=&#34;https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html&#34;&gt;the first article&lt;/a&gt;&#xA;if you haven&amp;rsquo;t already. Last time, we ended up with an application which fired&#xA;up a wlroots backend, enumerated output devices, and drew some pretty colors on&#xA;the screen. Today, we&amp;rsquo;re going to start accepting Wayland client connections,&#xA;though we aren&amp;rsquo;t going to be doing much with them yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a Wayland Compositor, Part 1: Hello wlroots</title>
      <link>https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html</link>
      <pubDate>Sat, 17 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html</guid>
      <description>&lt;p&gt;This is the first in a series of &lt;em&gt;many&lt;/em&gt; articles I&amp;rsquo;m writing on the subject of&#xA;building a functional Wayland compositor from scratch. As you may know, I am the&#xA;lead maintainer of &lt;a href=&#34;https://github.com/swaywm/sway&#34;&gt;sway&lt;/a&gt;, a reasonably popular&#xA;Wayland compositor. Along with many other talented developers, we&amp;rsquo;ve been&#xA;working on &lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt; over the past few&#xA;months. This is a powerful tool for creating new Wayland compositors, but it is&#xA;very dense and difficult to understand. Do not despair! The intention of these&#xA;articles is to make you understand and feel comfortable using it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The last years</title>
      <link>https://drewdevault.com/2018/02/13/The-last-years.html</link>
      <pubDate>Tue, 13 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/13/The-last-years.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;August 14th, 2019&lt;/strong&gt; PYONGYANG IN CHAOS AS PANDEMIC DECIMATES LEADERSHIP.&#xA;Sources within the country have reported that a fast-acting and deadly&#xA;infectious disease has suddenly infected the population of Pyongyang, the&#xA;capital city of North Korea, where most of the country&amp;rsquo;s political elite live.&#xA;Unconfirmed reports suggest that a significant fraction of the leadership has&#xA;been affected.&lt;/p&gt;&#xA;&lt;p&gt;The reclusive country has appealed for immediate aid from the international&#xA;community and it is reported that a group of medical experts from Seoul have&#xA;been permitted to enter via the Joint Security Area. Representatives from the&#xA;United States Center for Disease Control and the Chinese Center for Disease&#xA;Control and Prevention have also agreed to send representatives into the country&#xA;to help control the outbreak.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to POSIX shell</title>
      <link>https://drewdevault.com/2018/02/05/Introduction-to-POSIX-shell.html</link>
      <pubDate>Mon, 05 Feb 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/02/05/Introduction-to-POSIX-shell.html</guid>
      <description>&lt;p&gt;What the heck is the POSIX shell anyway? Well, the POSIX (the Portable Operating&#xA;System Interface) shell is the standard Unix shell - standard meaning it was&#xA;formally defined and shipped in a published standard. This makes shell scripts&#xA;written for it portable, something no other shell can lay claim to. The POSIX&#xA;shell is basically a formalized version of the venerable Bourne shell, and on&#xA;your system it lives at &lt;code&gt;/bin/sh&lt;/code&gt;, unless you&amp;rsquo;re one of the unlucky masses for&#xA;whom this is a symlink to bash.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sway and client side decorations</title>
      <link>https://drewdevault.com/2018/01/27/Sway-and-client-side-decorations.html</link>
      <pubDate>Sat, 27 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/01/27/Sway-and-client-side-decorations.html</guid>
      <description>&lt;p&gt;You may have recently seen an article from GNOME on the subject of client side&#xA;decorations (CSD) titled &lt;a href=&#34;https://blogs.gnome.org/tbernard/2018/01/26/csd-initiative/&#34;&gt;Introducing the CSD&#xA;Initiative&lt;/a&gt;. It&#xA;states some invalid assumptions which I want to clarify, and I want to tell you&#xA;&lt;a href=&#34;https://github.com/swaywm/sway&#34;&gt;Sway&lt;/a&gt;&amp;rsquo;s&#xA;stance on the subject. I also speak for the rest of the projects involved in&#xA;&lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt; on this matter, including &lt;a href=&#34;https://github.com/way-cooler/way-cooler&#34;&gt;Way&#xA;Cooler&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/Ongy/waymonad&#34;&gt;waymonad&lt;/a&gt;, and&#xA;&lt;a href=&#34;https://github.com/Bl4ckb0ne/bspwc&#34;&gt;bspwc&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The subject of which party is responsible for window decorations on Wayland (the&#xA;client or the server) has been a subject of much debate. I want to clarify that&#xA;though GNOME may imply that a consensus has been reached, this is not the case.&#xA;CSD have real problems that have long been waved away by its supporters:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fee breakdown for various donation platforms</title>
      <link>https://drewdevault.com/2018/01/16/Fees-on-donation-platforms.html</link>
      <pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/01/16/Fees-on-donation-platforms.html</guid>
      <description>&lt;p&gt;Understanding fees are a really confusing part of supporting creators of things&#xA;you like. I provide a few ways for people to support my work, and my supporters&#xA;can struggle to understand the differences between them. It comes down to fees,&#xA;of which there are several kinds (note: I just made these terms up):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Transaction fees&lt;/strong&gt; are charged by the payment processor (the company that&#xA;takes down your card number and runs the transaction with your bank). These&#xA;are typically in the form of a percentage of the transaction plus a few cents.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Platform fees&lt;/strong&gt; are charged by the platform (e.g. Patreon) to run their&#xA;operation, typically in the form of a fixed percentage of the transaction.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Withdrawal fees&lt;/strong&gt; are charged to move money from the platform to the&#xA;creator&amp;rsquo;s bank account. These vary depending on the withdrawal processor.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Taxes&lt;/strong&gt; are also implicated, depending on how much the creator makes.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All of this adds up to a very confusing picture. I&amp;rsquo;ve made a calculator to help&#xA;you sort it out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn about your package manager</title>
      <link>https://drewdevault.com/2018/01/10/Learn-your-package-manager.html</link>
      <pubDate>Wed, 10 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/01/10/Learn-your-package-manager.html</guid>
      <description>&lt;p&gt;Tools like virtualenv, rbenv, and to a lesser extent npm and pip, are&#xA;occasionally useful in development but encourage bad practices in production.&#xA;Many people forget that their distro already has a package manager! And there&amp;rsquo;s&#xA;more&amp;ndash; you, the user, can write packages for it!&lt;/p&gt;&#xA;&lt;p&gt;Your distro&amp;rsquo;s package repositories probably already have a lot of your&#xA;dependencies, and can conveniently update your software alongside the rest of&#xA;your system. On the whole you can expect your distro packages to be much better&#xA;citizens on your system than a language-specific package manager will be.&#xA;Additionally, pretty much all distros provide a means for you to host your own&#xA;package repositories, from which you can install and update any packages you&#xA;choose to make.&lt;/p&gt;</description>
    </item>
    <item>
      <title>fork is not my favorite syscall</title>
      <link>https://drewdevault.com/2018/01/02/The-case-against-fork.html</link>
      <pubDate>Tue, 02 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2018/01/02/The-case-against-fork.html</guid>
      <description>&lt;p&gt;This article has been on my to-write list for a while now. In my opinion, fork&#xA;is one of the most questionable design choices of Unix. I don&amp;rsquo;t understand the&#xA;circumstances that led to its creation, and I grieve over the legacy rationale&#xA;that keeps it alive to this day.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s set the scene. It&amp;rsquo;s 1971 and you&amp;rsquo;re a fly on the wall in Bell Labs,&#xA;watching the first edition of Unix being designed for the PDP-11/20. This&#xA;machine has a 16-bit address space with no more than 248 kilobytes of memory.&#xA;They&amp;rsquo;re discussing how they&amp;rsquo;re going to support programs that spawn new&#xA;programs, and someone has a brilliant idea. &amp;ldquo;What if we copied the entire&#xA;address space of the program into a new process running from the same spot, then&#xA;let them overwrite themselves with the new program?&amp;rdquo; This got a rousing laugh&#xA;out of everyone present, then they moved on to a better design which would&#xA;become immortalized in the most popular and influential operating system of all&#xA;time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>wlroots whitepaper available</title>
      <link>https://drewdevault.com/2017/12/28/wlroots-whitepaper-available.html</link>
      <pubDate>Thu, 28 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/12/28/wlroots-whitepaper-available.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://sr.ht/jAFC.pdf&#34;&gt;View PDF&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firefox is on a slippery slope</title>
      <link>https://drewdevault.com/2017/12/16/Firefox-is-on-a-slippery-slope.html</link>
      <pubDate>Sat, 16 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/12/16/Firefox-is-on-a-slippery-slope.html</guid>
      <description>&lt;p&gt;For a long time, it was just setting the default search provider to Google in&#xA;exchange for a beefy stipend. Later, paid links in your new tab page were added.&#xA;Then, a proprietary service, Pocket, was bundled into the browser - not as an&#xA;addon, but a hardcoded feature. In the past few days, we&amp;rsquo;ve discovered an&#xA;advertisement in the form of browser extension was sideloaded into user&#xA;browsers. Whoever is leading these decisions at Mozilla needs to be stopped.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A history of emergent intelligence</title>
      <link>https://drewdevault.com/2017/12/02/History-of-intelligent-observation.html</link>
      <pubDate>Sat, 02 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/12/02/History-of-intelligent-observation.html</guid>
      <description>&lt;p&gt;As you all know, the simulation of universe 2813/9301 is now coming to a close.&#xA;This simulation is notable for being the first simulated universe suitable for&#xA;hosting intelligent life, but yesterday the simulation reached a state where we&#xA;believe no additional intelligences will emerge. It seems the final state of&#xA;this set of physical laws is a dark and empty universe of slowly evaporating&#xA;black holes. Though, given the historical significance of this simulation, it&amp;rsquo;s&#xA;unlikely we we&amp;rsquo;ll be turning it off any time soon!&lt;/p&gt;</description>
    </item>
    <item>
      <title>On taking good care of your phone</title>
      <link>https://drewdevault.com/2017/11/24/Phone-maintenance.html</link>
      <pubDate>Fri, 24 Nov 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/11/24/Phone-maintenance.html</guid>
      <description>&lt;p&gt;I just finished &lt;a href=&#34;https://www.ifixit.com/Guide/s5/27077&#34;&gt;replacing the micro-USB&#xA;daughterboard&lt;/a&gt; on my Samsung Galaxy S5,&#xA;which involved taking the phone most of the way apart, doing the replacement,&#xA;and putting it back together. This inspired me to write about my approach to&#xA;maintaining my cell phone. I&amp;rsquo;ve had this phone for a while and I have no plans&#xA;to upgrade - I backed the upcoming Purism phone, but I expect to spend&#xA;months/years on the software before I&amp;rsquo;ll be using that as my daily driver.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Portability matters</title>
      <link>https://drewdevault.com/2017/11/13/Portability-matters.html</link>
      <pubDate>Mon, 13 Nov 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/11/13/Portability-matters.html</guid>
      <description>&lt;p&gt;There are many kinds of &amp;ldquo;portability&amp;rdquo; in software. Portability refers to the&#xA;relative ease of &amp;ldquo;porting&amp;rdquo; a piece of software to another system. That&#xA;platform might be another operating system, another CPU architecture, another&#xA;web browser, another filesystem&amp;hellip; and so on. More portable software uses the&#xA;limited subset of interfaces that are common between systems, and less portable&#xA;software leverages interfaces specific to a particular system.&lt;/p&gt;&#xA;&lt;p&gt;Some people think that portability isn&amp;rsquo;t very important, or don&amp;rsquo;t understand the&#xA;degree to which it&amp;rsquo;s important. Some people might call their software portable&#xA;if it works on Windows and macOS - they&amp;rsquo;re wrong. They might call their software&#xA;portable if it works on Windows, macOS, and Linux - but they&amp;rsquo;re wrong, too.&#xA;Supporting multiple systems does not necessarily make your software portable.&#xA;What makes your software portable is &lt;em&gt;standards&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nvidia sucks and I&#39;m sick of it</title>
      <link>https://drewdevault.com/2017/10/26/Fuck-you-nvidia.html</link>
      <pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/10/26/Fuck-you-nvidia.html</guid>
      <description>&lt;p&gt;There&amp;rsquo;s something I need to make clear about Nvidia. Sway 1.0, which is the&#xA;release after next, is &lt;em&gt;not&lt;/em&gt; going to support the Nvidia proprietary driver,&#xA;EGLStreams, or any other proprietary graphics APIs. The only supported driver&#xA;for Nvidia cards will be the open source nouveau driver. I will explain why.&lt;/p&gt;&#xA;&lt;p&gt;Today, Sway is able to run on the Nvidia proprietary driver. This is not and has&#xA;never been an officially supported feature - we&amp;rsquo;ve added a few things to try and&#xA;make it easier but my stance has &lt;em&gt;always&lt;/em&gt; been that Nvidia users are on their&#xA;own for support. In fact, Nvidia support was added to Sway without my approval.&#xA;It comes from a library we depend on called wlc - had I&amp;rsquo;d made the decision on&#xA;whether or not to support EGLStreams in wlc, I would have said no.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The future of Wayland, and sway&#39;s role in it</title>
      <link>https://drewdevault.com/2017/10/09/Future-of-sway.html</link>
      <pubDate>Mon, 09 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/10/09/Future-of-sway.html</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;ve released sway&#xA;&lt;a href=&#34;https://github.com/swaywm/sway/releases/tag/0.15-rc1&#34;&gt;0.15-rc1&lt;/a&gt;, the first&#xA;release candidate for the final 0.x release of sway. That&amp;rsquo;s right - after sway&#xA;0.15 will be sway 1.0. After today, no new features are being added to sway&#xA;until we complete the migration to our new plumbing library,&#xA;&lt;a href=&#34;https://github.com/swaywm/wlroots&#34;&gt;wlroots&lt;/a&gt;. This has been a long time&#xA;coming, and I would love to introduce you to wlroots and tell you what to expect&#xA;from sway 1.0.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Analyzing HN moderation &amp; censorship</title>
      <link>https://drewdevault.com/2017/09/13/Analyzing-HN.html</link>
      <pubDate>Wed, 13 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/09/13/Analyzing-HN.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://news.ycombinator.com&#34;&gt;Hacker News&lt;/a&gt; is a popular&#xA;&amp;ldquo;&lt;a href=&#34;http://www.catb.org/jargon/html/H/hacker.html&#34;&gt;hacker&lt;/a&gt;&amp;rdquo; news board. One thing&#xA;I love about HN is that the moderation generally does an excellent job. The site&#xA;is free of spam and the conversations are usually respectful and meaningful (if&#xA;pessimistic at times). However, there is always room for improvement, and&#xA;moderation on Hacker News is no exception.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt;: on 2017-10-19 this article was updated to incorporate feedback the&#xA;Hacker News moderators sent to me to clarify some of the points herein. You may&#xA;view a diff of these changes&#xA;&lt;a href=&#34;https://github.com/SirCmpwn/sircmpwn.github.io/commit/553d051c84a4631c3bd3264a437dfbc6c9807d13&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Killing ants with nuclear weapons</title>
      <link>https://drewdevault.com/2017/09/08/Complicated.html</link>
      <pubDate>Fri, 08 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/09/08/Complicated.html</guid>
      <description>&lt;p&gt;Complexity is quickly becoming an epidemic. In this developer&amp;rsquo;s opinion,&#xA;complexity is the ultimate enemy - the final boss - of good software design.&#xA;Complicated software generally has complicated bugs. Simple software generally&#xA;has simple bugs. It&amp;rsquo;s as easy as that.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s for this reason that I strongly dislike many of the tools and architectures&#xA;that have been proliferating over the past few years, particularly in web&#xA;development. When I look at a tool like Gulp, I wonder if its success is largely&#xA;attributable to people not bothering to learn how Makefiles work. Tools like&#xA;Docker make me wonder if they&amp;rsquo;re an excuse to avoid learning how to do ops or&#xA;how to use your distribution&amp;rsquo;s package manager. Chef makes me wonder if its&#xA;users forgot that shell scripts can use SSH, too.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When not to use a regex</title>
      <link>https://drewdevault.com/2017/08/13/When-not-to-use-a-regex.html</link>
      <pubDate>Sun, 13 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/08/13/When-not-to-use-a-regex.html</guid>
      <description>&lt;p&gt;The other day, I saw &lt;a href=&#34;https://github.com/zeeshanu/learn-regex&#34;&gt;Learn regex the easy&#xA;way&lt;/a&gt;. This is a great resource, but I&#xA;felt the need to pen a post explaining that regexes are usually not the right&#xA;approach.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s do a little exercise. I googled &amp;ldquo;URL regex&amp;rdquo; and here&amp;rsquo;s the first Stack&#xA;Overflow result:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&amp;amp;//=]*)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p style=&#34;text-align: right&#34;&gt;&#xA;&lt;small&gt;&lt;a href=&#34;https://stackoverflow.com/a/3809435/1191610&#34;&gt;source&lt;/a&gt;&lt;/small&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;This is a bad regex. Here are some valid URLs that this regex fails to match:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://x.org&#34;&gt;http://x.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://nic.science&#34;&gt;http://nic.science&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;http://名がドメイン.com (warning: this is a parked domain)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://example.org/url,with,commas&#34;&gt;http://example.org/url,with,commas&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Harry_Potter_(film_series)&#34;&gt;https://en.wikipedia.org/wiki/Harry_Potter_(film_series)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;http://127.0.0.1&lt;/li&gt;&#xA;&lt;li&gt;http://[::1] (ipv6 loopback)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here are some invalid URLs the regex is fine with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Sway August 2017</title>
      <link>https://drewdevault.com/2017/08/09/State-of-Sway-August-2017.html</link>
      <pubDate>Wed, 09 Aug 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/08/09/State-of-Sway-August-2017.html</guid>
      <description>&lt;p&gt;Is it already time to write another one of these? Phew, time flies. Sway marches&#xA;ever forward. Sway 0.14.0 was recently released, adding much asked-after support&#xA;for tray icons and fixing some long-standing bugs. As usual, we already have&#xA;some exciting features slated for 0.15.0 as well, notably some cool improvements&#xA;to clipboard support. Look forward to it!&lt;/p&gt;&#xA;&lt;p&gt;Today Sway has 24,123 lines of C (and 4,489 lines of header files) written by 94&#xA;authors across 2,345 commits. These were written through 689 pull requests and&#xA;624 issues. Sway packages are available today in the repos of almost every Linux&#xA;distribution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Archive it or you will miss it</title>
      <link>https://drewdevault.com/2017/06/19/Archive-it-or-miss-it.html</link>
      <pubDate>Mon, 19 Jun 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/06/19/Archive-it-or-miss-it.html</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s open with some quotes from the &lt;a href=&#34;https://en.wikipedia.org/wiki/Link_rot&#34;&gt;Wikipedia article on link&#xA;rot&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In 2014, bookmarking site Pinboard&amp;rsquo;s owner Maciej Cegłowski reported a “pretty&#xA;steady rate” of 5% link rot per year&amp;hellip; approximately 50% of the URLs in&#xA;U.S. Supreme Court opinions no longer link to the original information&amp;hellip;&#xA;(analysis of) more than 180,000 links from references in&amp;hellip; three major open&#xA;access publishers&amp;hellip; found that overall 24.5% of links cited were no longer&#xA;available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An introduction to Wayland</title>
      <link>https://drewdevault.com/2017/06/10/Introduction-to-Wayland.html</link>
      <pubDate>Sat, 10 Jun 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/06/10/Introduction-to-Wayland.html</guid>
      <description>&lt;p&gt;Wayland is the new hotness on the Linux graphics stack. There are plenty of&#xA;introductions to Wayland that give you the high level details on how the stack&#xA;is laid out how applications talk directly to the kernel with EGL and so on, but&#xA;that doesn&amp;rsquo;t give you much practical knowledge. I&amp;rsquo;d like to instead share with&#xA;you details about how the protocol actually works and how you can use it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Limited &#34;generics&#34; in C without macros or UB</title>
      <link>https://drewdevault.com/2017/06/05/Limited-generics-in-C.html</link>
      <pubDate>Mon, 05 Jun 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/06/05/Limited-generics-in-C.html</guid>
      <description>&lt;p&gt;I should start this post off by clarifying that what I have to show you today is&#xA;not, in fact, generics. However, it&amp;rsquo;s useful in some situations to solve the&#xA;same problems that generics might. This is a pattern I&amp;rsquo;ve started using to&#xA;reduce the number of &lt;code&gt;void*&lt;/code&gt; pointers floating around in my code: multiple&#xA;definitions of a struct.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Errata&lt;/strong&gt;: we rolled this approach back in wlroots because it causes problems&#xA;with LTO. I no longer recommend it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rotating passwords in bulk in the wake of security events</title>
      <link>https://drewdevault.com/2017/05/11/Rotating-passwords.html</link>
      <pubDate>Thu, 11 May 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/05/11/Rotating-passwords.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been putting this post off for a while. Do you remember the &lt;a href=&#34;https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-cloudflare-parser-bug/&#34;&gt;CloudFlare&#xA;security&#xA;problem&lt;/a&gt;&#xA;that happened a few months ago? This is the one that disclosed huge amounts of&#xA;sensitive information for huge numbers websites. When this happened, your&#xA;accounts on &lt;a href=&#34;https://github.com/pirate/sites-using-cloudflare&#34;&gt;thousands of&#xA;websites&lt;/a&gt; were potentially&#xA;compromised.&lt;/p&gt;&#xA;&lt;p&gt;Updating passwords for all of these services at once was a major source of&#xA;frustration for users. Updating a single password can take 5 minutes, and&#xA;changing dozens of them might take hours. I decided that I wanted to make this&#xA;process easier.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building a &#34;real&#34; Linux distro</title>
      <link>https://drewdevault.com/2017/05/05/Building-a-real-Linux-distro.html</link>
      <pubDate>Fri, 05 May 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/05/05/Building-a-real-Linux-distro.html</guid>
      <description>&lt;p&gt;I recently saw a post on Hacker News: &amp;ldquo;&lt;a href=&#34;https://github.com/MichielDerhaeg/build-linux&#34;&gt;Build yourself a&#xA;Linux&lt;/a&gt;&amp;rdquo;, a cool project&#xA;that guides you through building a simple Linux system. It&amp;rsquo;s similar to Linux&#xA;from Scratch in that it helps you build a simple Linux system for personal use.&#xA;I&amp;rsquo;d like to supplement this with some insight into my experience with a more&#xA;difficult task: building a full blown Linux distribution. The result is&#xA;&lt;a href=&#34;http://agunix.org&#34;&gt;agunix&lt;/a&gt;, the &amp;ldquo;silver unix&amp;rdquo; system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Sway April 2017</title>
      <link>https://drewdevault.com/2017/04/29/State-of-sway-April-2017.html</link>
      <pubDate>Sat, 29 Apr 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/04/29/State-of-sway-April-2017.html</guid>
      <description>&lt;p&gt;Development on Sway continues. I thought we would have slowed down a lot more by&#xA;now, but every release still comes with new features - Sway 0.12 added&#xA;redshift support and binary space partitioning layouts. Sway 0.13.0 is&#xA;coming soon and includes, among other things, nvidia proprietary driver support.&#xA;We already have some interesting features slated for Sway 0.14.0, too!&lt;/p&gt;&#xA;&lt;p&gt;Today Sway has 21,446 lines of C (and 4,261 lines of header files) written by 81&#xA;authors across 2,263 commits. These were written through 653 pull requests and&#xA;529 issues. Sway packages are available today in the official repos of pretty&#xA;much every distribution except for Debian derivatives, and a PPA is available&#xA;for those guys.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MSG_PEEK is pretty common, CVE-2016-10229 is worse than you think</title>
      <link>https://drewdevault.com/2017/04/13/MSG_PEEK-is-more-common-than-you-think-CVE-2016-10229.html</link>
      <pubDate>Thu, 13 Apr 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/04/13/MSG_PEEK-is-more-common-than-you-think-CVE-2016-10229.html</guid>
      <description>&lt;p&gt;I heard about &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/CVE-2016-10229&#34;&gt;CVE-2016-10229&lt;/a&gt;&#xA;earlier today. In a nutshell, it allows for arbitrary code execution via UDP&#xA;traffic if userspace programs are using &lt;code&gt;MSG_PEEK&lt;/code&gt; in their &lt;code&gt;recv&lt;/code&gt; calls. I&#xA;quickly updated my kernels and rebooted any boxes where necessary, but when I&#xA;read the discussions on this matter I saw people downplaying this issue by&#xA;claiming &lt;code&gt;MSG_PEEK&lt;/code&gt; is an obscure feature.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t want to be a fear monger and I&amp;rsquo;m by no means a security expert but I&#xA;suspect that this is a deeply incorrect conclusion. If I understand this&#xA;vulnerability right you need to drop everything and update any servers running&#xA;a kernel &amp;lt;4.5 &lt;em&gt;immediately&lt;/em&gt;. &lt;code&gt;MSG_PEEK&lt;/code&gt; allows a programmer using UDP to&#xA;read from the kernel&amp;rsquo;s UDP buffer without consuming the data (so subsequent&#xA;reads will continue to read the same data). This immediately sounds to me like&#xA;a pretty useful feature that a lot of software might use, not an obscure one.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Principles for C programming</title>
      <link>https://drewdevault.com/2017/03/15/How-I-learned-to-stop-worrying-and-love-C.html</link>
      <pubDate>Wed, 15 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/03/15/How-I-learned-to-stop-worrying-and-love-C.html</guid>
      <description>&lt;p&gt;In the words of Doug Gwyn, &amp;ldquo;Unix was not designed to stop you from doing stupid&#xA;things, because that would also stop you from doing clever things&amp;rdquo;. C is a very&#xA;powerful tool, but it is to be used with care and discipline. Learning this&#xA;discipline is well worth the effort, because C is one of the best programming&#xA;languages ever made. A disciplined C programmer will&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Prefer maintainability&lt;/strong&gt;. Do not be clever where cleverness is not required.&#xA;Instead, seek out the simplest and most understandable solution that meets the&#xA;requirements. Most concerns, including performance, are secondary to&#xA;maintainability. You should have a performance budget for your code, and you&#xA;should be comfortable spending it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Compiler devnotes: Machine specs</title>
      <link>https://drewdevault.com/2017/02/22/cozy-devnotes-machine-specs.html</link>
      <pubDate>Wed, 22 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/02/22/cozy-devnotes-machine-specs.html</guid>
      <description>&lt;p&gt;I have a number of long-term projects that I plan for on long timelines, on the&#xA;order of decades or more. One of these projects is cozy, a C toolchain. I&#xA;haven&amp;rsquo;t talked about this project in public before, so I&amp;rsquo;ll start by introducing&#xA;you to the project. The main C toolchains in the &amp;ldquo;actually usable&amp;rdquo; category are&#xA;GNU and LLVM, but I&amp;rsquo;m satisfied with neither and I want to build my own&#xA;toolchain. I see no reason why compilers should be deep magic. Here are my goals&#xA;for cozy:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lessons to learn from C</title>
      <link>https://drewdevault.com/2017/01/30/Lessons-to-learn-from-C.html</link>
      <pubDate>Mon, 30 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/01/30/Lessons-to-learn-from-C.html</guid>
      <description>&lt;p&gt;C is my favorite language, though I acknowledge that it has its warts. I&amp;rsquo;ve&#xA;tried looking at languages people hope will replace C (Rust, Go, etc), and&#xA;though they&amp;rsquo;ve improved on some things they won&amp;rsquo;t be supplanting C in my life&#xA;any time soon. I&amp;rsquo;ll share with you what makes C a great language to me. Take&#xA;some of these things as inspiration for the next C replacement you write.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The only problem with Python 3&#39;s str is that you don&#39;t grok it</title>
      <link>https://drewdevault.com/2017/01/13/The-problem-with-Python-3.html</link>
      <pubDate>Fri, 13 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/01/13/The-problem-with-Python-3.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve found myself explaining Python 3&amp;rsquo;s str to people online more and more often&#xA;lately. There&amp;rsquo;s this ridiculous claim about that Python 3&amp;rsquo;s string handling is&#xA;broken or somehow worse than Python 2, and today I intend to put that myth to&#xA;rest.  Python 2 strings are broken, and Python 3 strings are sane. The only&#xA;problem is that you don&amp;rsquo;t grok strings.&lt;/p&gt;&#xA;&lt;p&gt;The basic problem many people seem to have with Python 3&amp;rsquo;s strings arises when&#xA;they write code that treats bytes like a string, because that&amp;rsquo;s how it was in&#xA;Python 2. Let me make this as clear as possible:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Actually, you CAN do it</title>
      <link>https://drewdevault.com/2017/01/06/Actually-you-CAN-do-it.html</link>
      <pubDate>Fri, 06 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2017/01/06/Actually-you-CAN-do-it.html</guid>
      <description>&lt;p&gt;I maintain a &lt;em&gt;lot&lt;/em&gt; of open source projects. In order to do so, I have to&#xA;effectively manage my time. Most of my projects follow this philosophy: if you&#xA;want something changed, send a patch. If you are running into an annoying bug,&#xA;fix it and send a patch. If you want a new feature, implement it and send a&#xA;patch. It&amp;rsquo;s definitely a good idea to talk about it beforehand on the issue&#xA;tracker or IRC, but don&amp;rsquo;t make the mistake of thinking this processes ends with&#xA;someone else doing it for you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Sway December 2016 - secure your Wayland desktop, get paid to work on Sway</title>
      <link>https://drewdevault.com/2016/12/27/State-of-sway.html</link>
      <pubDate>Tue, 27 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/12/27/State-of-sway.html</guid>
      <description>&lt;p&gt;Earlier today I released &lt;a href=&#34;https://github.com/SirCmpwn/sway/releases/tag/0.11&#34;&gt;sway&#xA;0.11&lt;/a&gt;, which (along with&#xA;lots of the usual new features and bug fixes) introduces support for security&#xA;policies that can help realize the promise of a secure Wayland desktop. We also&#xA;just started a bounty program that lets you sponsor the things you want done and&#xA;rewards contributors for working on them.&lt;/p&gt;&#xA;&lt;p&gt;Today sway has 19,371 lines of C (and 3,761 lines of header files) written by 70&#xA;authors across 2,067 commits. These were written through 589 pull requests and&#xA;425 issues. Sway packages are available today in the official repos of Arch,&#xA;Gentoo, Fedora, NixOS, openSUSE, Void Linux, and more. Sway looks like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>A broad intro to networking</title>
      <link>https://drewdevault.com/2016/12/06/A-broad-intro-to-networking.html</link>
      <pubDate>Tue, 06 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/12/06/A-broad-intro-to-networking.html</guid>
      <description>&lt;p&gt;Disclaimer: I am not a network engineer. That&amp;rsquo;s the point of this blog post,&#xA;though - I want to share with non-networking people enough information about&#xA;networking to get by. Hopefully by the end of this post you&amp;rsquo;ll know enough about&#xA;networking to keep up with a conversation on networking, or know what to search&#xA;for when something breaks, or know what tech to research more in-depth when you&#xA;are putting together something new.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Electron considered harmful</title>
      <link>https://drewdevault.com/2016/11/24/Electron-considered-harmful.html</link>
      <pubDate>Thu, 24 Nov 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/11/24/Electron-considered-harmful.html</guid>
      <description>&lt;p&gt;Yeah, I know that &amp;ldquo;considered harmful&amp;rdquo; essays are allegedly &lt;a href=&#34;http://meyerweb.com/eric/comment/chech.html&#34;&gt;considered&#xA;harmful&lt;/a&gt;. If it surprises you that&#xA;I&amp;rsquo;m writing one, though, you must be a new reader. Welcome! Let&amp;rsquo;s get started.&#xA;If you&amp;rsquo;re unfamiliar with Electron, it&amp;rsquo;s some hot new tech that lets you make&#xA;desktop applications with HTML+CSS+JavaScript. It&amp;rsquo;s basically a chromeless web&#xA;browser with a Node.js backend and a Chromium-based frontend. What follows is&#xA;the rant of a pissed off Unix hacker, you&amp;rsquo;ve been warned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting on without Google</title>
      <link>https://drewdevault.com/2016/11/16/Getting-on-without-Google.html</link>
      <pubDate>Wed, 16 Nov 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/11/16/Getting-on-without-Google.html</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://drewdevault.com/l.sr.ht/d718.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I used Google for a long time, but have waned myself off of it over the past&#xA;few years, and I finally deleted my account a little over a month ago. I feel so&#xA;much better about my privacy now that I&amp;rsquo;ve removed Google from the equation, and&#xA;self hosting my things affords me a lot of flexibility and useful customizations.&lt;/p&gt;&#xA;&lt;h2 id=&#34;mailcmpwncom&#34;&gt;mail.cmpwn.com&lt;/h2&gt;&#xA;&lt;p&gt;This one was the most difficult and time consuming to set up, but it was &lt;em&gt;very&lt;/em&gt;&#xA;worth it. I&amp;rsquo;ve intended for a while to make a new mail server software suite&#xA;that&amp;rsquo;s less terrible to set up, so hopefully that situation will improve in the&#xA;future. I want to flesh out &lt;a href=&#34;https://github.com/SirCmpwn/aerc&#34;&gt;aerc&lt;/a&gt; some more&#xA;first. A personal mail server was one of the earliest things I set up in my&#xA;post-Google life - I&amp;rsquo;ve operated it for about two years now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m losing faith in America</title>
      <link>https://drewdevault.com/2016/11/05/Losing-faith-in-America.html</link>
      <pubDate>Sat, 05 Nov 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/11/05/Losing-faith-in-America.html</guid>
      <description>&lt;p&gt;I recently quit my job at Linode and started looking for something else to do.&#xA;For the first time in my career, I&amp;rsquo;m seriously considering opportunities abroad.&#xA;Sorry for the politically charged post - I promise to get back to tech stuff&#xA;right away.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/canada.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;On November 8th, I&amp;rsquo;m going to step into the voting booth and will be presented&#xA;with the following options:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A criminal who cheated her way into a spot on the ballot&lt;/li&gt;&#xA;&lt;li&gt;An egotistical racist maniac&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The next president of the United States will probably be Hillary Clinton. I&amp;rsquo;m&#xA;sure I don&amp;rsquo;t have to tell you how ridiculous this is. This is a person who has&#xA;pulled all of the stops to get her name on the ballot, including &lt;em&gt;voter fraud&lt;/em&gt;&#xA;and disturbing amounts of corruption within the Democratic party.  Not to&#xA;mention that she&amp;rsquo;s probably going to start a war with Syria, mess with the&#xA;already fragile geopolitical relationship we have with Russia, and likely&#xA;deserves to be incarcerated for mishandling classified information. Say what you&#xA;will about the Republican party - at least Trump won his nomination fair and&#xA;square. Bonus: not voting for Hillary is sexist.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using the right tool for the job</title>
      <link>https://drewdevault.com/2016/09/17/Use-the-right-tool.html</link>
      <pubDate>Sat, 17 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/09/17/Use-the-right-tool.html</guid>
      <description>&lt;p&gt;One of the most important choices you&amp;rsquo;ll make for the software you write is what&#xA;you write it in, what frameworks you use, the design methodologies to subscribe&#xA;to, and so on. This choice doesn&amp;rsquo;t seem to get the respect it&amp;rsquo;s due. These are&#xA;some of the only choices you&amp;rsquo;ll make that &lt;em&gt;you cannot change&lt;/em&gt;. Or, at least,&#xA;these choices are among the most difficult ones to change.&lt;/p&gt;&#xA;&lt;p&gt;People often question why TrueCraft is written in C# next to projects like Sway&#xA;in C, alongside KnightOS in Assembly or sr.ht in Python. It would certainly be&#xA;easier from the outset if I made every project in a language I&amp;rsquo;m comfortable&#xA;with, using tools and libraries I&amp;rsquo;m comfortable with, and there&amp;rsquo;s certainly&#xA;something to be had for that. That&amp;rsquo;s far from being the only concern, though.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What motivates the authors of the software you use?</title>
      <link>https://drewdevault.com/2016/09/09/What-motivates-the-authors-of-the-software-you-use.html</link>
      <pubDate>Fri, 09 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/09/09/What-motivates-the-authors-of-the-software-you-use.html</guid>
      <description>&lt;p&gt;We face an important choice in our lives as technophiles, hackers, geeks: the&#xA;choice between proprietary software and free/open source software. What&#xA;platforms we choose to use are important. We have a choice between Windows, OS&#xA;X, and Linux (not to mention the several less popular choices). We choose&#xA;between Android or iOS. We choose hardware that requires nonfree drivers or ones&#xA;that don&amp;rsquo;t. We choose to store our data in someone else&amp;rsquo;s cloud or in our own.&#xA;How do we make the right choice?&lt;/p&gt;</description>
    </item>
    <item>
      <title>[VIDEO] Arch Linux with full disk encryption in (about) 15 minutes</title>
      <link>https://drewdevault.com/2016/08/18/Arch-Linux-with-full-disk-encryption-in-15-minutes.html</link>
      <pubDate>Thu, 18 Aug 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/08/18/Arch-Linux-with-full-disk-encryption-in-15-minutes.html</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://drewdevault.com/css/video-js.css&#34;&gt;&#xA;&lt;script&gt;&#xA;window.HELP_IMPROVE_VIDEOJS = false;&#xA;&lt;/script&gt;&#xA;&lt;script src=&#34;https://drewdevault.com/js/video.js&#34;&gt;&lt;/script&gt;&#xA;&lt;p&gt;After my &lt;a href=&#34;https://drewdevault.com/2016/06/29/Privacy-as-a-hobby.html&#34;&gt;blog post&lt;/a&gt; emphasizing the&#xA;importance of taking control of your privacy, I&amp;rsquo;ve decided to make a few more&#xA;posts going over detailed instructions on how to actually do so. Today we have a&#xA;video that goes over the process of installing Arch Linux with full disk&#xA;encryption.&lt;/p&gt;&#xA;&lt;p&gt;This is my first go at publishing videos on my blog, so please provide some&#xA;feedback in the comments of this article. I&amp;rsquo;d prefer to use my blog instead of&#xA;YouTube for publishing technical videos, since it&amp;rsquo;s all open source, ad-free,&#xA;and DRM-free. Let me know if you&amp;rsquo;d like to see more content like this on my&#xA;blog and which topics you&amp;rsquo;d like covered - I intend to at least release another&#xA;video going over this process for Ubuntu as well.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sway 0.9 &amp; One year of Sway</title>
      <link>https://drewdevault.com/2016/08/02/Sway-0.9-in-retro.html</link>
      <pubDate>Tue, 02 Aug 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/08/02/Sway-0.9-in-retro.html</guid>
      <description>&lt;p&gt;Today marks one year since the &lt;a href=&#34;https://github.com/SirCmpwn/sway/commit/6a33e1e3cddac31b762e4376e29c03ccf8f92107&#34;&gt;initial&#xA;commit&lt;/a&gt;&#xA;of Sway. Over the year since, we&amp;rsquo;ve written 1,823 commits by 54 authors,&#xA;totalling 16,601 lines of C (and 1,866 lines of header files). This was written&#xA;over the course of 515 pull requests and 300 issues. Today, most i3 features are&#xA;supported. In fact, as of last week, all of the features from the i3&#xA;configuration I used before I started working on Sway are now supported by Sway.&#xA;Today, Sway looks like this (click to expand):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using -Wl,--wrap for mocking in C</title>
      <link>https://drewdevault.com/2016/07/19/Using-Wl-wrap-for-mocking-in-C.html</link>
      <pubDate>Tue, 19 Jul 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/07/19/Using-Wl-wrap-for-mocking-in-C.html</guid>
      <description>&lt;p&gt;One of the comforts I&amp;rsquo;ve grown used to in higher level languages when testing&#xA;my code is mocking. The idea is that in order to test some code in isolation,&#xA;you should &amp;ldquo;mock&amp;rdquo; the behavior of things it depends on. Let&amp;rsquo;s see a (contrived)&#xA;example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_to_end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FILE&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;feof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fread&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;buf&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we want to test this function without mocking, we would need to actually open&#xA;a specially crafted file and provide a &lt;code&gt;FILE*&lt;/code&gt; to the function. However, with&#xA;the linker &lt;code&gt;--wrap&lt;/code&gt; flag, we can define a wrapper function. Using &lt;code&gt;-Wl,[flag]&lt;/code&gt;&#xA;in your C compiler command line will pass &lt;code&gt;[flag]&lt;/code&gt; to the linker. Gold (GNU) and&#xA;lld (LLVM) both support the wrap flag, which specifies a function to be&#xA;&amp;ldquo;wrapped&amp;rdquo;. If I use &lt;code&gt;-Wl,--wrap=fread&lt;/code&gt;, then the code above will be compiled&#xA;like so:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Life, liberty, and the pursuit of privacy</title>
      <link>https://drewdevault.com/2016/06/29/Privacy-as-a-hobby.html</link>
      <pubDate>Wed, 29 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/06/29/Privacy-as-a-hobby.html</guid>
      <description>&lt;p&gt;Privacy is my hobby, and should be a hobby of every technically competent&#xA;American. Within the eyes of the law I have a right to secure the privacy of my&#xA;information. At least that&amp;rsquo;s the current law - many officials are &lt;a href=&#34;http://www.apple.com/customer-letter/&#34;&gt;trying to&#xA;subvert that right&lt;/a&gt;. I figure that we&amp;rsquo;d&#xA;better exercise that right while we have it, so that we know how to keep&#xA;exercising it once it&amp;rsquo;s illegal and all the information about it dries up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Understanding pointers</title>
      <link>https://drewdevault.com/2016/05/28/Understanding-pointers.html</link>
      <pubDate>Sat, 28 May 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/05/28/Understanding-pointers.html</guid>
      <description>&lt;style&gt;&#xA;table {&#xA;  border-spacing: 0;&#xA;  width: 100%;&#xA;}&#xA;&#xA;th, td {&#xA;  border-bottom: 1px solid black;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;p&gt;I was recently chatting with a new contributor to Sway who is using the project&#xA;as a means of learning C, and he had some questions about what &lt;code&gt;void**&lt;/code&gt; meant&#xA;when he found some in the code. It became apparent that this guy only has a&#xA;basic grasp on pointers at this point in his learning curve, and I figured it&#xA;was time for another blog post - so today, I&amp;rsquo;ll explain pointers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In Memoriam - Mozilla</title>
      <link>https://drewdevault.com/2016/05/11/In-Memoriam-Mozilla.html</link>
      <pubDate>Wed, 11 May 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/05/11/In-Memoriam-Mozilla.html</guid>
      <description>&lt;p&gt;Today we look back to the life of Mozilla, a company that was best known for&#xA;creating the Firefox web browser. I remember a company that made the web better&#xA;and more open by providing a browser that was faster and more customizable than&#xA;anyone had ever seen, and by making that browser free and open source.&lt;/p&gt;&#xA;&lt;p&gt;I expect many of my readers will be older than I am, but my first memories of&#xA;Firefox are back in high school with Firefox 3. I fondly remember my discovery&#xA;of it. Mozilla gave us a faster and more powerful web browser to use on school&#xA;computers. The other choice was Internet Explorer 6 - but with a flash drive we&#xA;could run a &amp;ldquo;portable&amp;rdquo; version of Firefox instead. Using tabbed web browsing was&#xA;a clear improvement for usability and I loved installing all sorts of cool&#xA;add-ons and I&amp;rsquo;m sure I&amp;rsquo;ve spent at least a few hours of my life browsing persona&#xA;themes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Sway - April 2016</title>
      <link>https://drewdevault.com/2016/04/20/State-of-sway-April-2016.html</link>
      <pubDate>Wed, 20 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/04/20/State-of-sway-April-2016.html</guid>
      <description>&lt;p&gt;Since the previous &lt;a href=&#34;https://drewdevault.com/2015/12/20/State-of-sway.html&#34;&gt;State of Sway&lt;/a&gt;, we have&#xA;accomplished quite a bit. We are now shipping versioned releases of sway, which&#xA;include support for window borders, input device configuration, more new&#xA;features, and many bug fixes and stability improvements. I&amp;rsquo;m also happy to say&#xA;that Sway 0.5 has landed in the Arch Linux community repository and I&amp;rsquo;m starting&#xA;to hear rumors of it landing in other Linux distros as well. Here&amp;rsquo;s a quick&#xA;rundown of what&amp;rsquo;s happened in the past four months:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to write a better bloom filter in C</title>
      <link>https://drewdevault.com/2016/04/12/How-to-write-a-better-bloom-filter-in-C.html</link>
      <pubDate>Tue, 12 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/04/12/How-to-write-a-better-bloom-filter-in-C.html</guid>
      <description>&lt;p&gt;This is in response to&#xA;&lt;a href=&#34;http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/&#34;&gt;How to write a bloom filter in C++&lt;/a&gt;,&#xA;which has good intentions, but is ultimately a less than ideal bloom filter&#xA;implementation. I put together a better one in C in a few minutes, and I&amp;rsquo;ll&#xA;explain the advantages of it.&lt;/p&gt;&#xA;&lt;p&gt;The important differences are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You bring your own hashing functions&lt;/li&gt;&#xA;&lt;li&gt;You can add arbitrary data types, not just bytes&lt;/li&gt;&#xA;&lt;li&gt;It uses bits directly instead of relying on the &lt;code&gt;std::vector&amp;lt;bool&amp;gt;&lt;/code&gt;&#xA;being space effecient&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I chose C because (1) I prefer it over C++ and (2) I just think it&amp;rsquo;s a better&#xA;choice for implementing low level data types, and C++ is better used in high&#xA;level code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please use text/plain for email</title>
      <link>https://drewdevault.com/2016/04/11/Please-use-text-plain-for-emails.html</link>
      <pubDate>Mon, 11 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/04/11/Please-use-text-plain-for-emails.html</guid>
      <description>&lt;p&gt;A lot of people have come to hate email, and not without good reason. I don&amp;rsquo;t&#xA;hate using email, and I attribute this to better email habits. Unfortunately,&#xA;most email clients these days lead users into bad habits that probably&#xA;contribute to the sad state of email in 2016. The biggest problem with email is&#xA;the widespread use of HTML email.&lt;/p&gt;&#xA;&lt;p&gt;Compare email to snail mail. You probably throw out most of the mail you get -&#xA;it&amp;rsquo;s all junk, ads. Think about the difference between snail mail you read and&#xA;snail mail you throw out. Chances are, the mail you throw out is flashy flyers&#xA;and spam that&amp;rsquo;s carefully laid out by a designer and full of eye candy (kind of&#xA;like many HTML emails). However, if you receive a letter from a friend it&amp;rsquo;s&#xA;probably going to be a lot less flashy - just text on a page. Reading letters&#xA;like this is pleasant and welcome. Emails should be more like this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating a VT220 into my life</title>
      <link>https://drewdevault.com/2016/03/22/Integrating-a-VT220-into-my-life.html</link>
      <pubDate>Tue, 22 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2016/03/22/Integrating-a-VT220-into-my-life.html</guid>
      <description>&lt;p&gt;I bought a DEC VT220 terminal a while ago, and put it next to my desk at work. I&#xA;use it to read emails on mutt now, and it&amp;rsquo;s actually quite pleasant. There was&#xA;some setup involved in making it as comfortable as possible, though.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/vt220-long-shot.jpg&#34;&gt;&lt;img src=&#34;https://drewdevault.com/vt220-long-shot.jpg&#34; alt=&#34;My desk at work&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the terminal up close:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://drewdevault.com/vt220-closeup.jpg&#34;&gt;&lt;img src=&#34;https://drewdevault.com/vt220-closeup.jpg&#34; alt=&#34;The terminal itself&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;hardware&#34;&gt;Hardware&lt;/h2&gt;&#xA;&lt;p&gt;First, I have several pieces of hardware involved in this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;VT220 terminal&lt;/li&gt;&#xA;&lt;li&gt;LK201 keyboard (later made obsolete)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://amzn.com/B00IDSM6BW&#34;&gt;USB to serial adapter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://amzn.com/B00066HL50&#34;&gt;DB9-&amp;gt;DB29 null modem cable&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It took a while to get all of these things, but I was able to get a nice&#xA;refurbished terminal and a couple of crappy LK201 keyboards. Luckily I was able&#xA;to eventually remove the need for the keyboard.&lt;/p&gt;</description>
    </item>
    <item>
      <title>State of Sway - December 2015</title>
      <link>https://drewdevault.com/2015/12/20/State-of-sway-December-2015.html</link>
      <pubDate>Sun, 20 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/12/20/State-of-sway-December-2015.html</guid>
      <description>&lt;p&gt;I wrote sway&amp;rsquo;s &lt;a href=&#34;https://github.com/SirCmpwn/sway/commit/6a33e1e3cddac31b762e4376e29c03ccf8f92107&#34;&gt;initial commit&lt;/a&gt;&#xA;4 months ago, on August 4th. At the time of writing, there are now 1,070 commits&#xA;from 29 different authors, totalling 10,682 lines of C (and 1,176 lines of&#xA;header files). This has been done over the course of 256 pull requests and 118&#xA;issues. Of the 73 &lt;a href=&#34;https://github.com/SirCmpwn/sway/issues/2&#34;&gt;i3 features we&amp;rsquo;re&#xA;tracking&lt;/a&gt;, 51 are now supported, and&#xA;I&amp;rsquo;ve been using sway as my daily driver for a while now. Today, sway looks like&#xA;this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bring more Tor into your life</title>
      <link>https://drewdevault.com/2015/11/11/Bring-more-tor-into-your-life.html</link>
      <pubDate>Wed, 11 Nov 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/11/11/Bring-more-tor-into-your-life.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.torproject.org/&#34;&gt;Tor&lt;/a&gt; is a project that improves your privacy&#xA;online by encrypting and bouncing your connection through several nodes before&#xA;leaving for the outside world. It makes it much more difficult for someone&#xA;spying on you to know who you&amp;rsquo;re talking to online and what you&amp;rsquo;re saying to&#xA;them. Many people use it with the Tor Browser (a fork of Firefox) and only use&#xA;it with HTTP.&lt;/p&gt;&#xA;&lt;p&gt;What some people do not know is that Tor works at the TCP level, and can be used&#xA;for any kind of traffic. There is a glaring issue with using Tor for your daily&#xA;browsing - it&amp;rsquo;s significantly slower. That being said, there are several things&#xA;you run on your computer where speed is not quite as important. I am personally&#xA;using Tor for several things (this list is incomplete):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please don&#39;t use Slack for FOSS projects</title>
      <link>https://drewdevault.com/2015/11/01/Please-stop-using-slack.html</link>
      <pubDate>Sun, 01 Nov 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/11/01/Please-stop-using-slack.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve noticed that more and more projects are using things like Slack as the chat&#xA;medium for their open source projects. In the past couple of days alone, I&amp;rsquo;ve&#xA;been directed to Slack for Babel and Bootstrap. I&amp;rsquo;d like to try and curb this&#xA;phenomenon before it takes off any more.&lt;/p&gt;&#xA;&lt;h2 id=&#34;problems-with-slack&#34;&gt;Problems with Slack&lt;/h2&gt;&#xA;&lt;p&gt;Slack&amp;hellip;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;is closed source&lt;/li&gt;&#xA;&lt;li&gt;has only one client (&lt;em&gt;update: errata at the bottom of this article&lt;/em&gt;)&lt;/li&gt;&#xA;&lt;li&gt;is a walled garden&lt;/li&gt;&#xA;&lt;li&gt;requires users to have a different tab open for each project they want to be&#xA;involved in&lt;/li&gt;&#xA;&lt;li&gt;requires that Heroku hack to get open registration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The last one is a real stinker. Slack is not a tool built for open source&#xA;projects to use for communication with their userbase. It&amp;rsquo;s a tool built for&#xA;teams and it is ill-suited to this use-case. In fact, Slack has gone on record&#xA;as saying that it &lt;em&gt;cannot&lt;/em&gt; support this sort of use-case: &amp;ldquo;it’s great that&#xA;people are putting Slack to good use&amp;rdquo; but unfortunately &amp;ldquo;these communities are&#xA;not something we have the capacity to support given the growth in our existing&#xA;business.&amp;rdquo; &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>A practical understanding of Flux</title>
      <link>https://drewdevault.com/2015/07/20/A-practical-understanding-of-Flux.html</link>
      <pubDate>Mon, 20 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/07/20/A-practical-understanding-of-Flux.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://facebook.github.io/react/&#34;&gt;React.js&lt;/a&gt; and the&#xA;&lt;a href=&#34;https://facebook.github.io/flux/&#34;&gt;Flux&lt;/a&gt; are shaping up to be some of the most&#xA;important tools for web development in the coming years. The MVC model was&#xA;strong on the server when we decided to take the frontend seriously, and it was&#xA;shoehorned into the frontend since we didn&amp;rsquo;t know any better. React and Flux&#xA;challenge that and I like where it&amp;rsquo;s going very much. That being said, it was&#xA;very difficult for me to get into. I put together this blog post to serve as a&#xA;more &lt;em&gt;practical&lt;/em&gt; guide - the upstream documentation tells you a lot of concepts&#xA;and expects you to put them together yourself. Hopefully at the end of this&#xA;blog post you can confidently start writing things with React+Flux instead of&#xA;reading brain-melting docs for a few hours like I did.&lt;/p&gt;</description>
    </item>
    <item>
      <title>osu!web - WebGL &amp; Web Audio</title>
      <link>https://drewdevault.com/2015/06/14/osuweb.html</link>
      <pubDate>Sun, 14 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/06/14/osuweb.html</guid>
      <description>&lt;script src=&#34;https://drewdevault.com/js/underscore-min.js&#34;&gt;&lt;/script&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve taken a liking to a video game called &lt;a href=&#34;https://osu.ppy.sh&#34;&gt;osu!&lt;/a&gt; over the&#xA;past few months. It&amp;rsquo;s a rhythm game where you use move your mouse to circles&#xA;that appear with the beat, and click (or press a key) at the right time. It&#xA;looks something like this:&lt;/p&gt;&#xA;&lt;iframe src=&#34;https://www.youtube.com/embed/qdaZnQQAPqQ&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;The key of this game is that the &amp;ldquo;beatmaps&amp;rdquo; (a song plus notes to hit) are&#xA;user-submitted. There are thousands of them, and the difficulty curve is very&#xA;long - I&amp;rsquo;ve been playing for 10 months and I&amp;rsquo;m only maybe 70% of the way up the&#xA;difficulty curve. It&amp;rsquo;s also a competitive game, which leads to a lot more fun,&#xA;where each user tries to complete maps a little bit better than everyone else&#xA;can. You can see on the left in that video - this is a very good player who&#xA;earned the #1 rank during this play.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hooks - running stuff on Github hooks</title>
      <link>https://drewdevault.com/2015/04/19/Hooks.html</link>
      <pubDate>Sun, 19 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2015/04/19/Hooks.html</guid>
      <description>&lt;p&gt;I found myself in need of a simple tool for deploying a project on every git&#xA;commit, but I didn&amp;rsquo;t have a build server set up. This led to Hooks - a very&#xA;simple tool that allows you to run arbitrary commands when Github&amp;rsquo;s hooks&#xA;execute.&lt;/p&gt;&#xA;&lt;p&gt;The configuration is very simple. In &lt;code&gt;/etc/hooks.conf&lt;/code&gt;, write:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;[truecraft]&#xA;repository=SirCmpwn/TrueCraft&#xA;branch=master&#xA;command=systemctl restart hooks&#xA;valid_ips=204.232.175.64/27,192.30.252.0/22,127.0.0.1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You may include any number of hooks. The &lt;code&gt;valid_ips&lt;/code&gt; entry in that example&#xA;allows you to accept hooks from Github and from localhost. Then you run Hooks&#xA;itself, it will execute your command when you push a commit to your repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Porting an assembler, debugger, and more to WebAssembly</title>
      <link>https://drewdevault.com/2014/11/30/Porting-an-entire-toolchain-to-the-browser-with-emscripten.html</link>
      <pubDate>Sun, 30 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/11/30/Porting-an-entire-toolchain-to-the-browser-with-emscripten.html</guid>
      <description>&lt;p&gt;WebAssembly is pretty cool! It lets you write portable C and cross-compile it to&#xA;JavaScript so it&amp;rsquo;ll run in a web browser. As the maintainer of&#xA;&lt;a href=&#34;http://www.knightos.org&#34;&gt;KnightOS&lt;/a&gt;, I looked to WASM as a potential means&#xA;of reducing the cost of entry for new developers hoping to target the OS.&lt;/p&gt;&#xA;&lt;noscript&gt;&#xA;Note: this article uses JavaScript to run all of this stuff in your web browser.&#xA;I don&#39;t use any third-party scripts, tracking, or anything else icky.&#xA;&lt;/noscript&gt;&#xA;&lt;h2 id=&#34;rationale-for-wasm&#34;&gt;Rationale for WASM&lt;/h2&gt;&#xA;&lt;p&gt;There are several pieces of software in the toolchain that are required to write&#xA;and test software for KnightOS:&lt;/p&gt;</description>
    </item>
    <item>
      <title>On the profitability of image hosting websites</title>
      <link>https://drewdevault.com/2014/10/10/The-profitability-of-online-services.html</link>
      <pubDate>Fri, 10 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/10/10/The-profitability-of-online-services.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been doing a lot of thought about whether or not it&amp;rsquo;s even possible to both&#xA;run a simple website &lt;em&gt;and&lt;/em&gt; turn a profit from it &lt;em&gt;and&lt;/em&gt; maintain a high quality&#xA;of service. In particular, I&amp;rsquo;m thinking about image hosts, considering that I&#xA;run one (a rather unprofitable one, too), but I would&#xA;think that my thoughts on this matter apply to more kinds of websites. That&#xA;being said, I&amp;rsquo;ll just talk about media hosting because that&amp;rsquo;s where I have&#xA;tangible expertise.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Process scheduling and multitasking in KnightOS</title>
      <link>https://drewdevault.com/2014/09/02/Process-scheduling-in-KnightOS.html</link>
      <pubDate>Tue, 02 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/09/02/Process-scheduling-in-KnightOS.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m going to do some blogging about technical decisions made with&#xA;&lt;a href=&#34;http://knightos.org&#34;&gt;KnightOS&lt;/a&gt;. It&amp;rsquo;s an open-source project I&amp;rsquo;ve been working&#xA;on for the past four years to build an open-source Unix-like kernel for TI&#xA;calculators (in assembly). It&amp;rsquo;s been a cool platform on top of which I can&#xA;research low level systems concepts and I thought I&amp;rsquo;d share some of my findings&#xA;with the world.&lt;/p&gt;&#xA;&lt;p&gt;So, first of all, what is scheduling? For those who are completely out of the&#xA;loop, I&amp;rsquo;ll explain what exactly it is and why it&amp;rsquo;s neccessary. Computers run on&#xA;a CPU, which executes a series of instructions in order. Each core is not&#xA;capable of running several instructions concurrently. However, you can run&#xA;hundreds of processes at once on your computer (and you probably are doing so&#xA;as you read this article). There are a number of ways of accomplishing, but the&#xA;one that suits the most situations is &lt;em&gt;preemtive multitasking&lt;/em&gt;. This is what&#xA;KnightOS uses. You see, a CPU can only execute one instruction after another,&#xA;but you can &amp;ldquo;raise an interrupt&amp;rdquo;. This will halt execution and move to some&#xA;other bit of code for a moment. This can be used to handle various events (for&#xA;example, the GameBoy raises an interrupt when a button is pressed). One of&#xA;these events is often a timer, which raises an interrupt at a fixed interval.&#xA;This is the mechanism by which preemptive multitasking is accomplished.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python&#39;s datetime sucks</title>
      <link>https://drewdevault.com/2014/06/28/Python-datetime-sucks.html</link>
      <pubDate>Sat, 28 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/06/28/Python-datetime-sucks.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been playing with Python for about a year now, and I like pretty much&#xA;everything about it. There&amp;rsquo;s one thing that&amp;rsquo;s really rather bad and really should&#xA;not be that bad, however - date &amp;amp; time support. It&amp;rsquo;s ridiculous how bad it is in&#xA;Python. This is what you get with the standard datetime module:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The current time and strftime, with a reasonable set of properties&lt;/li&gt;&#xA;&lt;li&gt;Time deltas with days, seconds, and microseconds and nothing else&lt;/li&gt;&#xA;&lt;li&gt;Acceptable support for parsing dates and times&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;What you don&amp;rsquo;t get is:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go&#39;s error handling doesn&#39;t sit right with me</title>
      <link>https://drewdevault.com/2014/06/07/Why-Go-error-handling-doesnt-sit-right-with-me.html</link>
      <pubDate>Sat, 07 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/06/07/Why-Go-error-handling-doesnt-sit-right-with-me.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ll open up by saying that I am not a language designer, and I do like a lot of&#xA;things about Go. I just recently figured out how to describe why Go&amp;rsquo;s error&#xA;handling mechanics don&amp;rsquo;t sit right with me.&lt;/p&gt;&#xA;&lt;p&gt;If you aren&amp;rsquo;t familiar with Go, here&amp;rsquo;s an example of how Go programmers might do&#xA;error handling:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;SomethingThatMightGoWrong&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Handle error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Proceed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s extrapolate this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hacking on your TI calculator</title>
      <link>https://drewdevault.com/2014/02/25/Hacking-on-your-TI-calculator.html</link>
      <pubDate>Tue, 25 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/02/25/Hacking-on-your-TI-calculator.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve built the &lt;a href=&#34;https://github.com/KnightOS/kernel&#34;&gt;KnightOS kernel&lt;/a&gt;, an open-source OS that runs on&#xA;several TI calculator models, including the popular TI-83+ family, and recently the new TI-84+ Color&#xA;Silver Edition. I have published some information on how to build your own operating sytsems for these&#xA;devices, but I&amp;rsquo;ve learned a lot since then and I&amp;rsquo;m writing this blog post to include the lessons I&amp;rsquo;ve&#xA;learned from other attempts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;p&gt;Coming into this, you should be comforable with z80 assembly. It&amp;rsquo;s possible to write an OS for these&#xA;devices in C (and perhaps other high-level languages), but proficiency in z80 assembly is still&#xA;required. Additionally, I don&amp;rsquo;t consider C a viable choice for osdev on these devices when you&#xA;consider that the available compliers do not optimize the result very well, and these devices have&#xA;very limited resources.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The bug that hides from breakpoints</title>
      <link>https://drewdevault.com/2014/02/02/The-worst-bugs.html</link>
      <pubDate>Sun, 02 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2014/02/02/The-worst-bugs.html</guid>
      <description>&lt;p&gt;This is the story of the most difficult bug I ever had to solve. See if you can&#xA;figure it out before the conclusion.&lt;/p&gt;&#xA;&lt;h3 id=&#34;background&#34;&gt;Background&lt;/h3&gt;&#xA;&lt;p&gt;For some years now, I&amp;rsquo;ve worked on a kernel for Texas&#xA;Instruments calculators called &lt;a href=&#34;https://github.com/KnightOS/kernel&#34;&gt;KnightOS&lt;/a&gt;.&#xA;This kernel is written entirely in assembly, and targets the old-school z80&#xA;processor from back in 1976. This classic processor was built without any&#xA;concept of protection rings. It&amp;rsquo;s an 8-bit processor, with 150-some instructions&#xA;and (in this application) 32K of RAM and 32K of Flash. This stuff is so old, I&#xA;ended up writing most of the KnightOS toolchain from scratch rather than try to&#xA;get archaic assemblers and compilers running on modern systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Custom Music Syncing on Android</title>
      <link>https://drewdevault.com/2013/08/24/Music-syncing-on-Android.html</link>
      <pubDate>Sat, 24 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2013/08/24/Music-syncing-on-Android.html</guid>
      <description>&lt;p&gt;I have an HTC One, with CyanogenMod installed. I usually use Spotify, but I&amp;rsquo;ve been wanting to move away from it for a while.&#xA;The biggest thing keeping me there was the ease of syncing up with my phone - I added music on my PC and it just showed up&#xA;on my phone.&lt;/p&gt;&#xA;&lt;p&gt;So, I finally decided to make it work on my phone without Spotify. You might have success if you aren&amp;rsquo;t using CyanogenMod,&#xA;but you definitely need to be rooted and you need to access a root shell on your phone. I was using &lt;code&gt;adb shell&lt;/code&gt; to start with,&#xA;but it has poor terminal emulation. Instead, I ended up installing an SSH daemon on the phone and just using that. Easier to&#xA;use vim in such an enviornment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>You don&#39;t need jQuery</title>
      <link>https://drewdevault.com/2013/08/19/You-dont-need-jQuery.html</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/2013/08/19/You-dont-need-jQuery.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s true. You really don&amp;rsquo;t need jQuery. Modern web browsers can do most of what you want from jQuery,&#xA;without jQuery.&lt;/p&gt;&#xA;&lt;p&gt;For example, take &lt;a href=&#34;https://mediacru.sh&#34;&gt;MediaCrush&lt;/a&gt;. It&amp;rsquo;s a website I spent some time working on with a friend.&#xA;It&amp;rsquo;s actually quite sophisticated - drag-and-drop uploading, uploading via a hidden form, events wired up to&#xA;links and dynamically generated content, and ajax requests/file uploads, the whole she-bang. It does all of&#xA;that without jQuery. It&amp;rsquo;s &lt;a href=&#34;https://github.com/MediaCrush/MediaCrush&#34;&gt;open source&lt;/a&gt;, if you&amp;rsquo;re looking for a good&#xA;example of how all of this can be used in the wild.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://drewdevault.com/dynlib.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/dynlib.html</guid>
      <description>&lt;!doctype html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;meta charset=&#34;utf-8&#34; /&gt;&#xA;&lt;title&gt;Dynamic linking&lt;/title&gt;&#xA;&lt;style&gt;&#xA;body { max-width: 720px; margin: 0 auto }&#xA;img { display: block; margin: 0 auto }&#xA;small { display: block; text-align: center }&#xA;th, td { padding-right: 4rem; text-align: left }&#xA;&lt;/style&gt;&#xA;&lt;h1&gt;Dynamic linking&lt;/h1&gt;&#xA;&lt;h2&gt;Do your installed programs share dynamic libraries?&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;Findings: &lt;strong&gt;not really&lt;/strong&gt;&#xA;&#xA;&lt;p&gt;&#xA;Over half of your libraries are used by fewer than 0.1% of your executables.&#xA;&#xA;&lt;img src=&#34;https://redacted.moe/f/84458436.svg&#34; alt=&#34;A plot showing that the number of times a dynamic library is used shows exponential decay&#34; /&gt;&#xA;&lt;small&gt;Number of times each dynamic library is required by a program&lt;/small&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;libs.awk&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;/\t.*\.so.*/ {&#xA;&#x9;n=split($1, p, &#34;/&#34;)&#xA;&#x9;split(p[n], l, &#34;.&#34;)&#xA;&#x9;lib=l[1]&#xA;&#x9;if (libs[lib] == &#34;&#34;) {&#xA;&#x9;&#x9;libs[lib] = 0&#xA;&#x9;}&#xA;&#x9;libs[lib] += 1&#xA;}&#xA;END {&#xA;&#x9;for (lib in libs) {&#xA;&#x9;&#x9;print libs[lib] &#34;\t&#34; lib&#xA;&#x9;}&#xA;}&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;Usage&lt;/strong&gt;&#xA;&#xA;&lt;pre&gt;&#xA;$ find /usr/bin -type f -executable -print \&#xA;  | xargs ldd 2&amp;gt;/dev/null \&#xA;  | awk -f libs.awk \&#xA;  | sort -rn &amp;gt; results.txt&#xA;$ awk &#39;{ print NR &#34;\t&#34; $1 }&#39; &amp;lt; results.txt &amp;gt; nresults.txt&#xA;$ gnuplot&#xA;gnuplot&amp;gt; plot &#39;nresults.txt&#39;&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://drewdevault.com/dynlib.txt&#34;&gt;my results&lt;/a&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;pre&gt;&#xA;$ find /usr/bin -type f -executable -print | wc -l&#xA;5688&#xA;$ head -n20 &amp;lt; results.txt&#xA;4496&#x9;libc&#xA;4484&#x9;linux-vdso&#xA;4483&#x9;ld-linux-x86-64&#xA;2654&#x9;libm&#xA;2301&#x9;libdl&#xA;2216&#x9;libpthread&#xA;1419&#x9;libgcc_s&#xA;1301&#x9;libz&#xA;1144&#x9;libstdc++&#xA;805&#x9;liblzma&#xA;785&#x9;librt&#xA;771&#x9;libXdmcp&#xA;771&#x9;libxcb&#xA;771&#x9;libXau&#xA;755&#x9;libX11&#xA;703&#x9;libpcre&#xA;667&#x9;libglib-2&#xA;658&#x9;libffi&#xA;578&#x9;libresolv&#xA;559&#x9;libXext&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;h2&gt;Is loading dynamically linked programs faster?&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;Findings: &lt;strong&gt;definitely not&lt;/strong&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Linkage&lt;/th&gt;&#xA;      &lt;th&gt;Avg. startup time&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Dynamic&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;137263 ns&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;Static&lt;/td&gt;&#xA;      &lt;td style=&#34;text-align: right&#34;&gt;64048 ns&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;ex.c&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;#include &amp;lt;stdio.h&amp;gt;&#xA;#include &amp;lt;stdlib.h&amp;gt;&#xA;#include &amp;lt;time.h&amp;gt;&#xA;#include &amp;lt;unistd.h&amp;gt;&#xA;&#xA;int main(int argc, char *argv[]) {&#xA;&#x9;struct timespec ts;&#xA;&#x9;clock_gettime(CLOCK_MONOTONIC, &amp;amp;ts);&#xA;&#x9;fprintf(stdout, &#34;%ld\t&#34;, ts.tv_nsec);&#xA;&#x9;fflush(stdout);&#xA;&#x9;if (argc == 1) {&#xA;&#x9;&#x9;char *args[] = { &#34;&#34;, &#34;&#34;, NULL };&#xA;&#x9;&#x9;execvp(argv[0], args);&#xA;&#x9;} else {&#xA;&#x9;&#x9;fprintf(stdout, &#34;\n&#34;);&#xA;&#x9;}&#xA;&#x9;return 0;&#xA;}&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;test.sh&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;#!/bin/sh&#xA;i=0&#xA;while [ $i -lt 1000 ]&#xA;do&#xA;&#x9;./ex&#xA;&#x9;i=$((i+1))&#xA;done&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;My results&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;$ musl-gcc -o ex ex.c&#xA;$ ./test.sh | awk &#39;BEGIN { sum = 0 } { sum += $2-$1 } END { print sum / NR }&#39;&#xA;137263&#xA;$ musl-gcc -static -o ex ex.c&#xA;$ ./test.sh | awk &#39;BEGIN { sum = 0 } { sum += $2-$1 } END { print sum / NR }&#39;&#xA;64048&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;h2&gt;Wouldn&#39;t statically linked executables be huge?&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;Findings: &lt;strong&gt;not really&lt;/strong&gt;&#xA;&#xA;&lt;p&gt;&#xA;On average, dynamically linked executables use only 4.6% of the symbols on&#xA;offer from their dependencies. A good linker will remove unused symbols.&#xA;&#xA;&lt;img src=&#34;https://redacted.moe/f/7a01b09c.svg&#34; alt=&#34;A box plot showing most results are &amp;lt;5%, with outliers evenly distributed up to 100%&#34; /&gt;&#xA;&lt;small&gt;% of symbols requested by dynamically linked programs from the libraries that it depends on&lt;/small&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;nsyms.go&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;package main&#xA;&#xA;import (&#xA;&#x9;&#34;bufio&#34;&#xA;&#x9;&#34;fmt&#34;&#xA;&#x9;&#34;os&#34;&#xA;&#x9;&#34;os/exec&#34;&#xA;&#x9;&#34;path/filepath&#34;&#xA;&#x9;&#34;strings&#34;&#xA;)&#xA;&#xA;func main() {&#xA;&#x9;ldd := exec.Command(&#34;ldd&#34;, os.Args[1])&#xA;&#x9;rc, err := ldd.StdoutPipe()&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;panic(err)&#xA;&#x9;}&#xA;&#x9;ldd.Start()&#xA;&#xA;&#x9;var libpaths []string&#xA;&#x9;scan := bufio.NewScanner(rc)&#xA;&#x9;for scan.Scan() {&#xA;&#x9;&#x9;line := scan.Text()[1:] /* \t */&#xA;&#x9;&#x9;sp := strings.Split(line, &#34; &#34;)&#xA;&#x9;&#x9;var lib string&#xA;&#x9;&#x9;if strings.Contains(line, &#34;=&amp;gt;&#34;) {&#xA;&#x9;&#x9;&#x9;lib = sp[2]&#xA;&#x9;&#x9;} else {&#xA;&#x9;&#x9;&#x9;lib = sp[0]&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;if !filepath.IsAbs(lib) {&#xA;&#x9;&#x9;&#x9;lib = &#34;/usr/lib/&#34; + lib&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;libpaths = append(libpaths, lib)&#xA;&#x9;}&#xA;&#x9;ldd.Wait()&#xA;&#x9;rc.Close()&#xA;&#xA;&#x9;syms := make(map[string]interface{})&#xA;&#x9;for _, path := range libpaths {&#xA;&#x9;&#x9;objdump := exec.Command(&#34;objdump&#34;, &#34;-T&#34;, path)&#xA;&#x9;&#x9;rc, err := objdump.StdoutPipe()&#xA;&#x9;&#x9;if err != nil {&#xA;&#x9;&#x9;&#x9;panic(err)&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;objdump.Start()&#xA;&#x9;&#x9;scan := bufio.NewScanner(rc)&#xA;&#x9;&#x9;for i := 0; scan.Scan(); i++ {&#xA;&#x9;&#x9;&#x9;if i &amp;lt; 4 {&#xA;&#x9;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;line := scan.Text()&#xA;&#x9;&#x9;&#x9;sp := strings.Split(line, &#34; &#34;)&#xA;&#x9;&#x9;&#x9;if len(sp) &amp;lt; 5 {&#xA;&#x9;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;&#x9;sym := sp[len(sp)-1]&#xA;&#x9;&#x9;&#x9;syms[sym] = nil&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;objdump.Wait()&#xA;&#x9;&#x9;rc.Close()&#xA;&#x9;}&#xA;&#xA;&#x9;objdump := exec.Command(&#34;objdump&#34;, &#34;-R&#34;, os.Args[1])&#xA;&#x9;rc, err = objdump.StdoutPipe()&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;panic(err)&#xA;&#x9;}&#xA;&#x9;objdump.Start()&#xA;&#x9;used := make(map[string]interface{})&#xA;&#x9;scan = bufio.NewScanner(rc)&#xA;&#x9;for i := 0; scan.Scan(); i++ {&#xA;&#x9;&#x9;if i &amp;lt; 5 {&#xA;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;sp := strings.Split(scan.Text(), &#34; &#34;)&#xA;&#x9;&#x9;if len(sp) &amp;lt; 3 {&#xA;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;sym := sp[len(sp)-1]&#xA;&#x9;&#x9;used[sym] = nil&#xA;&#x9;}&#xA;&#x9;objdump.Wait()&#xA;&#x9;rc.Close()&#xA;&#xA;&#x9;if len(syms) != 0 &amp;amp;&amp;amp; len(used) != 0 &amp;amp;&amp;amp; len(used) &amp;lt;= len(syms) {&#xA;&#x9;&#x9;fmt.Printf(&#34;%50s\t%d\t%d\t%f\n&#34;, os.Args[1], len(syms), len(used),&#xA;&#x9;&#x9;&#x9;float64(len(used)) / float64(len(syms)))&#xA;&#x9;}&#xA;}&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;Usage&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;$ find /usr/bin -type f -executable -print | xargs -n1 ./nsyms &amp;gt; results.txt&#xA;$ awk &#39;{ n += $4 } END { print n / NR }&#39; &amp;lt; results.txt&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://drewdevault.com/nsyms.txt&#34;&gt;my results&lt;/a&gt;&#xA;&#xA;&lt;h2&gt;Will security vulnerabilities in libraries that have been statically linked&#xA;  cause large or unmanagable updates?&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;Findings: &lt;strong&gt;not really&lt;/strong&gt;&#xA;&#xA;&lt;p&gt;&#xA;Not including libc, the only libraries which had &#34;critical&#34; or &#34;high&#34; severity&#xA;vulnerabilities in 2019 which affected over 100 binaries on my system were dbus,&#xA;gnutls, cairo, libssh2, and curl. 265 binaries were affected by the rest.&#xA;&#xA;&lt;p&gt;&#xA;The total download cost to upgrade all binaries on my system which were affected&#xA;by CVEs in 2019 is 3.8 GiB. This is reduced to 1.0 GiB if you eliminate glibc.&#xA;&#xA;&lt;p&gt;&#xA;It is also unknown if any of these vulnerabilities would have been introduced&#xA;&lt;em&gt;after&lt;/em&gt; the last build date for a given statically linked binary; if so&#xA;that binary would not need to be updated. Many vulnerabilities are also limited&#xA;to a specific code path or use-case, and binaries which do not invoke that code&#xA;path in their dependencies will not be affected. A process to ascertain this&#xA;information in the wake of a vulnerability could be automated.&#xA;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://lists.archlinux.org/pipermail/arch-security/&#34;&gt;arch-security&lt;/a&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;extractcves.py&lt;/strong&gt;&#xA;&lt;pre&gt;&#xA;import email.utils&#xA;import mailbox&#xA;import re&#xA;import shlex&#xA;import time&#xA;&#xA;pacman_re = re.compile(r&#39;pacman -Syu .*&#39;)&#xA;severity_re = re.compile(r&#39;Severity: (.*)&#39;)&#xA;&#xA;mbox = mailbox.mbox(&#34;arch-security.mbox&#34;)&#xA;for m in mbox.items():&#xA;    m = m[1]&#xA;    date = m[&#34;Date&#34;]&#xA;    for part in m.walk():&#xA;        if part.is_multipart():&#xA;            continue&#xA;        content_type = part.get_content_type()&#xA;        [charset] = part.get_charsets(&#34;utf-8&#34;)&#xA;        if content_type == &#39;text/plain&#39;:&#xA;            body = part.get_payload(decode=True).decode(charset)&#xA;            break&#xA;    pkgs = pacman_re.findall(body)&#xA;    severity = severity_re.findall(body)&#xA;    date = email.utils.parsedate(date)&#xA;    if len(pkgs) == 0 or date is None:&#xA;        continue&#xA;    if date[0] &amp;lt;= 2018 or date[0] &amp;gt; 2019:&#xA;        continue&#xA;    severity = severity[0]&#xA;    args = shlex.split(pkgs[0])&#xA;    pkg = args[2].split(&#34;&amp;gt;=&#34;)[0]&#xA;    print(pkg, severity)&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;pre&gt;&#xA;$ python3 extractcves.py | grep Critical &amp;gt; cves.txt&#xA;$ xargs pacman -Ql &amp;lt; cves.txt | grep \\.so | awk &#39;{print $1}&#39; | sort -u&amp;gt;affected.txt&#xA;# Manually remove packages like Firefox, Thunderbird, etc; write remainder.txt&#xA;$ xargs pacman -Ql &amp;lt; remainder.txt | grep &#39;/usr/lib/.*.so$&#39; | awk &#39;{ print $2 }&#39; &amp;gt; libs.txt&#xA;$ ldd /usr/bin/* &amp;gt;ldd.txt&#xA;$ ./scope.sh &amp;lt;libs.txt | sort -nr &amp;gt;sobjects.txt&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;https://drewdevault.com/sobjects.txt&#34;&gt;sobjects.txt&lt;/a&gt; is a sorted list of shared objects and&#xA;the number of executables that link to them. To find the total size of affected&#xA;binaries, I ran the following command:&#xA;&#xA;&lt;pre style=&#34;overflow-x: scroll&#34;&gt;&#xA;# With libc&#xA;$ egrep -la &#39;libc.so|libm.so|libdl.so|libpthread.so|librt.so|libresolv.so|libdbus-1.so|libgnutls.so|libcairo.so|libutil.so|libssh2.so|libcurl.so|libcairo-gobject.so|libcrypt.so|libspice-server.so|libarchive.so|libSDL2-2.0.so|libmvec.so|libmagic.so|libtextstyle.so|libgettextlib-0.20.2.so|libgettextsrc-0.20.2.so|libMagickWand-7.Q16HDRI.so|libMagickCore-7.Q16HDRI.so|libbfd-2.34.0.so|libpolkit-gobject-1.so|libwebkit2gtk-4.0.so|libjavascriptcoregtk-4.0.so|libpolkit-agent-1.so|libgs.so|libctf.so|libSDL.so|libopcodes-2.34.0.so|libQt5WebEngine.so|libQt5WebEngineCore.so|libctf-nobfd.so|libcairo-script-interpreter.so&#39; /usr/bin/* | xargs wc -c&#xA;# Without libc&#xA;$ egrep -la &#39;libdbus-1.so|libgnutls.so|libcairo.so|libssh2.so|libcurl.so|libcairo-gobject.so|libcrypt.so|libspice-server.so|libarchive.so|libSDL2-2.0.so|libmvec.so|libmagic.so|libtextstyle.so|libgettextlib-0.20.2.so|libgettextsrc-0.20.2.so|libMagickWand-7.Q16HDRI.so|libMagickCore-7.Q16HDRI.so|libbfd-2.34.0.so|libpolkit-gobject-1.so|libwebkit2gtk-4.0.so|libjavascriptcoregtk-4.0.so|libpolkit-agent-1.so|libgs.so|libctf.so|libSDL.so|libopcodes-2.34.0.so|libQt5WebEngine.so|libQt5WebEngineCore.so|libctf-nobfd.so|libcairo-script-interpreter.so&#39; /usr/bin/* | xargs wc -c&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;h2&gt;Doesn&#39;t static linking prevent &lt;abbr title=&#34;address space layout randomization, a security technique&#34;&gt;ASLR&lt;/abbr&gt; from working?&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&lt;strong&gt;No&lt;/strong&gt;. &#xA;&#xA;&lt;p&gt;&#xA;We&#39;ve had ASLR for statically linked binaries for some time now. It&#39;s called &lt;a href=&#34;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81498&#34;&gt;static PIE&lt;/a&gt;.&#xA;&#xA;&lt;h2&gt;Test environment&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;  &lt;li&gt;Arch Linux, up-to-date as of 2020-06-25&lt;/li&gt;&#xA;  &lt;li&gt;2188 packages installed&lt;/li&gt;&#xA;  &lt;li&gt;gcc 10.1.0&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://drewdevault.com/editing.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/editing.html</guid>
      <description>&lt;!doctype html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;meta charset=&#34;utf-8&#34; /&gt;&#xA;&lt;title&gt;Videos of people editing text&lt;/title&gt;&#xA;&lt;style&gt;&#xA;body {&#xA;  max-width: 720px;&#xA;  margin: 0 auto;&#xA;}&#xA;&#xA;video {&#xA;  display: block;&#xA;  width: 720px;&#xA;  margin-top: 1rem;&#xA;}&#xA;&lt;/style&gt;&#xA;&lt;h1&gt;Videos of people editing text&lt;/h1&gt;&#xA;&lt;p&gt;&#xA;Videos of people editing text, explaining the shortcuts they use, and&#xA;recordings of their keyboards as they work. The purpose of this page is to&#xA;provide a reference for people writing new software which involves text editing&#xA;tasks.&#xA;&#xA;&lt;p&gt;&#xA;These videos are licensed with&#xA;&lt;a href=&#34;https://creativecommons.org/licenses/by-sa/2.0/&#34;&gt;CC-BY-SA&lt;/a&gt;, which&#xA;permits re-distribution and modification so long as attribution is provided and&#xA;derivative works use the same license.&#xA;&#xA;&lt;p&gt;&#xA;&lt;a href=&#34;#contribute&#34;&gt;Can you contribute your own?&lt;/a&gt;&#xA;&#xA;&lt;h2&gt;Resources&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;  &lt;li&gt;&#xA;    &lt;a href=&#34;https://lord.io/blog/2019/text-editing-hates-you-too/&#34;&gt;&#xA;      Text Editing Hates You Too&#xA;    &lt;/a&gt;&#xA;  &lt;/li&gt;&#xA;  &lt;li&gt;&#xA;    &lt;a href=&#34;https://gankra.github.io/blah/text-hates-you/&#34;&gt;&#xA;      Text Rendering Hates You&#xA;    &lt;/a&gt;&#xA;  &lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2&gt;Videos&lt;/h2&gt;&#xA;&#xA;&lt;video src=&#34;https://yukari.sr.ht/drew-devault-keyboard.webm&#34; controls&gt;&#xA;  Your browser must support HTML5 video and webm to play this video.&#xA;&lt;/video&gt;&#xA;&#xA;&lt;dl&gt;&#xA;  &lt;dt&gt;Source&lt;/dt&gt;&#xA;  &lt;dd&gt;Drew DeVault&lt;/dd&gt;&#xA;  &lt;dt&gt;Language&lt;/dt&gt;&#xA;  &lt;dd&gt;English&lt;/dd&gt;&#xA;  &lt;dt&gt;Keyboard&lt;/dt&gt;&#xA;  &lt;dd&gt;Kinesis Freestyle Pro; ANSI layout; QWERTY&lt;/dd&gt;&#xA;  &lt;dt&gt;Operating system&lt;/dt&gt;&#xA;  &lt;dd&gt;Linux 5.7.6&lt;/dd&gt;&#xA;  &lt;dt&gt;Software&lt;/dt&gt;&#xA;  &lt;dd&gt;gedit 3.36.2 (GTK+ 3.24.20), alacritty 0.5.0.1564.g3233ede0, vim 8.2.0814&lt;/dd&gt;&#xA;  &lt;dt&gt;Tags&lt;/dt&gt;&#xA;  &lt;dd&gt;#english #en #en-us #ansi #qwerty #modal-editing&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&#xA;&lt;h2 id=&#34;contribute&#34;&gt;Contribute&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;I would be interested in adding your video to this page, provided that it&#xA;demonstrates one of the following qualities which is not yet represented by&#xA;another video:&#xA;&#xA;&lt;ul&gt;&#xA;  &lt;li&gt;A natural language not yet represented&lt;/li&gt;&#xA;  &lt;li&gt;An operating system not yet represented&lt;/li&gt;&#xA;  &lt;li&gt;A keyboard layout or design not yet represented&lt;/li&gt;&#xA;  &lt;li&gt;Software with novel editing features&lt;/li&gt;&#xA;  &lt;li&gt;A novel workflow, e.g. screen reader or dictation software&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;&#xA;When preparing your video, please use a camera to capture a video of your&#xA;keyboard. I recommend &lt;a href=&#34;https://obsproject.com/&#34;&gt;OBS&lt;/a&gt; to capture a&#xA;recording of both your screen and keyboard, as well as audio from your&#xA;microphone. Please narrate your workflow in English, and include details which&#xA;seem &#34;obvious&#34; to you; they might not be obvious to someone else. Contact&#xA;&lt;a href=&#34;mailto:sir@cmpwn.com&#34;&gt;Drew DeVault &amp;lt;sir@cmpwn.com&amp;gt;&lt;/a&gt;&#xA;to list your video. Please include the following details:&#xA;&#xA;&lt;ul&gt;&#xA;  &lt;li&gt;Your name, for attribution&lt;/li&gt;&#xA;  &lt;li&gt;The natural language you are demonstrating input for&lt;/li&gt;&#xA;  &lt;li&gt;Your keyboard model and layout&lt;/li&gt;&#xA;  &lt;li&gt;Your operating system and the names &amp;amp; version numbers of your software&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;p&gt;&#xA;Thank you!</description>
    </item>
    <item>
      <title></title>
      <link>https://drewdevault.com/new-server.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/new-server.html</guid>
      <description>&lt;h1&gt;New Server Checklist&lt;/h1&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Set root password&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Generate fresh sshd host keys&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Create admin user&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Add admin to doas group and test doas&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; SSH key added to admin&#39;s authorized_keys&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Disable root login via ssh&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Disable password login via ssh&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Set hostname&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Run system updates&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Reboot&#xA;&lt;/label&gt;&#xA;&lt;label&gt;&#xA;  &lt;input type=&#34;checkbox&#34; /&gt; Install &amp;amp; test postfix&#xA;&lt;/label&gt;&#xA;&#xA;&lt;style&gt;&#xA;label { display: block; }&#xA;pre { background: #eee; max-width: 720px; padding: 0.5rem; }&#xA;&lt;/style&gt;&#xA;&#xA;&lt;h1&gt;doas.conf&lt;/h1&gt;&#xA;&#xA;&lt;pre&gt;&#xA;# see doas.conf(5) for configuration details&#xA;&#xA;# Uncomment to allow group &#34;admin&#34; to become root&#xA;# permit :admin&#xA;permit nopass :admin&#xA;permit nopass deploy cmd apk args upgrade -U&#xA;permit nopass deploy cmd service args SERVICE restart&#xA;permit nopass acme cmd nginx args -s reload&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;h1&gt;acme setup&lt;/h1&gt;&#xA;&lt;p&gt;&#xA;TODO: a package could be made to automate many of these steps&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://drewdevault.com/pinebook.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/pinebook.html</guid>
      <description>&lt;!doctype html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;meta charset=&#34;utf-8&#34; /&gt;&#xA;&lt;title&gt;ThinkPad T420 vs Pinebook Pro&lt;/title&gt;&#xA;&lt;style&gt;&#xA;body {&#xA;  max-width: 640px;&#xA;  margin: 0 auto;&#xA;}&#xA;&#xA;table {&#xA;  width: 100%;&#xA;  border-collapse: collapse;&#xA;  margin-top: 1rem;&#xA;}&#xA;&#xA;th, td {&#xA;  border-bottom: 1px solid black;&#xA;  line-height: 1.5;&#xA;}&#xA;&#xA;td { text-align: center; }&#xA;&#xA;th:first-child {&#xA;  font-weight: normal;&#xA;  text-align: right;&#xA;}&#xA;&#xA;.yes { color: green; font-weight: bold; }&#xA;.no { color: red; }&#xA;.maybe { color: orange; }&#xA;&#xA;sup {&#xA;  color: black;&#xA;  font-weight: normal;&#xA;  position: absolute;&#xA;  font-size: 0.75rem;&#xA;}&#xA;&#xA;p { line-height: 1.3; }&#xA;&lt;/style&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;td&gt;&lt;/td&gt;&#xA;      &lt;th&gt;ThinkPad T420&lt;/th&gt;&#xA;      &lt;th&gt;Pinebook Pro&lt;/th&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Upstream kernel&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Open BIOS&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Sane bootloader&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;BIOS&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;uBoot&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Open display firmware&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Open wireless firmware&lt;/th&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Wireless kill switch&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Bluetooth 5.0&lt;/th&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Storage&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;500G&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;64G&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Upgradable storage&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;RAM&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;16G&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;4G&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Upgradable memory&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;✗&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Weight&lt;/th&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;2.2kg&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;1.3kg&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Battery life&lt;/th&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;3.5-5.8 hours&lt;/td&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;6-8 hours&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Replacable battery&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;maybe&#34;&gt;requires screwdriver&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;User-serviceable parts&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;maybe&#34;&gt;some&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;HD video playback&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;maybe&#34;&gt;good luck&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th&gt;Usable web browsing&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;✓&lt;/td&gt;&#xA;      &lt;td class=&#34;maybe&#34;&gt;good luck&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th class=&#34;bold&#34;&gt;Price&lt;/th&gt;&#xA;      &lt;td class=&#34;yes&#34;&gt;$150 (eBay)&lt;/td&gt;&#xA;      &lt;td class=&#34;no&#34;&gt;$200 (Pine store)&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;&#xA;    &lt;tr&gt;&#xA;      &lt;th class=&#34;bold&#34;&gt;Release year&lt;/th&gt;&#xA;      &lt;td&gt;2011&lt;/td&gt;&#xA;      &lt;td&gt;2019&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;&#xA;    &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;p&gt;&#xA;The Pinebook Pro is a decent laptop. It is lightweight, has a good display, and&#xA;a good battery life. I am happy with Pine64 as a company and think that it is a&#xA;good product. There is a place for it in my life. Pine64 has their heart in the&#xA;right place and I support them and buy their products because I want them to&#xA;succeed.&#xA;&#xA;&lt;p&gt;&#xA;But, is this the best the modern laptop industry can come up with? As a&#xA;workstation, it doesn&#39;t compete. The performance of the ARM CPU is absolutely&#xA;put to shame by the 8 year old T420, even for basic tasks. Is this 8 years of&#xA;advancement in the state of the art?&#xA;&#xA;&lt;p&gt;&#xA;Get your shit together, laptop vendors. Fuck&#39;s sake.&#xA;&#xA;&lt;hr /&gt;&#xA;&#xA;&lt;p&gt;&#xA;1: Aftermarket via &lt;a href=&#34;https://doc.coreboot.org/mainboard/lenovo/t420.html&#34;&gt;coreboot&lt;/a&gt;&#xA;&#xA;&lt;p&gt;&#xA;2: Limited release, full release in 2020</description>
    </item>
    <item>
      <title></title>
      <link>https://drewdevault.com/time.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/time.html</guid>
      <description>&lt;!doctype html&gt;&#xA;&lt;html&gt;&#xA;&lt;meta charset=&#34;utf-8&#34; /&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://drewdevault.com/time.css&#34;&gt;&#xA;&lt;title&gt;Human history&lt;/title&gt;&#xA;&#xA;&lt;h1&gt;&#xA;  Human history&#xA;  &lt;small&gt;Scroll down ↓&lt;/small&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p class=&#34;small-screens&#34;&gt;&#xA;Disclaimer: I have made no attempt to make this look correct on screens&#xA;&amp;lt;1,000 pixels wide.&#xA;&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;key&#34;&gt;&#xA;  &lt;span class=&#34;ten&#34;&gt;10 years&lt;/span&gt;&#xA;  &lt;span class=&#34;thousand&#34;&gt;1,000 years&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;era stone&#34;&gt;&#xA;  &lt;span&gt;Stone tools&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;era homo-sapiens&#34;&gt;&#xA;  &lt;span&gt;Homo sapiens&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;era art&#34;&gt;&#xA;  &lt;span&gt;Art&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;transition&#34;&gt;&#xA;  &lt;span class=&#34;art&#34;&gt;&lt;/span&gt;&#xA;  &lt;span class=&#34;agriculture&#34;&gt;&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;era agriculture&#34;&gt;&#xA;  &lt;span&gt;Agriculture&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;era civilization&#34;&gt;&#xA;  &lt;span&gt;Civilization&lt;/span&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;transition modern&#34;&gt;&#xA;  &lt;span class=&#34;civilization&#34;&gt;&lt;/span&gt;&#xA;  &lt;span class=&#34;industry&#34;&gt;&#xA;    &lt;span&gt;Industry&lt;/span&gt;&#xA;  &lt;/span&gt;&#xA;  &lt;span class=&#34;ww2&#34;&gt;&#xA;    &lt;span&gt;World War II&lt;/span&gt;&#xA;  &lt;/span&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Building and scaling Hare’s community governance</title>
      <link>https://drewdevault.com/talks/hare-governance.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/hare-governance.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How the Hare programming language community grew from one BDFL and a ragtag&#xA;group of early hackers to a productive, sociable, and egalitarian community of&#xA;happy hackers with a lightweight and effective model of participatory&#xA;governance.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://harelang.org&#34;&gt;The Hare programming language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://redacted.moe/f/f95c1355.pdf&#34;&gt;Download slides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;FOSS Backstage 2026&lt;/p&gt;&#xA;&lt;p&gt;2026-03-17 11:55 - 12:25&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://26.foss-backstage.de/session/building-and-scaling-hares-community-governance/&#34;&gt;Details&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Can free software be made sustainable?</title>
      <link>https://drewdevault.com/talks/foss-and-money.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/foss-and-money.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Money is a tool, and it can be used to make free software work better. It can&#xA;also be used to make free software worse. In this talk, we’ll discuss&#xA;strategies for managing the economic incentives of free software such that you&#xA;can put food on your table without compromising on your values.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://redacted.moe/f/a8d57594.pdf&#34;&gt;Download slides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://hackmeeting.org/hackit22/schedule.html#talk-a2eb7aa1-90ac-48b9-8ac9-b16235eb2daf&#34;&gt;Hackmeeting 0x19&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;CSOA Gabrio, Via Millio 42, Torino, Italia&lt;/p&gt;&#xA;&lt;p&gt;2022-09-10 @ 19:00 local time&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cryptocurrency sucks</title>
      <link>https://drewdevault.com/talks/cryptocurrency.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/cryptocurrency.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We will examine cryptocurrency in detail to understand how it works, how it&#xA;fails to achieve its stated goals, how useful it (isn&amp;rsquo;t) as a currency, and&#xA;the consequences for society.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://redacted.moe/f/5b697982.pdf&#34;&gt;Download slides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/2021/04/26/Cryptocurrency-is-a-disaster.html&#34;&gt;Cryptocurrency is an abject disaster&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Techinc&lt;/p&gt;&#xA;&lt;p&gt;2022-04-16 @ 17:00&lt;/p&gt;&#xA;&lt;p&gt;Louwesweg 1&lt;br /&gt;&#xA;1066 EA Amsterdam&lt;br /&gt;&#xA;Netherlands&lt;/p&gt;&#xA;&lt;p&gt;Call +31852016320 to get someone to let you in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Drew DeVault&#39;s Japanese Learning Resources</title>
      <link>https://drewdevault.com/japanese.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/japanese.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: this is a work in progress. I last updated this page on 2019-11-12. If&#xA;that was a while ago, feel free to ping me and ask me to write some more.&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#introduction&#34;&gt;Introduction&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#bootstrapping&#34;&gt;Bootstrapping&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#anki-deck-generators&#34;&gt;Anki deck generators&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#kanji-study&#34;&gt;Kanji study&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#vocabulary-study&#34;&gt;Vocabulary study&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#grammar-study&#34;&gt;Grammar study&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#reading-practice&#34;&gt;Reading practice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#writing-practice&#34;&gt;Writing practice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#listening-practice&#34;&gt;Listening practice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#speaking-practice&#34;&gt;Speaking practice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#conversations-skills&#34;&gt;Conversation skills&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#list-of-resources&#34;&gt;List of resources&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been studying Japanese for a few years now, and while I still have a lot to&#xA;learn I feel comfortable having conversations in Japanese, without feeling like&#xA;the other participant is having to be concious of the complexity of their&#xA;language use. Accomplishing that had been my goal from the start; yours may be&#xA;different. What follows is what I believe is a reasonably good approach to&#xA;self-directed Japanese language study.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Himitsu: A novel keyring &amp; password manager for Unix</title>
      <link>https://drewdevault.com/talks/himitsu.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/himitsu.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Himitsu is a novel design for a key/value store to securely store your&#xA;passwords, private keys, and other secrets. It is a simple core upon which a&#xA;highly extensible ecosystem of integrations can be built to handle any kind of&#xA;secret. This talk will introduce the Himitsu key store, demonstrate many of&#xA;the things it is capable of, and explain its current level of sophistication&#xA;and what we aspire for in the future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing the Hare programming langauge</title>
      <link>https://drewdevault.com/talks/hare.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/hare.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Hare is a systems programming language designed to be simple, stable, and&#xA;robust. Hare uses a static type system, manual memory management, and a&#xA;minimal runtime. It is well-suited to writing operating systems, system&#xA;tools, compilers, networking software, and other low-level, high performance&#xA;tasks.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://redacted.moe/f/4d05dfb5.pdf&#34;&gt;Download slides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Techinc&lt;/p&gt;&#xA;&lt;p&gt;2022-05-04 @ 19:00 AMS&lt;/p&gt;&#xA;&lt;p&gt;Live stream/recording:&lt;/p&gt;&#xA;&lt;iframe title=&#34;Introducing the Hare programming language&#34; src=&#34;https://spacepub.space/videos/embed/4b848922-e752-4065-baa3-f18afba13edb&#34; allowfullscreen=&#34;&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; width=&#34;560&#34; height=&#34;315&#34; frameborder=&#34;0&#34;&gt;&lt;/iframe&gt;</description>
    </item>
    <item>
      <title>Introduction to qbe</title>
      <link>https://drewdevault.com/talks/qbe.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/qbe.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;qbe is an optimizing compiler backend which consumes programs in a simple&#xA;intermediate language, optimizes them, and emits assembly for x86_64, aarch64,&#xA;or riscv64, aiming to achieve &amp;ldquo;70% of the performance&amp;rdquo; of advanced compilers&#xA;like LLVM in &amp;ldquo;10% of the code&amp;rdquo;. This talk will briefly introduce qbe and its&#xA;intermediate language, explain how it works and what it&amp;rsquo;s capable of, and go&#xA;over some sample programs which can be written in it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Miscellaneous links</title>
      <link>https://drewdevault.com/misc.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/misc.html</guid>
      <description>&lt;h1 id=&#34;services&#34;&gt;Services&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://godocs.io&#34;&gt;godocs.io&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;gemini://feeds.drewdevault.com&#34;&gt;gemreader&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;pages&#34;&gt;Pages&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/japanese.html&#34;&gt;Japanese learning resources&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/make-a-blog.html&#34;&gt;Make a blog!&lt;/a&gt; (defunct)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/new-server.html&#34;&gt;New server checklist&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/new-sysadmin-lecture.html&#34;&gt;New sysadmin lecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/dynlib.html&#34;&gt;Dynamic linking bad&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/time.html&#34;&gt;Deep time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;talks&#34;&gt;Talks&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/foss-contributors-mindset.html&#34;&gt;The FOSS contributor’s mindset&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/qbe.html&#34;&gt;Introduction to qbe&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/cryptocurrency.html&#34;&gt;Cryptocurrency sucks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/hare.html&#34;&gt;Introducing the Hare programming language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/sourcehut-ci.html&#34;&gt;Opening up the SourceHut CI engine&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/himitsu.html&#34;&gt;Himitsu: A novel keyring &amp;amp; password manager for Unix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/foss-and-money.html&#34;&gt;Can free software be made sustainable?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drewdevault.com/talks/hare-governance.html&#34;&gt;Building and scaling Hare’s community governance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>New sysadmin lecture</title>
      <link>https://drewdevault.com/new-sysadmin-lecture.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/new-sysadmin-lecture.html</guid>
      <description>&lt;p&gt;You&amp;rsquo;re a production sysadmin now. That comes with certain responsibilities. In&#xA;short:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Respect the user&amp;rsquo;s privacy, and look at only what you must.&lt;/li&gt;&#xA;&lt;li&gt;Think before you type.&lt;/li&gt;&#xA;&lt;li&gt;With great power comes great responsibility.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Assorted tips:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Practice your changes on localhost first.&lt;/li&gt;&#xA;&lt;li&gt;Ask for help if you need it.&lt;/li&gt;&#xA;&lt;li&gt;Always run your SQL queries in a transaction.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;SELECT things, you, want FROM x;&lt;/code&gt; is generally better than &lt;code&gt;SELECT * FROM x;&lt;/code&gt;&#xA;when considering the user&amp;rsquo;s privacy.&lt;/li&gt;&#xA;&lt;li&gt;Share information on a need-to-know basis, both with people and with&#xA;computers.&lt;/li&gt;&#xA;&lt;li&gt;Avoid doing things that cannot be undone.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;spear-phishing&#34;&gt;Spear Phishing&lt;/h2&gt;&#xA;&lt;p&gt;Because you now have access to production systems, you may be a target for spear&#xA;phishing. A bad actor may target you directly in a social engineering attack in&#xA;an attempt to get you to leverage your access to mistakenly compromise the&#xA;system. For example, someone may impersonate another admin and ask you to add an&#xA;SSH key to a server. You need to be aware of this risk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Opening up the SourceHut CI engine</title>
      <link>https://drewdevault.com/talks/sourcehut-ci.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/sourcehut-ci.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;An overview of the architecture of SourceHut&amp;rsquo;s CI engine, builds.sr.ht. We&amp;rsquo;ll&#xA;be looking at how the system is laid out and at directions for future&#xA;improvement.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://lostilburg.nl/post/017/&#34;&gt;LOSTilburg&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;2022-05-24 @ 19:30&lt;/p&gt;&#xA;&lt;p&gt;Hendrikx ITC (conference room Spoorzicht013)&lt;br /&gt;&#xA;Spoorlaan 21K&lt;br /&gt;&#xA;5038 CB Tilburg&lt;/p&gt;</description>
    </item>
    <item>
      <title>The FOSS contributor&#39;s mindset</title>
      <link>https://drewdevault.com/talks/foss-contributors-mindset.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/talks/foss-contributors-mindset.html</guid>
      <description>&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Many people use free software, and a fraction of them have dipped their toes&#xA;into contributing - publishing their own projects, or contributing to one or&#xA;two. Too few, however, have completely grokked the opportunities the expansive&#xA;free software ecosystem offers to us.&lt;/p&gt;&#xA;&lt;p&gt;This talk will discuss how to contribute to a wider variety of projects,&#xA;introduce useful tools for quickly coming to grips with a foreign codebase,&#xA;and explain the mindset that these tools help to cultivate.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is Gemini?</title>
      <link>https://drewdevault.com/gemini.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/gemini.html</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://gemini.circumlunar.space/&#34;&gt;Gemini&lt;/a&gt; protocol is an alternative to&#xA;HTTP, and Gemtext is an alternative document format to HTML. This blog is&#xA;available over both Gemini and HTTP, and some content is exclusive to each.&#xA;To connect with Gemini, you will need a Gemini client. I wrote one called&#xA;&lt;a href=&#34;https://git.sr.ht/~sircmpwn/gmni&#34;&gt;gmnlm&lt;/a&gt;, and there are more &lt;a href=&#34;https://gemini.circumlunar.space/clients.html&#34;&gt;listed here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Once you have your client working, direct it to &lt;code&gt;gemini://drewdevault.com&lt;/code&gt; and&#xA;you&amp;rsquo;ll be on your way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>You should make a blog!</title>
      <link>https://drewdevault.com/make-a-blog.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://drewdevault.com/make-a-blog.html</guid>
      <description>&lt;p&gt;I would like to see more people writing about their passions and thoughts in a&#xA;permanent and public medium. You should make a blog!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This is an open offer to pay anyone $20 for starting a tech blog and writing&#xA;their first article.&lt;/strong&gt; If you write another 3 articles within 6 months, I&amp;rsquo;ll&#xA;give you another $20. You can also choose to have me donate your reward to one&#xA;of the following charitable organizations:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
