<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Free Software &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/free-software/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Tue, 07 Oct 2025 10:28:12 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>Free Software &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[How to *actually* test your readme]]></title>
		<link>https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/</link>
					<comments>https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 07 Oct 2025 11:34:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=62224</guid>

					<description><![CDATA[If you&#039;ve spent any time using Linux, you&#039;ll be used to installing software like this:  The README says to download from this link. Huh, I&#039;m not sure how to unarchive .tar.xz files - guess I&#039;ll search for that. Right, it says run setup.sh hmm, that doesn&#039;t work. Oh, I need to set the permissions. What was the chmod command again? OK, that&#039;s working. Wait, it needs sudo. Let me run that again.…]]></description>
										<content:encoded><![CDATA[<p>If you've spent any time using Linux, you'll be used to installing software like this:</p>

<blockquote><p>The README says to download from this link. Huh, I'm not sure how to unarchive .tar.xz files - guess I'll search for that. Right, it says run <code>setup.sh</code> hmm, that doesn't work. Oh, I need to set the permissions. What was the <code>chmod</code> command again? OK, that's working. Wait, it needs <code>sudo</code>. Let me run that again. Hang on, am I in the right directory? Here it goes. What, it crapped out. I don't have some random library - how the hell am I meant to install that? My distro has v21 but this requires &lt;=19. Ah, I also need to upgrade something which isn't supplied by repo. Nearly there, just need to compile this obscure project from SourceForge which was inexplicably installed on the original dev's machine and then I'll be good to go. Nope. Better raise an issue on GitHub. Oh, look, it is tomorrow.</p></blockquote>

<p>As a developer, you probably don't want to answer dozens of tickets complaining that users are frustrated with your work. You thought you made the README really clear and - hey! - it works on your machine.</p>

<p>There are various solutions to this problem - developers can release AppImages, or Snaps, or FlatPaks, or Docker or whatever. But that's a bit of stretch for a solo dev who is slinging out a little tool that they coded in their spare time. And, even those don't always work as seamlessly as you'd hope.</p>

<p>There's an easier solution:</p>

<ol>
<li>Follow the steps in your README</li>
<li>See if they work.</li>
<li>…</li>
<li>That's it.</li>
</ol>

<p>OK, that's a bit reductive! There are a million variables which go into a test - so I'm going to introduce you to a secret <em>zeroth</em> step.</p>

<ol start="0">
<li>Spin up a fresh Virtual Machine with a recent-ish distro.</li>
</ol>

<p>If you are a developer, your machine probably has a billion weird configurations and obscure libraries installed on it - things which <em>definitely</em> aren't on your users' machines. Having a box-fresh VM means than you are starting with a blank-slate. If, when following your README, you discover that the app doesn't install because of a missing dependency, you can adjust your README to include <code>apt install whatever</code>.</p>

<h2 id="ok-but-how"><a href="https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/#ok-but-how">OK, but how?</a></h2>

<p>Personally, I like <a href="https://flathub.org/apps/org.gnome.Boxes">Boxes</a> as it gives you a simple choice of VMs - but there are plenty of other Virtual Machine managers out there.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/OS-Selection.webp" alt="List of Linux OSes." width="801" height="728" class="aligncenter size-full wp-image-62227">

<p>Pick a standard OS that you like. I think the latest Ubuntu Server is pretty lightweight and is a good baseline for what people are likely to have. But feel free to pick something with a GUI or whatever suits your audience.</p>

<p>Once your VM is installed and set up for basic use, take a snapshot.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/revert.webp" alt="Pop up showing a snapshot of a virtual machine." width="692" height="628" class="aligncenter size-full wp-image-62228">

<p>Every time you want to test or re-test a README, revert back to the <em>original</em> state of your box. That way you won't have odd half-installed packages laying about.</p>

<p>Your next step is to think about how much hand-holding do you want to do?</p>

<p>For example, the default Debian doesn't ship with git. Does your README need to tell people to <code>sudo apt install git</code> and then walk them through configuring it so that they can <code>git clone</code> your repo?</p>

<p>Possibly! Who is your audience? If you've created a tool which is likely to be used by newbies who are just getting started with their first Raspberry Pi then, yeah, you probably will need to include that. Why? Because it will save you from receiving a lot of repeated questions and frustrated emails.</p>

<p>OK, but most developers will have <code>gcc</code> installed, right? Maybe! But it doesn't do any harm to include it in a long list of <code>apt get …</code> anyway, does it? Similarly, does everyone know how to upgrade to the very latest npm?</p>

<p>If your software is designed for people who are experienced computer touchers, don't fall into the trap of thinking that they know everything you do.  I find it best to assume people are intelligent but not experienced; it doesn't hurt to give <em>slightly</em> too much detail.</p>

<p>The best way to do this is to record <em>everything</em> you do after logging into the blank VM.</p>

<ol start="0">
<li>Restore the snapshot.</li>
<li>Log in.</li>
<li>Run all the commands you need to get your software working.</li>
<li>Once done, run <code>history -w history.txt</code>

<ul>
<li>That will print out <em>every</em> command you ran.</li>
</ul></li>
<li>Copy that text into your README.</li>
</ol>

<p>Hey presto! You now have README instructions which have been tested to work. Even on the most bare-bones machine, you can say that your README will allow the user to get started with your software with the minimum amount of head-scratching.</p>

<p>Now, this isn't foolproof. Maybe the user has an ancient operating system running on obsolete hardware which is constantly bombarded by cosmic rays. But at least this way your issues won't be clogged up by people saying their install failed because <code>lib-foobar</code> wasn't available or that <code>./configure</code> had fatal errors.</p>

<p>A great example is <a href="https://github.com/xiph/opus/blob/main/README">the Opus Codec README</a>.  I went into a fresh Ubuntu machine, followed the readme, ran the above history command, and got this:</p>

<pre><code class="language-_">sudo apt-get install git autoconf automake libtool gcc make
git clone https://gitlab.xiph.org/xiph/opus.git
cd opus
./autogen.sh
./configure
make
sudo make install
</code></pre>

<p>Everything worked! There was no missing step or having to dive into another README to figure out how to bind flarg 6.9 with schnorp-unstable.</p>

<p>So that's my plea to you, dear developer friend. Make sure your README contains both the necessary <em>and</em> sufficient information required to install your software. For your sake, as much as mine!</p>

<h2 id="wait-you-didnt-follow-your-own-advice"><a href="https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/#wait-you-didnt-follow-your-own-advice">Wait! You didn't follow your own advice!</a></h2>

<p>You're quite right. Feel free to send a pull request to correct this post - as I shall be doing with any unhelpful READMEs I find along the way.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=62224&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/10/how-to-actually-test-your-readme/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Free Software as in Free House]]></title>
		<link>https://shkspr.mobi/blog/2021/12/free-software-as-in-free-house/</link>
					<comments>https://shkspr.mobi/blog/2021/12/free-software-as-in-free-house/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 22 Dec 2021 12:34:17 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Free Software]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[oss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=41362</guid>

					<description><![CDATA[Much like a Tesla, all analogies break down eventually.  As many many many people have said - free software is free, in much the same way as a free puppy is free.  I prefer to think of it as being free just like being given a free house is free.  Imagine that! Being given a free house would solve so many immediate problems. You&#039;d have shelter, warmth, an administrative address, and a stake in the …]]></description>
										<content:encoded><![CDATA[<p>Much like a Tesla, all analogies break down eventually.</p>

<p>As <a href="https://www.zdnet.com/article/open-source-is-free-like-a-puppy-is-free-says-sun-boss-3039202713/">many</a> <a href="http://www.hanselman.com/blog/sandcastle-microsoft-ctp-of-a-help-chm-file-generator-on-the-tails-of-the-death-of-ndoc">many</a> <a href="https://www.youtube.com/watch?v=UIDb6VBO9os">many</a> people have said - free software is free, in much the same way as a free puppy is free.</p>

<p>I prefer to think of it as being free just like being given a free house is free.</p>

<p>Imagine that! Being given a free house would solve so many immediate problems. You'd have shelter, warmth, an administrative address, and a stake in the local community. All for free! Brilliant!</p>

<p>Of course, your furniture isn't going to quite fit. So let's knock down that wall. Pretty sure it isn't load bearing. Those creaking noises add character.</p>

<p>And, ugh! This wallpaper. Let's steam that off and give everything a nice coat of paint. Lovely. OK, we didn't have time to paint everything, so some walls are a different colour from others in the same room. We'll get used to it.</p>

<p>For some reason, the toilet is inside the shower. I'm sure that made sense for the old owner, but not for us. Let's re-do the bathroom.  In doing so, we find that all the plumbing is a bit rotten. Can we live with that? Nah, let's unblock what we can, replace some of it, and do the rest when we have time. For some reason hot water now comes out of the stove. We'll put a sign up warning people.</p>

<p>Everyone has smart lights - we should too! But, it turns out that our wiring used the <em>old</em> standard. And we can't find anyone willing to work on it. How hard can rewiring a house be? Sure, we got a few shocks, and the whole house buzzes with static, and the new bulbs burn out quite frequently, but we added smart-tech to this old property!</p>

<p>We asked people in the local community if they could help with any of this - but they were <em>so rude!</em>  OK, we weren't offering any money, and we kept asking daft questions, but there was no need to tell us to RTFM.</p>

<p>One prominent member of the community sent us loads of abuse. Apparently they can't be removed because no one else is as good as them at fixing all the broken windows and, besides, a code of conduct would add unnecessary drama.</p>

<p>Anyway, it turns out that the locks on the doors used the default key and we never bothered to change them. Someone broke in and stole all our stuff. And left surveillance cameras in the bedroom.</p>

<hr>

<p>All analogies break down eventually - and I think I've stretched this one far enough.</p>

<p>Open source is a gift <em>and</em> a burden.  If you just want to use something like Firefox as an end consumer, it is great. If you want to use something like WordPress, you're getting closer to free-house territory.  Integrating a complex ecosystem of intertwined libraries into your existing systems is full-blown free-house territory.</p>

<p>There are no clear borders here - just a way of thinking about the cost of free.</p>

<p>You can't escape these problems by paying for a house. Even designing and building your own property comes with its own challenges.</p>

<p>You always need to understand the cost of a free gift.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=41362&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/12/free-software-as-in-free-house/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
