<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>~elly/blog</title>
  <link href="https://elly.town/d/blog/"/>
  <link rel="self" href="https://elly.town/feed.xml"/>
  <updated>2025-09-17T00:00:00Z</updated>
  <author><name>elly</name></author>
  <id>urn:uuid:58e1c539-4056-4502-9445-29d725e4df97</id>
  <entry>
    <content src="https://elly.town/d/blog/2025-09-17-advent-of-code-libraries.html" type="text/html"/>
    <id>urn:uuid:caf3d982-2bdd-6f67-198d-6b0f4da99597</id>
    <link href="https://elly.town/d/blog/2025-09-17-advent-of-code-libraries.html"/>
    <summary>The libraries I built for Advent of Code</summary>
    <title>Advent of Code: Libraries</title>
    <updated>2025-09-17T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2025-09-01-advent-of-code-500.html" type="text/html"/>
    <id>urn:uuid:b0423f4c-840a-c6fb-4a75-48246e19e250</id>
    <link href="https://elly.town/d/blog/2025-09-01-advent-of-code-500.html"/>
    <summary>My experiences solving every Advent of Code challenge released so far</summary>
    <title>Advent of Code: 500 Stars</title>
    <updated>2025-09-01T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2025-05-17-reservoir-sampling.txt" type="text/plain"/>
    <id>urn:uuid:d23088e0-e9f3-60a2-ab15-12ef7c4ae175</id>
    <link href="https://elly.town/d/blog/2025-05-17-reservoir-sampling.txt"/>
    <summary>How to choose a random subset of a large set efficiently</summary>
    <title>Reservoir sampling</title>
    <updated>2025-05-17T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2024-03-08-x509-certificates.txt" type="text/plain"/>
    <id>urn:uuid:2c43eb19-7261-4a41-9225-4dc421f9a1b7</id>
    <link href="https://elly.town/d/blog/2024-03-08-x509-certificates.txt"/>
    <summary>How do X.509 certificates actually work, and what's actually inside them?</summary>
    <title>X.509 Certificates</title>
    <updated>2024-03-08T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2023-10-20-fossil.html" type="text/html"/>
    <id>urn:uuid:65f72cdc-49ee-44d3-977b-6a55380ca74f</id>
    <link href="https://elly.town/d/blog/2023-10-20-fossil.html"/>
    <summary>An introduction to the fossil vcs, and some comparison to git</summary>
    <title>Fossil</title>
    <updated>2023-10-20T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2023-04-07-macaroon-mac-chaining.txt" type="text/plain"/>
    <id>urn:uuid:da506b94-5c8d-4c7e-8ca5-d2061c5893ce</id>
    <link href="https://elly.town/d/blog/2023-04-07-macaroon-mac-chaining.txt"/>
    <summary>A cryptographic technique to create constrainable auth tokens</summary>
    <title>Macaroon MAC Chaining</title>
    <updated>2023-04-07T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2023-02-20-parser-combinators.txt" type="text/plain"/>
    <id>urn:uuid:17970ff6-5f9e-4cdc-8740-dfada20a04b7</id>
    <link href="https://elly.town/d/blog/2023-02-20-parser-combinators.txt"/>
    <summary>A neat technique for building parsers out of smaller parsers</summary>
    <title>Parser Combinators</title>
    <updated>2023-02-20T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-12-30-rogue-source-tour.txt" type="text/plain"/>
    <id>urn:uuid:fa0742fc-78c5-441f-aead-76a937055caf</id>
    <link href="https://elly.town/d/blog/2022-12-30-rogue-source-tour.txt"/>
    <summary>A quick tour through the source of rogue(1), one of the classic Unix games</summary>
    <title>Rogue Source Tour</title>
    <updated>2022-12-30T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-12-28-binary-transparency.txt" type="text/plain"/>
    <id>urn:uuid:a0587479-5c8e-46e6-933d-0a4def188776</id>
    <link href="https://elly.town/d/blog/2022-12-28-binary-transparency.txt"/>
    <summary>A technique for shipping binaries which are provably derived from specific source trees</summary>
    <title>Binary Transparency</title>
    <updated>2022-12-28T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-12-25-fennel-for-advent.txt" type="text/plain"/>
    <id>urn:uuid:f7ebd45d-24a6-4c50-bd86-b9d703e1bc80</id>
    <link href="https://elly.town/d/blog/2022-12-25-fennel-for-advent.txt"/>
    <summary>Experiences doing Advent of Code 2022 in Fennel, a tiny Lisp that compiles to Lua</summary>
    <title>Fennel for Advent</title>
    <updated>2022-12-25T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-10-31-packaging-for-alpine.txt" type="text/plain"/>
    <id>urn:uuid:c56810ef-16f4-46a8-96fd-8a7c2d5a60d0</id>
    <link href="https://elly.town/d/blog/2022-10-31-packaging-for-alpine.txt"/>
    <summary>My experiences creating and publishing my first package for Alpine Linux</summary>
    <title>Packaging for Alpine</title>
    <updated>2022-10-31T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-10-20-alpine-framework.txt" type="text/plain"/>
    <id>urn:uuid:1036d6de-674b-4008-b094-d95da0b6cd14</id>
    <link href="https://elly.town/d/blog/2022-10-20-alpine-framework.txt"/>
    <summary>My experiences using Alpine Linux on an 11th gen Framework laptop</summary>
    <title>Alpine on Framework</title>
    <updated>2022-10-20T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-10-09-lambda-calculus.txt" type="text/plain"/>
    <id>urn:uuid:d487d730-dc30-4010-9aca-d00762b0b08c</id>
    <link href="https://elly.town/d/blog/2022-10-09-lambda-calculus.txt"/>
    <summary>An introduction to the lambda calculus, given as a Scheme program</summary>
    <title>Lambda Calculus</title>
    <updated>2022-10-09T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-09-30-struct-member-naming-history.txt" type="text/plain"/>
    <id>urn:uuid:7573b7e2-a564-4301-8e25-fd261a5421a6</id>
    <link href="https://elly.town/d/blog/2022-09-30-struct-member-naming-history.txt"/>
    <summary>Why do some libc structs have prefixes on all their names?</summary>
    <title>Struct Member Naming History</title>
    <updated>2022-09-30T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-09-15-general-purpose-macrogenerator.txt" type="text/plain"/>
    <id>urn:uuid:2f258466-e6b6-4f3d-b4a9-68c75dc59901</id>
    <link href="https://elly.town/d/blog/2022-09-15-general-purpose-macrogenerator.txt"/>
    <summary>A rewrite of the historic GPM in C, slightly touching on differences between C and CPL</summary>
    <title>General Purpose Macrogenerator</title>
    <updated>2022-09-15T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-09-14-hare-first-impressions.txt" type="text/plain"/>
    <id>urn:uuid:810a455a-efb4-41dc-b75e-24ed3fd2fa0d</id>
    <link href="https://elly.town/d/blog/2022-09-14-hare-first-impressions.txt"/>
    <summary>Trying out the Hare programming language</summary>
    <title>Hare First Impressions</title>
    <updated>2022-09-14T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-09-01-doing-it-right.txt" type="text/plain"/>
    <id>urn:uuid:7ca3e7cd-cf54-4581-a482-e653bde5e9b2</id>
    <link href="https://elly.town/d/blog/2022-09-01-doing-it-right.txt"/>
    <summary>Some thoughts on protecting your most important data, and how I do it</summary>
    <title>Doing It Right: Passwords, Keys, and Backups</title>
    <updated>2022-09-01T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-05-05-jit.txt" type="text/plain"/>
    <id>urn:uuid:966fe25c-2bbb-45e4-bebb-7a14e88338e6</id>
    <link href="https://elly.town/d/blog/2022-05-05-jit.txt"/>
    <summary>A worked example of how some types of JIT compilation work, in C</summary>
    <title>Just-In-Time Compilation</title>
    <updated>2022-05-05T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-04-18-irc-client-design-thoughts.txt" type="text/plain"/>
    <id>urn:uuid:648f3c52-0a80-41cf-82ec-2fcd6fa50b24</id>
    <link href="https://elly.town/d/blog/2022-04-18-irc-client-design-thoughts.txt"/>
    <summary>Some design notes on how to structure an IRC client with an eye towards persistent presence</summary>
    <title>IRC Client Design Thoughts</title>
    <updated>2022-04-18T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-02-09-mixminion.txt" type="text/plain"/>
    <id>urn:uuid:6a0469a7-7e8f-455e-9217-237dcf7b84cd</id>
    <link href="https://elly.town/d/blog/2022-02-09-mixminion.txt"/>
    <summary>An overview of email anonymization tools and attacks against them</summary>
    <title>Cipherpunks, Mixmaster, and Mixminion: Anonymous Email</title>
    <updated>2022-02-09T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-02-01-a-psalm-for-the-wild-built.txt" type="text/plain"/>
    <id>urn:uuid:b6a4e893-0b42-4429-9bdc-a041d2fd986c</id>
    <link href="https://elly.town/d/blog/2022-02-01-a-psalm-for-the-wild-built.txt"/>
    <summary>A review of "A Psalm For The Wild-Built" by Becky Chambers</summary>
    <title>Book Review: A Psalm For The Wild-Built</title>
    <updated>2022-02-01T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-26-chacha20-amd64-assembly.txt" type="text/plain"/>
    <id>urn:uuid:147fb97a-48c5-4a8a-a4da-21f2bc01b15d</id>
    <link href="https://elly.town/d/blog/2022-01-26-chacha20-amd64-assembly.txt"/>
    <summary>An amd64 assembly of the core of the chacha20 stream cipher</summary>
    <title>The ChaCha20 Cipher Core</title>
    <updated>2022-01-26T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-24-the-ppm-image-format.txt" type="text/plain"/>
    <id>urn:uuid:a02d26cf-2049-4103-b5cb-3082225d4bb8</id>
    <link href="https://elly.town/d/blog/2022-01-24-the-ppm-image-format.txt"/>
    <summary>The world's simplest image format!</summary>
    <title>The PPM Image Format</title>
    <updated>2022-01-24T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-18-backups.txt" type="text/plain"/>
    <id>urn:uuid:35ffbaaa-542c-4d67-aeff-4f3df7889f0c</id>
    <link href="https://elly.town/d/blog/2022-01-18-backups.txt"/>
    <summary>How I make backups of my systems, 2022 edition</summary>
    <title>Backups</title>
    <updated>2022-01-18T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-13-shellballs-and-self-extractors.txt" type="text/plain"/>
    <id>urn:uuid:377668d4-5f53-40b6-9c7b-5c49144db8c9</id>
    <link href="https://elly.town/d/blog/2022-01-13-shellballs-and-self-extractors.txt"/>
    <summary>How self-extracting shell tarballs work and why they exist</summary>
    <title>Shellballs and self-extractors</title>
    <updated>2022-01-13T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-05-m4.txt" type="text/plain"/>
    <id>urn:uuid:b6c57535-a880-4faa-be8f-5236d8e611b3</id>
    <link href="https://elly.town/d/blog/2022-01-05-m4.txt"/>
    <summary>A historical overview of the m4(1) macro language</summary>
    <title>m4</title>
    <updated>2022-01-05T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-03-tarballs.txt" type="text/plain"/>
    <id>urn:uuid:73bee03c-6d42-4ef7-802f-ea81c10ff377</id>
    <link href="https://elly.town/d/blog/2022-01-03-tarballs.txt"/>
    <summary>History and design of the tar(1) file format</summary>
    <title>Tarballs</title>
    <updated>2022-01-03T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-02-whence-autoconf.txt" type="text/plain"/>
    <id>urn:uuid:ed550a85-83e9-43a3-8aff-96543d8ef925</id>
    <link href="https://elly.town/d/blog/2022-01-02-whence-autoconf.txt"/>
    <summary>Where exactly did autotools come from, and what were the people who created it thinking?</summary>
    <title>Whence Autotools?</title>
    <updated>2022-01-02T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2022-01-01-constant-time-ops.txt" type="text/plain"/>
    <id>urn:uuid:2df192ce-3463-4e15-9951-72e39285da26</id>
    <link href="https://elly.town/d/blog/2022-01-01-constant-time-ops.txt"/>
    <summary>In cryptography, what are constant-time operations and why do they matter?</summary>
    <title>Constant-Time Operations</title>
    <updated>2022-01-01T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-12-31-shunting-yard-algorithm.txt" type="text/plain"/>
    <id>urn:uuid:eaaf9aab-46f3-468f-b74c-43257a18e7ff</id>
    <link href="https://elly.town/d/blog/2021-12-31-shunting-yard-algorithm.txt"/>
    <summary>An algorithm for doing precedence-aware parsing of mathematical expressions into a sequence of stack ops in a single pass</summary>
    <title>The Shunting-Yard Algorithm</title>
    <updated>2021-12-31T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-12-30-boyer-moore.txt" type="text/plain"/>
    <id>urn:uuid:cc236173-19de-448b-b0ba-ef912e609ce0</id>
    <link href="https://elly.town/d/blog/2021-12-30-boyer-moore.txt"/>
    <summary>A fast algorithm for finding substring matches, implemented in C</summary>
    <title>The Boyer-Moore String Search Algorithm</title>
    <updated>2021-12-30T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-12-29-instruction-encoding.txt" type="text/plain"/>
    <id>urn:uuid:8f7f77a8-e66f-4d9b-b87d-9d02ebb6e456</id>
    <link href="https://elly.town/d/blog/2021-12-29-instruction-encoding.txt"/>
    <summary>How instruction encoding and decoding works in hardware and software</summary>
    <title>Virtual Machines, Part 1: Instruction Encoding</title>
    <updated>2021-12-29T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-12-28-length-extension-attacks.txt" type="text/plain"/>
    <id>urn:uuid:c477f106-2c98-45f5-a51d-14495ac36716</id>
    <link href="https://elly.town/d/blog/2021-12-28-length-extension-attacks.txt"/>
    <summary>How length-extension attacks work against Merkle-Damgard hash functions</summary>
    <title>Length Extension Attacks</title>
    <updated>2021-12-28T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-12-24-virtual-machines-0.txt" type="text/plain"/>
    <id>urn:uuid:c58cc95f-7349-47b4-b80d-c11e01e22583</id>
    <link href="https://elly.town/d/blog/2021-12-24-virtual-machines-0.txt"/>
    <summary>What virtual machines are, how they work, and a worked example of one in C.</summary>
    <title>Virtual Machines, Part 0</title>
    <updated>2021-12-24T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-10-06-homedir.txt" type="text/plain"/>
    <id>urn:uuid:b26c34b7-958c-4216-a3b5-ade15a23e52a</id>
    <link href="https://elly.town/d/blog/2021-10-06-homedir.txt"/>
    <summary>How the subdirectories in my home directory are laid out and why</summary>
    <title>My Homedir Layout</title>
    <updated>2021-10-06T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2021-06-01-pinebook.txt" type="text/plain"/>
    <id>urn:uuid:da8efd0e-173e-459a-bbf9-fa601f64ea9b</id>
    <link href="https://elly.town/d/blog/2021-06-01-pinebook.txt"/>
    <summary>Some notes from getting my Pinebook Pro set up</summary>
    <title>Pinebook</title>
    <updated>2021-06-01T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2020-09-12-merkle-trees.txt" type="text/plain"/>
    <id>urn:uuid:2e8cc582-67ec-4aee-aac5-8e716078f947</id>
    <link href="https://elly.town/d/blog/2020-09-12-merkle-trees.txt"/>
    <summary>A data structure (a tree of hashes) to allow for efficient validation of parts of a huge data set.</summary>
    <title>Merkle Trees</title>
    <updated>2020-09-12T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2020-09-12-lamport-signatures.txt" type="text/plain"/>
    <id>urn:uuid:4a8bf736-67e9-4cda-af03-77f350ea4f8b</id>
    <link href="https://elly.town/d/blog/2020-09-12-lamport-signatures.txt"/>
    <summary>A way to use trees of hashes to produce a simple, post-quantum signature scheme</summary>
    <title>Lamport Signatures</title>
    <updated>2020-09-12T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2020-09-10-broadcast-buffers.txt" type="text/plain"/>
    <id>urn:uuid:ddc052a7-b834-4b42-8445-d76698c0958a</id>
    <link href="https://elly.town/d/blog/2020-09-10-broadcast-buffers.txt"/>
    <summary>A data structure for handling buffered messages being fanned out to many clients</summary>
    <title>Broadcast Buffers</title>
    <updated>2020-09-10T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2020-09-07-boring-protocols.txt" type="text/plain"/>
    <id>urn:uuid:136f5f04-03bd-4dc3-aadf-4564811eeb76</id>
    <link href="https://elly.town/d/blog/2020-09-07-boring-protocols.txt"/>
    <summary>What makes protocols "boring", and why is boring-ness desirable?</summary>
    <title>Boring Protocols</title>
    <updated>2020-09-07T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2019-11-16-cxx-static-ctor-register.txt" type="text/plain"/>
    <id>urn:uuid:51661f3a-c40f-4417-8d5c-8380afb01005</id>
    <link href="https://elly.town/d/blog/2019-11-16-cxx-static-ctor-register.txt"/>
    <summary>A way to register members of a set (modules, etc) at program startup time in C++ without needing to fill out a big table at compile time</summary>
    <title>The C++ static constructor registration trick</title>
    <updated>2019-11-16T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2019-11-15-linda-tuple-spaces.txt" type="text/plain"/>
    <id>urn:uuid:0a802f02-d4df-442d-83c4-64fa1360db61</id>
    <link href="https://elly.town/d/blog/2019-11-15-linda-tuple-spaces.txt"/>
    <summary>A cool data structure for distributed programming</summary>
    <title>Linda Tuple Spaces</title>
    <updated>2019-11-15T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2015-10-03-ed-tutorial.txt" type="text/plain"/>
    <id>urn:uuid:534622fc-f60d-4e69-a41d-198d01ad77b6</id>
    <link href="https://elly.town/d/blog/2015-10-03-ed-tutorial.txt"/>
    <summary>How to use /bin/ed!</summary>
    <title>Using The ed(1) Text Editor</title>
    <updated>2015-10-03T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2015-09-29-how-to-get-along-with-people.txt" type="text/plain"/>
    <id>urn:uuid:e84f5be7-d8cb-4320-a787-99cd175cd047</id>
    <link href="https://elly.town/d/blog/2015-09-29-how-to-get-along-with-people.txt"/>
    <summary>Just a bit of life advice stolen from Ann Landers.</summary>
    <title>Rules For Getting Along With Others</title>
    <updated>2015-09-29T00:00:00Z</updated>
  </entry>
  <entry>
    <content src="https://elly.town/d/blog/2015-05-18-writing-a-linux-userland.txt" type="text/plain"/>
    <id>urn:uuid:e6cb57aa-5e41-4ce6-8ab5-8a61206ae6ae</id>
    <link href="https://elly.town/d/blog/2015-05-18-writing-a-linux-userland.txt"/>
    <summary>What the main components of a rudimentary Unix userland are and how to write them in C.</summary>
    <title>Writing a Unix Userland</title>
    <updated>2015-05-18T00:00:00Z</updated>
  </entry>
</feed>
