Colophon

Design & Features

Everything here is published using a custom static site generator which I originally forked from Brandur Leach's sorg. In addition to design changes, I stripped down and refactored the functionality to focus on longform technical articles. I also implemented additional features, including in-line footnotes, margin remarks (“sidenotes”) and tabbed code blocks for showcasing code in multiple languages. I have made efforts to reduce the amount of JavaScript in use, so these features are CSS-only. But there are two features which do require JavaScript: syntax highlighting with PrismJS and mathematical typesetting with MathJax 3. In the future I may pre-render both of these (though that would come at the cost of larger page sizes). There are no JavaScript-based analytics or tracking. All the fonts were designed by Matthew Butterick. Equity is used for the body (regular), site navigation and tabbed code block labels (caps), and Triplicate is used for code.

Hosting & Services

This domain's nameservers are managed by Google Domains under a GSuite account. Code for the site is hosted in a private GitHub repo, and deployments occur using GitHub Actions. Almost everything else happens through AWS. All content is stored in a private S3 bucket and served through a Cloudfront distribution. The TLS certificate is also provided by Certificate Manager. The only historical analytics I use are backend Athena queries on pageview logs stored in another S3 bucket. For monitoring and alerts I use Cloudwatch dashboards with request alarms published to SNS topics.

Tools & Languages

I usually write code in Python. From time to time I write in C++ when I really need something performant, and I also dabble in Go (specifically when I'm working on the site generator itself). For most coding projects I use JetBrains IDEs; in particular CLion, PyCharm and GoLand. I write articles in Markdown (with a few feature extensions) using Sublime Text, with realtime article preview in the browser using a Hugo-like, local rendering loop.

I create my plots with matplotlib, usually exported as an SVG for resolution independence. Occasionally SVG files are too big - for example, this density plot of all 16-digit floating point values takes an egregiously long time to load. In those cases I save the plot as a high DPI PNG file instead, which loads much faster. When I'm working in Python, I use NumPy and SciPy for numerical work. In C++ I typically use Eigen.

I use two machines. My daily driver is a 15-inch 2016 MacBook Pro with a 2.9 Ghz Quad-Core Intel Core i7 CPU, 16 GB 2133 Mhz LPDDR3 memory and a 1 TB SSD. For computationally intensive research and development work I use a custom workstation running Linux with a Supermicro MBD-X10DAX EATX Dual-CPU LGA2011-3 motherboard, two Intel Xeon E5-2640 v4 2.4 Ghz 10-core processors (20 cores, 40 hyperthreads), 12 32 GB Samsung 2133 Mhz DDR4 RAM sticks (384 GB RAM), 5 2 TB Samsung 860 Pro 2.5" SSD (10 TB SATA SSD) and 5 1 TB Samsung 970 Pro M.2 NVMe SSD (5 TB). I also have an NVIDIA RTX 2080 S GPU.

Copyright & License

All articles on this site are licensed under the CC BY 4.0 license. This means you may share and adapt the content freely, including for commercial purposes, so long as attribution is provided to this site. Likewise all code is licensed under the MIT license. You are allowed to freely use and distribute the code for any reason, including commercial purposes, so long as you provide attribution to this site.