<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Joey Innes</title>
		<link>https://rmrf.uk/</link>
		<description>Recent content on Joey Innes</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Sun, 26 Jul 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://rmrf.uk/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Writing a panel-method solver in Zig</title>
				<link>https://rmrf.uk/cs/2026-07-26-writing-a-panel-method-solver-in-zig/</link>
				<pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2026-07-26-writing-a-panel-method-solver-in-zig/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been flying soft wings for years without really understanding the sections they&amp;rsquo;re built from. Paragliders, speedwings, kites — they all live or die on the shape of a slice through the wing, and I&amp;rsquo;ve mostly taken that shape on trust. So I&amp;rsquo;ve started building something to fix that: a simulation backend called &lt;strong&gt;Camber&lt;/strong&gt;, which takes a wing section, an angle, and an airspeed, and tells you what the air does about it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Elegance in Global Cooperation: Engineering Simplicity, Purity and Correctness</title>
				<link>https://rmrf.uk/reflections/2025-01-09-elegance-in-global-cooperation/</link>
				<pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/reflections/2025-01-09-elegance-in-global-cooperation/</guid>
				<description>&lt;p&gt;Today, after reading a good chunk of Serious Cryptography, by J. P. Aumasson, I was lamenting over the likeness of computer science and society, and the way that game theory and complexity theory are interlinked. Reflecting on my day&amp;rsquo;s study, and my view of the world in general, I found myself drawing many comparisons that seemed insightful.&lt;/p&gt;&#xA;&lt;p&gt;For example, the security of a given cryptographic scheme is in practice dependent on it&amp;rsquo;s understandability, for if an algorithm is difficult to understand, there is a high likelihood that it will be implemented poorly or misused. That is to say that the number of possible attack vectors scales with complexity.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Progress on the Peregrine HTTP server</title>
				<link>https://rmrf.uk/cs/2025-01-09-progress-on-peregrine/</link>
				<pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2025-01-09-progress-on-peregrine/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m implementing a HTTP server from scratch in Zig, as a fun way to learn the Zig systems programming language, and also to get more comfortable and familiar with some modern kernel features that make highly performant network IO possible.&lt;/p&gt;&#xA;&lt;p&gt;I started this project on the 24th December 2024, and within a couple of days, I had a bare-bones TCP server that could parse and respond to HTTP requests. Initially, I followed Karl Seguin&amp;rsquo;s excellent &lt;a href=&#34;https://www.openmymind.net/TCP-Server-In-Zig-Part-1-Single-Threaded/&#34;&gt;guide to creating a TCP server in Zig&lt;/a&gt;. If you&amp;rsquo;re interested in learning Zig, after solving some &lt;a href=&#34;https://codeberg.org/ziglings/exercises/&#34;&gt;Ziglings&lt;/a&gt;, I suggest that you look at Karl&amp;rsquo;s blog posts on Zig.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The beginning of project Peregrine - a bleeding fast HTTP server</title>
				<link>https://rmrf.uk/cs/2024-12-26-starting-peregrine/</link>
				<pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-12-26-starting-peregrine/</guid>
				<description>&lt;p&gt;If you&amp;rsquo;re very familiar with Zig, then you&amp;rsquo;ll know that the standard library HTTP server is not written to be highly performant.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/zigzap/zap&#34;&gt;Zap&lt;/a&gt; is an alternative. Zap is built on the fantastic &lt;a href=&#34;https://facil.io&#34;&gt;Facil.io&lt;/a&gt; networking library written in C.&lt;/p&gt;&#xA;&lt;p&gt;Now, while there are plenty of fast HTTP servers, at time of writing, I couldn&amp;rsquo;t find a production-ready high-performance HTTP server written purely in Zig. There is &lt;a href=&#34;https://github.com/karlseguin/http.zig&#34;&gt;http.zig&lt;/a&gt;, but according to Karl, the developer, it must sit behind a reverse-proxy because it&amp;rsquo;s not resilient to DoS attack.&lt;/p&gt;</description>
			</item>
			<item>
				<title>First thoughts on Zig</title>
				<link>https://rmrf.uk/cs/2024-12-23-zig-first-thoughts/</link>
				<pubDate>Mon, 23 Dec 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-12-23-zig-first-thoughts/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve done very litte systems programming. I wrote Conway&amp;rsquo;s Game of Life in C as a teenager. I also did a bit of assembly at GE Aviation Systems. A few years ago, I completed the Rust programming book, but struggled with the language beyond that, and never grew to love it.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m currently diving quite deep into systems programming in Zig. While there are many things I love about the language, namely it&amp;rsquo;s elegant approach to generics and meta-programming, I do feel that the language is lacking in some ways.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The relationship between turn radius and velocity</title>
				<link>https://rmrf.uk/going-fast/2024-07-10-turn-radius/</link>
				<pubDate>Wed, 10 Jul 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/going-fast/2024-07-10-turn-radius/</guid>
				<description>&lt;p&gt;R=(v^2)/a_c, where R is turn radius, v is velocity, and a_c is centripetal acceleration. Turn radius is proportional to the velocity squared.&lt;/p&gt;&#xA;&lt;p&gt;This means that for a given centripetal acceleration, doubling the speed results in a quadroupling of the turn radius. Therefore, higher speeds require wider turns.&lt;/p&gt;&#xA;&lt;p&gt;Applied to flight, for a given force of lift, doubling the speed results in 4x the turn radius. This is why you will very occasionally see me use brakes to turn, where the line is too tight to negotiate otherwise.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Leaving some projects unfinished is cruicial for maximising rate of learning</title>
				<link>https://rmrf.uk/reflections/2024-05-20-leaving-unfinished/</link>
				<pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/reflections/2024-05-20-leaving-unfinished/</guid>
				<description>&lt;p&gt;As I browse old works from venerable computer scientists, I often encounter brilliant yet unfinished projects.&lt;/p&gt;&#xA;&lt;p&gt;This led me to reflect on my own habbit of leaving personal projects unfinished. I see merit in occasionally parking ideas indefinitely. That is, if the real goal of any personal project is not to output a piece of work, but to acquire skills necessary for a future project, it follows that we must let it go once we see a bridge to the next phase of learning.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Comparing the performance of a de Bruijn sequence against a simple lookup table</title>
				<link>https://rmrf.uk/cs/2024-05-17-zerobitperf/</link>
				<pubDate>Fri, 17 May 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-05-17-zerobitperf/</guid>
				<description>&lt;p&gt;While optimising the naive proof-of-work algorithm in my dave protocol implementation, I compared the efficiency of some methods of counting the number of leading zero bits in a byte slice.&lt;/p&gt;&#xA;&lt;h1 id=&#34;approaches&#34;&gt;Approaches&lt;/h1&gt;&#xA;&lt;h2 id=&#34;1-naive-approach&#34;&gt;1. Naive approach&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nzerobit_1&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; []&lt;span style=&#34;color:#66d9ef&#34;&gt;byte&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;n&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Iterating over each byte in the given key, we use the bitwise AND operator &lt;code&gt;&amp;amp;&lt;/code&gt; to check if the &lt;code&gt;i&lt;/code&gt;-th bit of the byte is zero. The expression &lt;code&gt;1&amp;lt;&amp;lt;i&lt;/code&gt; creates a bitmask with only the &lt;code&gt;i&lt;/code&gt;-th bit set to 1, and the &lt;code&gt;&amp;amp;&lt;/code&gt; operator performs a bitwise AND operation between the byte and the bitmask. If the result is zero, it means that the &lt;code&gt;i&lt;/code&gt;-th bit is zero, and we increment &lt;code&gt;n&lt;/code&gt;. If the bit is set, we return the current value of &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Dave</title>
				<link>https://rmrf.uk/cs/2024-05-01-dave/</link>
				<pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-05-01-dave/</guid>
				<description>&lt;p&gt;EDIT: In September &amp;amp; October I made significant changes to the DHT, and so much of this article is out of date. I have not yet found time to update this article, and I&amp;rsquo;m not currently working on the project.&lt;/p&gt;&#xA;&lt;p&gt;So&amp;hellip; what am I doing? When I started this project (first commit 2024-04-05), I didn&amp;rsquo;t know exactly, beyond designing a peer-to-peer network application that disseminates information. Now my vision is finally becoming clear, and I&amp;rsquo;m able to describe it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>logd</title>
				<link>https://rmrf.uk/cs/2024-03-15-logd/</link>
				<pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-03-15-logd/</guid>
				<description>&lt;p&gt;Started ~2023-12&#xA;Real-time logging (tail &amp;amp; query) for virtually unlimited logs. A map of in-memory ring buffers. Built on UDP &amp;amp; homegrown ephemeral HMAC. Go std lib + Protobuf. Image is built from scratch (Linux kernel + app executable).&lt;/p&gt;&#xA;&lt;p&gt;2024-05:&#xA;Looking back, this was an enjoyable project to rediscover writing software. It&amp;rsquo;s amazing to return to something after a change of mind. A new mind has more fun, and is more productive. The same thing happened when I re-imagined speedflying after my spinal-cord injury. Some years after my recovery, I rediscovered a lost joy with a new mind.&lt;/p&gt;</description>
			</item>
			<item>
				<title>arpload</title>
				<link>https://rmrf.uk/cs/2024-03-09-arpload/</link>
				<pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/cs/2024-03-09-arpload/</guid>
				<description>&lt;h2 id=&#34;arweave-is-a-decentralized-storage-network-that-offers-a-unique-approach-to-data-storage&#34;&gt;Arweave is a decentralized storage network that offers a unique approach to data storage.&lt;/h2&gt;&#xA;&lt;p&gt;The network is designed to provide permanent information storage, where users pay a one-time fee to store data for at least 200 years, with the potential for it to last much longer, possibly forever.&lt;/p&gt;&#xA;&lt;p&gt;This is based on the assumption that the cost of storage will continue to decrease over time, and the initial fee paid by the uploader is invested in an endowment that accrues value, similar to interest in a bank account.&lt;/p&gt;</description>
			</item>
			<item>
				<title>First time in Madeira</title>
				<link>https://rmrf.uk/going-fast/2023-12-madeira/</link>
				<pubDate>Tue, 19 Dec 2023 00:00:00 +0000</pubDate>
				<guid>https://rmrf.uk/going-fast/2023-12-madeira/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://youtu.be/8CO--11bj_E&#34;&gt;https://youtu.be/8CO--11bj_E&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Flare have given me a Line 8 (cheers Beni), and they asked me if I&amp;rsquo;d kindly take it flying.&lt;/p&gt;&#xA;&lt;p&gt;Considering the Maritime alps, I looked further afield, to warmer climes. I almost went to Corsica.&lt;/p&gt;&#xA;&lt;p&gt;After hearing of the Bitcoin conference and arranging wirh a couple of friends to go together, I saw photos &amp;amp; videos of this incredible island.&lt;/p&gt;&#xA;&lt;p&gt;My imagination ran wild as I explored 3D maps, marvelling at the topography.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
