Determining the legality of shengji plays

I’ve been working on my online version of the shengji card game for a little while now. One of the more interesting aspects of the game is how a legal play is defined, and the corresponding algorithm to compute that. Problem overview Shengji is a trick-taking game, which means that in each round, every player plays the same number of cards. The first player in the trick sets the “format” of the trick, which subsequent players must attempt to follow.

SIGTERM and Docker images running as PID 1

Or, why doesn’t docker stop work for my Docker image? I’ve had a Docker image which is intended to be approximately the most basic HTTP-compatible responder for a while. But, I built this originally for playing with Kubernetes, which doesn’t really give you direct access to anything. When actually using it with Docker, I discovered that it wouldn’t actually shut down correctly with Ctrl-C or docker stop, and Docker would eventually have to docker kill it.

Advent of Code 2022

Advent of Code is a pretty fun December activity – an advent calendar of programming puzzles with a story tying them all together. The puzzles are released at midnight ET, which is conveniently 9 PM PT. I did Advent of Code for the first time last year (2021), and really enjoyed it. Since I became a manager I rarely get to write code for work (and try to minimize it, even so), and especially don’t get to write the kind of code that exercises the problem-solving part of my brain.

Setting things up again

It’s been a long while since I’ve set up a new environment, and a long while since I’ve posted much of anything on here. Things have been pretty busy since we moved up here to Seattle, and I’ve been distracted by an endless supply of home improvement projects. Maybe some of those will make it up here! As it happens, though, I finally got on the NVMe train and swapped out the main drive for my computer at home.

Silly Formatting 3: readline and canonical input modes

I’ve been pretty annoyed for the last few months with using sillyfmt from the command line on MacOS. Previously, I’d just run sillyfmt with no arguments, which reads from STDIN and attempts to format whatever gets passed in. I would then copy and paste interesting snippets into the open window. Unfortunately, any large blocks of text would mysteriously truncate themselves and hang for a bit on MacOS. I had worked around this by piping the output from pbpaste (i.

Building tractor (升级) as an online card game

Introduction This COVID-19 pandemic has left me with lots of free time spent in front of a computer at home. I’d been spending time with my friends playing various videogames online (the Jackbox Party Pack games work reasonably well over Discord or Zoom), and my fiancée suggested that we try to play tractor online… but I couldn’t find one that was easily available over the internet! What’s tractor, anyways? Tractor is a trick-taking card game popular in China, played with four or more players and with multiple decks.

Silly Formatting 2

So, as a follow-up to the original silly-formatting post, I spent some time trying to figure out just how bad the LALRPOP-based sillyfmt implementation was. It turns out that there’s really nice utilities for using the afl fuzzer with Rust, so I hooked that up with some pretty basic heuristics and let it run for a few seconds. Then, since it turned out to be really bad, I got nerd-sniped into setting up a different parser called tree-sitter that uses a more generic parsing algorithm.

Silly Formatting

In my time at Dropbox, I found myself fairly often trying to quickly read through “traces”, which were essentially developer-formatted text logged from the Dropbox desktop client. The Dropbox client was originally written back before structured logging was common in industry, and in any case setting up structured logs can add a fair bit of overhead to the day-to-day debugging lifecycle. After spending an inordinate amount of time opening complicated traces in vim and using the rudimentary formatting options available there, plus a bunch of manual labor, I eventually decided to save myself a lot of time by looking for a formatter that could automate the work away.