V4 of Radix, a Golang Redis Driver

Radix is a Go driver for the Redis database. The current stable release is v3, the docs for which can be found here. Over the past year (perhaps longer) I’ve been working on a new version, v4, with the aim of addressing some of the shortcomings of v3 and distilling the API a bit …
Read more...

How to Secure a Webapp

In this post I will be documenting all security hoops that one must jump through in order to consider their webapp secure. This list should not be considered comprehensive, as I might have forgotten something or some new hoop might have appeared since writing. For the context of …
Read more...

Setting Up maddy On A VPS

In the previous post I left off with being blocked by my ISP from sending outbound emails on port 25, effectively forcing me to set up maddy on a virtual private server (VPS) somewhere else. After some research I chose Vultr as my VPS of choice. They apparently don’t block you fr…
Read more...

Visualization 7

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 60; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand canvas element's width to match parent. this.dom.widt…
Read more...

Self-Hosted Email With maddy: A Naive First Attempt

For a long time now I’ve wanted to get off gmail and host my own email domains. I’ve looked into it a few times, but have been discouraged on multiple fronts: Understanding the protocols underlying email isn’t straightforward; it’s an old system, there’s a lot of cruft, l…
Read more...

Visualization 6

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 50; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand canvas element's width to match parent. this.dom.widt…
Read more...

Visualization 5

function randn(n) { return Math.floor(Math.random() * n); } const w = 100; const h = 50; const maxNewElsPerTick = 10; const deathThresh = 10; class Canvas { constructor(canvasDOM) { this.dom = canvasDOM; this.ctx = canvasDOM.getContext("2d"); // expand can…
Read more...

Visualization 4

This visualization is a conglomeration of ideas from all the previous ones. On each tick up to 20 new pixels are generated. The color of each new pixel is based on the average color of its neighbors, plus some random drift. Each pixel dies after a certain number of ticks, N. A p…
Read more...

Ripple V3

Movement: Arrow keys or WASD Jump: Space Goal: Jump as many times as possible without touching a ripple! Press Jump To Begin! Who can make the muddy water clear? Let it be still, and it will gradually become clear. Your browser doesn't support canvas. At t…
Read more...

Declarative Dev Environments

I don't install development tools globally. I don't have node added to my PATH in my ~/.zshrc file, and running cargo outside a project folder returns "command not found." I wipe my computer on every reboot. With the exception of four folders (/boot, /nix, /home, and /p…
Read more...