Posts are listed by date below, or browse by tag.
You can follow via RSS.
-
-
-
-
ct.sh: the smallest CT/CD system
2025-11-06
Continuous testing and continuous deployment in less than 100 lines of code.
-
-
-
-
The Test Game
2025-07-31
Gamifying test development: using in-editor coverage for rapid positive feedback.
-
-
What's this wordplay?
2025-06-12, updated 2025-06-19
I don’t know what to call my favorite form of wordplay.
(Updated: word avalanche!)
-
Tests should accept any correct program
2025-03-06, updated 2025-03-13
The long version of a short code-review comment.
-
Making cceckman.com
2025-02-20
I serve this site through a combination of cloud and at-home infrastructure. This post (and its children) outline how it’s set up.
-
-
Branchless UTF-8 Encoding
2025-01-15, updated 2025-01-23
Can you encode UTF-8 without branches?
Yes.
-
Fractal Overdrive: An Aesthetic Evaluation of Numeric Error
2024-12-19
Using imprecise numeric formats to render fractals. From SIGBOVIK 2024, now with bonus interactivity!
-
-
-
-
A Daylight-Aware Clock
2024-10-18, updated 2025-07-03
I’ve built a clock with an illuminated daylight indicator along its edge.
-
htmpl: HTML templates in HTML
2024-10-05
What if my site generator “just” used HTML syntax?
How nice a website can I make with “just” a database?
I’m looking for an answer to these, by writing and using a new HTML templating library: htmpl.
-
-
Yak-Shaving for a Rubber Duck
2024-08-09
I made a yak-wool hoodie for a rubber duck, combining two programming idioms in one artifact.
-
-
-
Mechanical Keyboard Primer
2024-06-20
An introduction to mechanical keyboard terminology and choices.
-
CapsLock-Control Confusion
2024-06-10
Understanding an issue with CapsLock and Mod-Tap in the QMK keyboard firmware.
-
Rust Iterator Optimizations
2024-05-22
Investigating this article: How does Rust optimize iterator combinators and loops?
-
Startup Showdown - Hello
2024-04-08
To kick off the startup showdown, let’s write “hello world” in several languages, and see what program(s) get to their output first.
What comes before “Hello”?
The classic “hello world” program is the first you’ll see in a lot of languages. As it turns out, it’s also a really nice way to measure how long a program takes to get to “our code”!
I’ll write more about how program startup works in a later post. For now, I’ll say it’s something like:
-
Sending services through Tailscale
2021-12-31
Using Tailscale’s in-process networking to build on-net services.
-
Nice Dice 1d20+7 Expressions, in precedence order Die d20 A 20-sided die. Modifiers 3 A constant value 3. Repeats 3d10 Roll a 10-sided die 3 times and sum the results. 3(d8 + 1) 3 times, roll an 8-sided die and add 1, and sum the results (d4)(d8) Roll a d4; then roll a d8 the number of times shown on the d4. Repeats with selection 2d20kh Roll (2) 20-sided dice; keep the highest value. (Advantage!) 2d20kl Roll (2) 20-sided dice; keep the lowest value. (Disadvantage) 4d6kh3 Roll (4) 6-sided dice. Keep the highest 3 values and sum them. (Stats roll) Multiplication and division 8d6 * 2 Roll (8) 6-sided dice, sum the results, and multiply the result by 2. 8d6 / 2 Roll (8) 6-sided dice, sum the results, and divide the result by 2, rounding down. 8d6 * 2 / 2 Roll (8) 6-sided dice, sum the results, multiply the result by 2, then divide that result by 2, rounding down. Addition and subtraction 1d10 + 7 Roll a 10-sided die and add 7 to the result. (Damage roll) 1d20 + 1d4 - 1d4 + -1 Roll a 20-sided die. Roll a 4-sided die and add it to the result. Roll a 4-sided die and subtract it from the result. Subtract 1 from the result. (Bless , bane, and a negative stats modifier) 1d20 - (1d4 + -3) Roll a 20-sided die. Then roll a 4-sided die, subtract 3 from the result; and subtract that result from the twenty-sided die roll. Comparison (1d20 ≥ 17) * 1d4 Roll a 20-sided die. If the result is greater than or equal to 17, roll 1d4 and use its value; otherwise, use the value 0. [AC: 16] [CHA: +5] [ATK: 1d20] (ATK = 20) * (2d10 + CHA) + (ATK < 20) * (ATK > 1) * (ATK + CHA ≥ AC) * (1d10 + CHA) The target AC is 16 and your Charisma modifier is 5. Roll a 20-sided die; this is your attack roll. If the attack roll is exactly than 20, roll two 10-sided dice and sum them along with your Charisma modifier. If the attack roll is 1, use the value 0. If the attack roll plus your charisma modifier is greater than the target AC, roll a 10-sided die and add your charisma modifier to the result. (A warlock attacks with Eldritch Blast, with the Agonizing Blast feature.)