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
- Factorio city blocks (3/15)
- 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-rule
pragma (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)