See also Resume
See also Tech Links
- A Lisp interpreter in C: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
 - A Lisp interpreter in Python: 1, 1b, 2, 3
 - Hash table in C: 1, 2, 3, 4, 5
 - An alternative syntax for C: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
 mklexer.py: a lexer generator: 1, 2, 3, 4, 5- Towards structured editing of code: 1, 2, 3, 4, 5, 6
 - GridNotes: a half-step grid-based piano (iPad app)
 - hexon38: a custom 38-key keyboard
 - Picoroids: an Asteroids clone for PICO-8
 - A simple Snake game in C and SDL 1.2
 - A trivial sudoku solver: in C, in Python
 
- Scheme man pages (2/3)
 
- Ender 3 (dual) Z-axis lifting strength vs motor current (9/30)
 - "EZOFF": Easy offsets and keepouts for Marlin firmware (9/26)
 - Creality Ender 3 End-stop Capacitors (C5, C6, C7) (9/18)
 - Arduino LCD display for HP 34401A (8/7)
 - Simple Arduino-based Li-ion battery capacity tester (7/21)
 
- A first Cocoa app for OS X Tiger 10.4 using Xcode 3.1.4 (3/21)
 - Timeline of random tech (2/24)
 leopard.sh: a package manager for OS X Leopard (10.5) PowerPC, written in Bash (1/20)- Basic audio filters in C (1/16)
 
- Adding question-mark suffixed aliases for Common Lisp predicate functions (12/12)
 - Installing clisp on OS X Leopard / PowerPC (12/11)
 
- Test of EFI fuel pump at reduced voltage into flow restrictor (3/7)
 - 2018 Kawasaki KLX250 EFI Throttle Body (3/2)
 - eBay Universal EFI Fuel Pump (2/28)
 - Are 32-bit floats sufficient for micros-to-RPM conversion? (2/27)
 - Arduino PWM-based pressure regulator sketch (2/20)
 - Understanding the half-tone structure of musical scales (1/9)
 - GridNotes: a half-step grid-based piano (iPad app) (1/6)
 
- Cheap TO-220 heat sink performance measurements (10/3)
 - Zener+BJT constant current sinks and sources (10/2)
 
- Basic Zener diode voltage regulator (9/30)
 - A simple Snake game in C and SDL 1.2 (9/7)
 - Quick-n-dirty QEMU script to spin up Debian on various CPU's (9/1)
 - Hash table in C, part 5: better hashing (8/21)
 - Hash table in C, part 4: automatic resizing (8/20)
 - Hash table in C, part 3: hash collisions (8/20)
 - Hash table in C, part 2: chaining (8/20)
 - Hash table in C, part 1: a humble beginning (8/20)
 - Janet Exercism: Implement map (8/5)
 - Janet Exercism: Reverse a string (8/4)
 - Trivial Janet project with a bundled native C module (7/29)
 - MIT 6.001 (1986) SICP Lecture Segments (7/26)
 - Building the Redbook OpenGL 1.1 sample code on Linux and OS X Tiger (7/11)
 - Janet bindings for LZO (7/10)
 - Comparing lzo compression levels (and gzip) (7/7)
 - Correcting Linux DPI (PPI) (7/6)
 - Organizing Janet's stdlib functions by category (7/5)
 
- The latest version of OS X officially supported by each PowerPC Mac (6/27)
 - I got Janet working on OS X Tiger/PowerPC! (6/25)
 - A Pomodoro timer for the macOS terminal (6/23)
 - Parser generator insights from manually writing parsing functions (6/21)
 - A metagrammar for a parser generator (6/18)
 - A spec for JSON output from lexers and parsers (6/17)
 - mklexer.py part 5: the 
offside-rulepragma (6/17) - mklexer.py part 4: ditch refine in favor of keywords pragma (6/16)
 - mklexer.py part 3: the refine pragma (6/15)
 - mklexer.py part 2: --fast format, line-oriented output, discarding, EOF (6/12)
 - mklexer.py: a lexer generator (6/11)
 - Graphing the LuaJIT benchmarks to compare architectures (6/10)
 - lc3as.py: an assembler for the LC-3 fictitious computer (6/9)
 - Compilation speed: tcc vs gcc (sudoku.c) (5/28)
 - A trivial sudoku solver, in C (5/27)
 - A trivial sudoku solver, in Python (5/26)
 - Timeline of a few CPU milestones (5/22)
 - Flask "Hello, world!" using 
mod_wsgi-express(5/8) - QEMU PowerPC G4 OS X Tiger (10.4) setup (5/7)
 - Building Janet from source (5/2)
 - Identify Raspberry Pi model from the command line (5/2)
 - Installing Python 2 and 3 on various systems (5/1)
 - One-time sshd on Windows/MSYS2 (5/1)
 - Installing OS X Tiger (10.4) on an eMac (4/29)
 - Trivial rect filling SDL2 benchmark in Golang and Python (4/19)
 - Getting started with Cairo in SDL2 in Golang on OSX (4/14)
 - JSON with comments (4/13)
 
- NAT/DHCP/DNS on a Raspberry Pi 1B (2/4)
 - Ethernet-to-Wifi bridge (access point) on a Raspberry Pi 1B (2/1)
 - Comparison of Assembly across five architectures (1/27)
 - A Lisp interpreter in C, part 15: lambda (1/13)
 - A Lisp interpreter in C, part 14: scope (a.k.a let) (1/13)
 - A Lisp interpreter in C, part 13: if and cond (1/13)
 - A Lisp interpreter in C, part 12: quote (1/13)
 - A Lisp interpreter in C, part 11: apply (1/12)
 - A Lisp interpreter in C, part 10: bind (a.k.a define) (1/12)
 - A Lisp interpreter in C, part 9: nil and bool (1/12)
 - A Lisp interpreter in C, part 8: the environment (1/11)
 - A Lisp interpreter in C, part 7: comments (1/11)
 - A Lisp interpreter in C, part 6: lists (1/10)
 - A Lisp interpreter in C, part 5: escapes (1/10)
 - A Lisp interpreter in C, part 4: strings (1/10)
 - A Lisp interpreter in C, part 3: floats (1/10)
 - A Lisp interpreter in C, part 2: integers (1/9)
 - A Lisp interpreter in C, part 1: symbols (1/9)
 
- Used PC's are an insanely good deal these days (12/28)
 - Writing a Lisp reader in C, part 1 (12/20)
 - Overview of 74LVC-series single-gate TTL chips (12/5)
 - Getting started with SDL and Chicken Scheme (12/4)
 - Advent of Code, Day 1 (12/1)
 - Display a random page from a random PDF (11/27)
 - Installing pdftk on macOS (11/26)
 - Installing Debian on a PowerPC eMac (11/22)
 - Installing OpenBSD 6.6 on a PowerPC eMac (11/22)
 - Installing Debian on the MIPS Creator CI20 (11/4)
 - Trivial performance comparison of some Scheme interpreters (11/2)
 - Script: Audio-only version of the SICP lectures (10/25)
 - An alternative syntax for C, part 14: revisiting qualifiers and storage (10/24)
 - An alternative syntax for C, part 13: mixed accesses, ternary, and casting (10/22)
 - An alternative syntax for C, part 12: const, static, etc. (10/20)
 - An alternative syntax for C, part 11: dotted, arrowed, and indexed access (10/20)
 - An alternative syntax for C, part 10: structs (10/19)
 - An alternative syntax for C, part 9: comments, includes and defines (10/19)
 - An alternative syntax for C, part 8: for and while loops (10/19)
 - An alternative syntax for C, part 7: whitespace refactor (10/18)
 - An alternative syntax for C, part 6: "if" statements (10/17)
 - An alternative syntax for C, part 5: function calls (10/16)
 - An alternative syntax for C, part 4: unary and binary operators (10/16)
 - An alternative syntax for C, part 3: literals, return, and assignment (10/15)
 - An alternative syntax for C, part 2: functions and off-side rule indentation (10/14)
 - An alternative syntax for C, part 1: type declarations (10/13)
 - Puzzle: "Given a list of words and a string made up of those words..." (10/2)
 - Exploring "Dependency Object" Patterns in Swift / iOS (10/2)
 - 5GHz USB Wifi for older Raspberry Pi's (9/25)
 
- Puzzle: possible decodings of a digit sequence (9/18)
 - Installing Elk Scheme on Mac OSX Mojave (9/9)
 - "Hello, world!" in Chicken Scheme (9/8)
 - A Lisp-like interpreter (in Python), step 3: evaluation (9/7)
 - A Lisp-like interpreter (in Python), step 2: recursive descent parsing (9/7)
 - A Lisp-like interpreter (in Python), step 1b: a performance tweak (9/7)
 - A Lisp-like interpreter (in Python), step 1: how a regex-based lexer (tokenizer) works (9/7)
 - A Markdown version of "The Roots of Lisp" (9/2)
 - Clojure symbol regex (9/1)
 - Matching a string literal using regex (9/1)
 - Daily practice: trivial 
eval(8/28) - A Dockerized Flask "Hello, World!" (8/16)
 - Planning for a Spaced-Repetition Learning System (8/14)
 - srs.py: a work-in-progress command-line spaced-repetition learning system (7/24)
 - "Hello, world" in Clojure compiled with GraalVM running in Docker (7/18)
 - Simple Clojure "Hello world" using leiningen (7/17)
 - Messing around with lexing and parsing (mathterp.py) (7/1)
 
- Cross-compiling golang for an AMD Geode (4/30)
 - hping3 (4/29)
 - encrypt.sh and decrypt.sh (4/29)
 - What happened to jessie-backports? (4/28)
 - Trying to speed up apt on old hardware (4/28)
 - Installing Linux on the AMD Personal Internet Communicator (PIC) (4/27)
 - Bash completion in Homebrew (4/24)
 - Notes on Docker (4/24)
 - Preventing image downscaling in the draw.io desktop app (4/3)
 
- Baby steps towards a structured JSON editor (part 6) (3/14)
 - Notes on Structured Editors (3/9)
 - Dictionary-in, Dictionary-out style with WSGI (3/8)
 - Baby steps towards a structured JSON editor (part 5) (3/8)
 - Baby steps towards a structured JSON editor (part 4) (3/3)
 - Baby steps towards a structured JSON editor (part 3) (2/26)
 - Baby steps towards a structured JSON editor (part 2) (2/25)
 - Towards structured editing of code (part 1) (2/24)
 - Using bzip2 to compare the relative performance of various computers (2/20)
 - install-clojure-stretch.sh (2/10)
 - Resurrecting the NSLU2 (2/3)
 - Generating HMACs in Python, Node, and PHP (2/1)
 - ls-repos.py: list your github repos from the command-line (2/1)
 - Index of solutions to Exercism.io problems (grouped by exercise) (1/25)
 - Index of solutions to Exercism.io problems (grouped by language) (1/25)
 
- hexon38: a custom 38-key keyboard (12/18)
 - whodis: A spaced-repetition webapp for learning your co-workers names (11/30)
 - Picoroids: an Asteroids clone for PICO-8 (11/28)
 - Fooling around with recursive descent parsing in C! (11/5)
 
- Bowling scoring system (8/29)
 - flisp.py: a simple predicate evaluator (8/4)
 - Temperature regulation circuit prototyping (Vref ovens) (7/8)
 
- SICP formatted as chapter booklets (12/5)
 - "Out of the Tar Pit" formatted as a booklet (12/4)
 - iscpuslow.sh: Bash function to read bogomips and MHz from /proc/cpuinfo (10/2)
 - hexify.c: a snprintf-styled function for turning data into hex (9/26)
 - Populating UITableViewCells Asynchronously to Maintain Scrolling Performance (9/25)
 
- Colorized Bash prompt (9/9)
 
- Github:
- pepaslabs (stuff I'm proud of)
 - cellularmitosis (other junk / WIP)