Tony Finch – link log
2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 latest
-
2023‑12‑31:
How I forked SteamOS for my living room PC.
-
2023‑12‑30:
Git commit signing is kinda wack.
-
2023‑12‑28:
The heart of a language server.
-
2023‑12‑27:
How America turned the tide in the cockroach wars.
-
2023‑12‑27:
A national evil: how iodized salt banished the curse of the goitre from Switzerland.
-
2023‑12‑26:
Fixing the TPM: hardware security modules done right.
-
2023‑12‑26:
What is a parser mismatch vulnerability?
-
2023‑12‑26:
rscss: a reasonable system for CSS stylesheet structure.
-
2023‑12‑26:
Lotus 1-2-3 for Linux.
-
2023‑12‑26:
Reptar: an Intel x86 microcode bug.
-
2023‑12‑21:
How to find secure hash collisions.
-
2023‑12‑17:
Lessons from implementing the Hurl programming language.
-
2023‑12‑16:
Why aren't we SIEVE-ing? A new cache eviction algorithm.
-
2023‑12‑15:
Forcy McForceFace: building a keyboard switch force tester out of an old 3D printer.
-
2023‑12‑13:
Unauthenticated Bluetooth keystroke-injection in Android, Linux, macOS, and iOS.
-
2023‑12‑11:
How many lines of C it takes to execute a + b in Python.
-
2023‑12‑11:
Compiling to categories.
-
2023‑12‑11:
Cutting out continuations.
-
2023‑12‑10:
Lambda to SKI, semantically.
-
2023‑12‑08:
A brief history of keyboard encoding.
-
2023‑12‑05:
A branchless quicksort partition algorithm.
-
2023‑12‑05:
That's FAR-out, man: a kernel infoleak in Mac OS xnu.
-
2023‑12‑05:
Stop stealing sheep, and find out how typography works.
-
2023‑12‑05:
HTML: The Programming Language.
-
2023‑12‑04:
You don't need JavaScript for that.
-
2023‑12‑03:
Monocypher 4: the clean break.
-
2023‑11‑29:
Why is Rust slower to read a file than Python?
-
2023‑11‑29:
Destructing trees safely and cheaply.
-
2023‑11‑28:
It's About Time! Accurate clocks in distributed systems.
-
2023‑11‑27:
The largest number representable in 64 bits.
-
2023‑11‑24:
FullControl: unconstrained gcode design for 3D printers.
-
2023‑11‑23:
Wasmtime and Cranelift in 2023.
-
2023‑11‑23:
Commercial flights driven off course by GPS spoofing attacks.
-
2023‑11‑22:
Why does the moon change size when you snipe it in GTA?
-
2023‑11‑21:
How I (kind of) killed Mercurial at Mozilla.
-
2023‑11‑21:
Lessons from METAFONT.
-
2023‑11‑21:
Drawing diagrams for TeX with MetaPost.
-
2023‑11‑20:
A close encounter with false sharing in Rust.
-
2023‑11‑20:
Friends don't let friends make bad graphs.
-
2023‑11‑20:
setenv() is not thread safe and C doesn't want to fix it.
-
2023‑11‑19:
Checking Rust crate semver stability in the presence of doc(hidden) items.
-
2023‑11‑17:
Oops! We Automated Bullshit.
-
2023‑11‑17:
Why you need a "WTF notebook".
-
2023‑11‑16:
Can your static type system handle linear algebra?
-
2023‑11‑16:
C++ std::source_location is broken.
-
2023‑11‑16:
We don’t do DST at this company.
-
2023‑11‑16:
A subtle Python SIGPIPE bug.
-
2023‑11‑15:
Popcount walks: next, previous, toward and nearest.
-
2023‑11‑14:
Let’s be real about dependencies.
-
2023‑11‑14:
Replacing HLS/DASH with Media over QUIC.
-
2023‑11‑13:
37 is the median value for the second prime factor of an integer.
-
2023‑11‑12:
A quick look at register allocation with destination-driven code generation.
-
2023‑11‑12:
Space Invaders street art mosaics.
-
2023‑11‑09:
Interesting JavaScript bugs caught by no-constant-binary-expression in ESLint.
-
2023‑11‑08:
Surprising facts about new CSS selectors.
-
2023‑11‑07:
Reducing Raspberry Pi 5's power consumption by 140x.
-
2023‑11‑07:
Can solar and wind power Britain? An update of David MacKay’s numbers.
-
2023‑11‑07:
Jezebel and the question of women’s anger.
-
2023‑11‑05:
A proposed fix for C/C++ relaxed atomics in practice.
-
2023‑11‑05:
Ungrammar in Go and resilient parsing.
-
2023‑11‑03:
Avoiding fallback and cold paths.
-
2023‑10‑26:
Technical documentation for Citus distributed PostgreSQL.
-
2023‑10‑23:
Y2038: why Steam started picking a random font.
-
2023‑10‑23:
Protomaps: an open source map of the world, deployable as a single static file.
-
2023‑10‑21:
Electromechanical refreshable Braille module.
-
2023‑10‑21:
The not-so-glamourous origins of standard railway track gauge.
-
2023‑10‑21:
Analyzing data 180,000x faster with Rust.
-
2023‑10‑20:
How to mitigate the Hetzner/Linode XMPP.ru MitM attack.
-
2023‑10‑20:
TLS MITM attack against a Russian XMPP / Jabber service.
-
2023‑10‑20:
ANSI terminal security in 2023 and finding 10 CVEs.
-
2023‑10‑20:
Mandelbrot deep zoom theory and practice.
-
2023‑10‑19:
Stop your (business rules) engines!
-
2023‑10‑19:
The road to hell is paved with good intentions and C++ modules.
-
2023‑10‑17:
Higher quality random floats.
-
2023‑10‑15:
Faster compile times from simpler dependency graphs in Rust.
-
2023‑10‑14:
Open Props: sub-atomic CSS.
-
2023‑10‑13:
Thumb calendar.
-
2023‑10‑13:
Conical Slicing: A different angle of 3D printing.
-
2023‑10‑12:
LSP could have been better.
-
2023‑10‑10:
Text showdown: gap buffers vs ropes.
-
2023‑10‑10:
ECC RAM on AMD Ryzen 7000 desktop CPUs.
-
2023‑10‑09:
UK postal address oddities.
-
2023‑10‑05:
ROCkN: Providing GPS-quality timing accuracy with portable optical atomic clocks.
-
2023‑10‑05:
Report ITU-R TF.2511-0 (10/2022): Content and structure of time signals to be disseminated by radiocommunication systems and various aspects of current and potential future reference time scales, including their impacts and applications in radiocommunication.
-
2023‑10‑05:
The Terminal Escapes: Engineering unexpected execution from command line interfaces.
-
2023‑10‑03:
The 300% production problem.
-
2023‑10‑03:
A whirlwind tour of arm64 NEON vector instructions.
-
2023‑10‑03:
x86 amd64 SIMD instruction list: SSE to AVX512.
-
2023‑10‑03:
Arm64 SIMD instruction list: SVE instructions.
-
2023‑10‑02:
32 MiB working set on a 64 GiB machine.
-
2023‑10‑02:
The Marvin attack: Bleichenbacher returns, again.
-
2023‑09‑29:
Who really invented the alphabet?
-
2023‑09‑29:
A plot of all objects in the universe.
-
2023‑09‑27:
ARM LDM and STM are Turing complete.
-
2023‑09‑25:
The invisible problem with editing text on phones.
-
2023‑09‑24:
Introducing geometric algebra to software developers: a computational thinking approach.
-
2023‑09‑23:
Polonius revisited, part 1.
-
2023‑09‑21:
Speeding up the JavaScript ecosystem: polyfills gone rogue.
-
2023‑09‑19:
Making Gaussian Splats smaller.
-
2023‑09‑19:
OPK, Open Programmatic Keycap: a CadQuery model for spherical top keycaps.
-
2023‑09‑19:
mlego: DIY mechanical keyboards using LEGO enclosures.
-
2023‑09‑19:
EPDiy: an ESP32-based driver board for e-Paper / E-ink displays.
-
2023‑09‑18:
Oglaf search index.
-
2023‑09‑18:
Resilient LL parsing tutorial.
-
2023‑09‑14:
Pagefind and URL search parameters.
-
2023‑09‑13:
George Gorton Machine Co engraver typefaces.
-
2023‑09‑12:
Hacking the Book8088 for better accuracy.
-
2023‑09‑12:
What’s the smallest variety of CHERI?
-
2023‑09‑11:
HDMI ISA graphics card for vintage PCs by improving the Graphics Gremlin.
-
2023‑09‑11:
Pure Wasm Life 2: optimizing webassembly and canvas with WebGL.
-
2023‑09‑11:
The Carrington Event of 1859 disrupted telegraph lines. A “Miyake Event” would be far worse.
-
2023‑09‑10:
Adding Wi-Fi to the Macintosh Portable.
-
2023‑09‑09:
Black-box concurrent data structures for NUMA architectures.
-
2023‑09‑09:
Good performance is not just big O.
-
2023‑09‑02:
Spoofing certificates with MD5 collisions in 2022.
-
2023‑09‑01:
A deep dive into Single Pair Ethernet.
-
2023‑08‑31:
Ad-hoc polymorphism erodes type-safety.
-
2023‑08‑31:
Co-dfns versus BQN's implementation.
-
2023‑08‑31:
The mystery of the Bloomfield bridge.
-
2023‑08‑29:
Grave flaws in BGP error handling.
-
2023‑08‑26:
I made a Typewriter out of Drums!
-
2023‑08‑24:
FreeBSD on Firecracker.
-
2023‑08‑23:
ROMRAM: using QSPI RAM with RP2040's SSI in read-write mode.
-
2023‑08‑23:
USB HID device class definition.
-
2023‑08‑23:
USB HID usage tables.
-
2023‑08‑22:
Building and customizing a Kyria wireless ergonomic keyboard.
-
2023‑08‑22:
Normalcy bias: it's not cool to overreact.
-
2023‑08‑21:
Designing a PCB for the RP2040 Microcontroller | Microcontroller Tutorials
-
2023‑08‑21:
Flex without the flex: bending FR4 PCBs.
-
2023‑08‑21:
Normal incidents.
-
2023‑08‑18:
PolymurHash: a 64 bit universal hash function.
-
2023‑08‑13:
Symmetry in Chaos.
-
2023‑08‑13:
Virtualizing uxn.
-
2023‑08‑07:
Reverse Z in 3D graphics (and why it’s so awesome).
-
2023‑08‑06:
Why does libvirt support only 14 hot-plugged PCIe devices on x86-64?
-
2023‑08‑04:
The physics of readable code.
-
2023‑08‑02:
Why Python is terrible.
-
2023‑08‑02:
Akin's laws of spacecraft design.
-
2023‑08‑02:
MIT engineers create an energy-storing supercapacitor from cement and carbon black.
-
2023‑07‑31:
The Fibonacci matrix.
-
2023‑07‑31:
What John von Neumann really did at Los Alamos.
-
2023‑07‑30:
Workarounds for C11 _Generic().
-
2023‑07‑30:
Serverless functions post-mortem.
-
2023‑07‑29:
LPython: novel, fast, retargetable Python compiler.
-
2023‑07‑29:
Why is c the symbol for the speed of light?
-
2023‑07‑27:
The mind grenade, 50 years on.
-
2023‑07‑22:
Managing kitchen fruit flies with a Little Shop of Horrors.
-
2023‑07‑22:
Linear-time parser combinators.
-
2023‑07‑21:
HP-1973: an HP calculator emulator.
-
2023‑07‑19:
Local async executors should be the default in Rust.
-
2023‑07‑17:
Appreciating RFC 8927 JSON type definition.
-
2023‑07‑16:
Penrose: create beautiful diagrams by typing notation in plain text.
-
2023‑07‑11:
salty: Ed25519 for ARM microcontrollers.
-
2023‑07‑10:
Can a Rubik's Cube be brute-forced?
-
2023‑06‑26:
Ideal dimensions for PCB breakaway tabs.
-
2023‑06‑24:
No vehicles in the park: a game about content moderation.
-
2023‑06‑22:
57 different scripts descended from Egyptian hieroglyphs.
-
2023‑06‑09:
Monongahela: a design for a balanced ternary computer.
-
2023‑06‑06:
Wiio's laws of human communication
-
2023‑06‑04:
BRR: A new line drawing method for the cycle savvy.
-
2023‑06‑04:
Calculating position from raw GPS data.
-
2023‑05‑31:
Hacking my “smart” toothbrush.
-
2023‑05‑30:
Futex-likes on non-Linux systems.
-
2023‑05‑29:
ITU News Magazine: The future of Coordinated Universal Time.
-
2023‑05‑29:
SectorC: A C Compiler in 512 bytes.
-
2023‑05‑29:
Writing to the macOS clipboard the hard way.
-
2023‑05‑28:
Bcrypt at 25: a retrospective on password security.
-
2023‑05‑28:
The silent (r)evolution of SAT.
-
2023‑05‑23:
How to include Git version information in a Golang binary.
-
2023‑05‑23:
Unpacking 5 billion varints in only 4 billion CPU cycles.
-
2023‑05‑22:
Wrench: an embedded interpreter.
-
2023‑05‑19:
bilge: a bit fiddling proc macro for Rust.
-
2023‑05‑17:
Logs said it was DNS, it looked like DNS, it had to be DNS, it wasn't DNS.
-
2023‑05‑14:
rxv6: a Rust rewrite of MIT’S xv6 teaching OS.
-
2023‑05‑13:
Building a baseline JIT for Lua automatically.
-
2023‑05‑12:
PS-HTTP: a web server written in PostScript.
-
2023‑05‑11:
Building an anycast secondary DNS service.
-
2023‑05‑11:
Building the Micro Mirror free software CDN.
-
2023‑05‑10:
Semantics and scheduling for machine knitting compilers.
-
2023‑05‑09:
OmniPaxos: replicated state machine and consistent distributed log in Rust.
-
2023‑05‑08:
On custom-width integer types.
-
2023‑05‑07:
Mysteries of the Griffin iMate and the Apple Extended Keyboard II.
-
2023‑05‑07:
The tale of -mrtd in GCC and Clang.
-
2023‑05‑07:
Prolly trees: Merklizing the key/value store for fun and profit.
-
2023‑05‑07:
On numbering hegemonies and namespace monopolies.
-
2023‑05‑06:
The Austral programming language. (linear types and capability security)
-
2023‑05‑05:
Science Fiction Movie Lettering
-
2023‑05‑03:
I want to talk about WebGPU.
-
2023‑05‑02:
Flattening ASTs with arena allocation.
-
2023‑05‑01:
A mirror for Rust: compile-time reflection.
-
2023‑05‑01:
First clean water, now clean air.
-
2023‑05‑01:
Perfect hashing for strings with PEXT.
-
2023‑04‑30:
Basics of space flight: orbital mechanics.
-
2023‑04‑29:
gefs: a good enough filesystem for Plan 9.
-
2023‑04‑26:
You could have invented futexes.
-
2023‑04‑22:
The magic of DC-DC voltage conversion.
-
2023‑04‑22:
Escheresque parquet deformations of an aperiodic monotile.
-
2023‑04‑21:
n2: an alternative ninja implemrntation in Rust.
-
2023‑04‑16:
The time Bell Labs brought the Statue of Liberty under its roof (literally).
-
2023‑04‑16:
Registration desk process engineering at a furry convention.
-
2023‑04‑16:
Free Join: unifying worst-case optimal and traditional joins.
-
2023‑04‑13:
Mac keyboard layout configuration with hidutil.
-
2023‑04‑10:
Night of the living brain fog, or how I hacked my sleep apnea better thanks to open source software.
-
2023‑04‑10:
Can you trust a compiler to optimize (even vectorize) your code?
-
2023‑04‑10:
nsss: a secure NSS-like implementation for static linking.
-
2023‑04‑10:
Using RP2040 PIO to drive a poorly-designed display.
-
2023‑04‑09:
Modular errors in Rust.
-
2023‑04‑08:
Database “sharding” came from Ultima Online?
-
2023‑04‑07:
The longest straight line in Great Britain (without crossing a public road).
-
2023‑04‑06:
CAN Injection: keyless car theft.
-
2023‑03‑30:
Mozilla XUL layout is gone from Firefox.
-
2023‑03‑15:
Youtube2Webpage, if you much better from text than from videos.
-
2023‑03‑15:
Infra-red in-situ (IRIS) inspection of silicon.
-
2023‑03‑15:
No more DSLs: Implement and deploy a distributed system with a single program.
-
2023‑03‑14:
Generating aerial imagery with your iPhone’s LiDAR sensor.
-
2023‑03‑12:
How we knew space is a vacuum.
-
2023‑03‑10:
\Device\Afd: what makes async Rust and libuv work on Windows.
-
2023‑03‑09:
The Quest for Netflix on Asahi Linux.
-
2023‑03‑08:
The linguistic registers of Rust.
-
2023‑03‑08:
Historical notes on computer word and byte sizes.
-
2023‑03‑08:
How Discord stores trillions of messages.
-
2023‑03‑07:
How UC Davis medical school became remarkably diverse.
-
2023‑03‑07:
I made React Native JSON.parse() 2x faster.
-
2023‑03‑03:
Atkinson hyperlegible font.
-
2023‑02‑28:
HOTscript: higher-order TypeScript, a library for type-level madness.
-
2023‑02‑05:
The BNF converter.
-
2023‑02‑05:
Where is the most densely populated square kilometre in the UK?
-
2023‑02‑03:
Weird things I learned while writing an x86 emulator.
-
2023‑02‑01:
Surprises in the Rust JSON ecosystem.
-
2023‑01‑31:
Adding comments to your static blog with Mastodon.
-
2023‑01‑30:
Coloring for colorblindness.
-
2023‑01‑29:
The 12-bit rainbow palette.
-
2023‑01‑29:
Elektročas HH3: the most accurate pendulum clock on the planet.
-
2023‑01‑28:
C needs a new type qualifier: it’s time for null pointer safety.
-
2023‑01‑27:
Netheads vs. bellheads redux: the strange victory of SIP over the telephone network.
-
2023‑01‑27:
Reverse engineering the original Lytro lightfield camera.
-
2023‑01‑26:
What time is it on the Moon?
-
2023‑01‑25:
Do not taunt happy fun branch predictor.
-
2023‑01‑24:
Bounded flexible arrays in C.
-
2023‑01‑23:
Shaving cycles: faster log-linear bucketing.
-
2023‑01‑19:
Huge pages are a good idea.
-
2023‑01‑18:
XLR V3: Guinness world record holder for fastest quadcopter drone.
-
2023‑01‑17:
BetterDisplay: extra configuration options for macOS.
-
2023‑01‑08:
User-level implementations of RCU (read copy update).
-
2023‑01‑08:
The DIY scientist, the olympian, and the mutated gene.
-
2023‑01‑08:
Production Twitter on one machine?
-
2023‑01‑06:
A practical comparison of build and test speed between C++ and Rust.
-
2023‑01‑05:
Reflecting on transducers in Scheme.
-
2023‑01‑01:
How to get Xfinity Stream to work on Linux: a tale of Widevine, Chrome OS, and a patched glibc.
-
2023‑01‑01:
Better binary search in Haskell.