|Notes on using a single-person Mastodon server
|Behind "Hello World" on Linux
|What happens when you press a key in your terminal?
|Implementing a toy version of TLS 1.3
|How to use undocumented web APIs
|Some things about getaddrinfo that surprised me
|How to find a domain's authoritative nameservers
|How to use dig
|How do you tell if a problem is caused by DNS?
|Tools to explore BGP
|Quadratic algorithms are slow (and hashmaps are fast)
|How to look at the stack with gdb
|The OSI model doesn't map well to TCP/IP
|Why strace doesn't work in Docker
|Getting started with shaders: signed distance functions!
|"server" is hard to define
|How tracking pixels work
|How containers work: overlayfs
|SQL queries don't start with SELECT
|How does gdb call functions?
|How do groups work on Linux?
|Async IO on Linux: select, poll, and epoll
|Weird unix thing: 'cd //'
|What happens when you start a process on Linux?
|How does gdb work?
|Should you be scared of Unix signals?
|I conquered thread pools! For today, at least.
|Thread pools! How do I use them?
|What is "the stack"?
|Why Ruby’s Timeout is dangerous (and Thread.raise is terrifying)
|Why you should understand (a little) about TCP
|How the locate command works (and let's write a faster version in one minute!)
|How gzip uses Huffman coding
|Diving into concurrency: trying out mutexes and atomics
|How does SQLite work? Part 2: btrees! (or: disk seeks are slow don't do them!)
|How does SQLite work? Part 1: pages!
|How is a binary executable organized? Let's explore it!
|What happens if you write a TCP stack in Python?
|Diving into HDFS
|Three steps to learning GDB