May 12, 2023 - Testing for Multivariate Normality with a Henze-Zirkler Test (In Python)

If you’re just interested in the code, it’s super easy to use pingouin to do this: import numpy as np import pingouin as pg data = np.random.normal(size=(100, 3)) output = pg.multivariate_normality(data, alpha=.05) print(output.hz, output.pval, output.normal) Sometimes, it’s useful to know when a sample looks a lot like a normal distribution. In a single dimension, we can use the function from scipy scipy.stats.normaltest to test whether a sample is normal. This test combines tests from D’Agostino and Pearson which measure the skew and kurtosis of the sample, and report when those differ from a similar normal population....

May 12, 2023 · 2 min · 286 words

December 07, 2022 - How to make a tree with a parent pointer in Rust

I was working on the Advent of Code (day 7) today, which I’m using to learn a bit more about Rust, and while I was able to quickly solve the problem with python (thanks to the fact that python allows references to everything everywhere), I had a hard time solving the problem with Rust, thanks to the inability to keep around references to a “parent” in the tree. This inconvenience is by design: Rust tries to ensure memory safety by forbidding you from doing things that might potentially be unsafe....

December 7, 2022 · 7 min · 1299 words

December 02, 2022 (2) - Encoding secrets for Kubernetes

Kubernetes uses base64 encoded secrets, but it’s important to make sure that when encoding the secrets, you don’t include any extra newlines - tldr; use echo -n instead of echo # Works > echo -n "my secret" | base64 bXkgc2VjcmV0 # Doesn't work > echo "my secret" | base64 bXkgc2VjcmV0Cg== Otherwise, you could be in for a world of pain :)

December 2, 2022 · 1 min · 61 words

December 02, 2022 - How to use python-dotenv to easily manage env vars

So, I had a project recently where I have a bunch of API keys, but I didn’t want to accidentally commit them to a repo (since that would be bad…). But I also wanted the convencience of just in-lining the code, and not have to worry about sourcing environment variables every time I ran the code (since this would inevitably cause annoyances). To solve this, I found a handy tool - python-dotenv, a package which handles all of the complicated bits....

December 2, 2022 · 1 min · 152 words

November 29, 2022 - PyPI Doesn't Allow Git Repo Dependencies

So, we have a package, VDTK which we’re planning to release in a new major version - there’s only one problem… We depend on several packages which do not publish builds to the PyPi repository. In our pyproject.toml file, they are specified as: dependencies = [ "...", "clip @ git+", "mauve-text @ git+", "en_core_web_lg @", ] Unfortunately, when you upload a package built with dependencies like this, you get the error:...

November 29, 2022 · 2 min · 360 words

November 18, 2022 - Creating the perfect archetype in Hugo

This TIL site is powered by Hugo, but it’s currently a lot of effort to create the title and name for one of these posts… It would be great if we could have a single command line tool which does this! Each post right now has the following header: title: 'November 18, 2022 - Creating the perfect archetype in Hugo' date: 2022-11-18T16:17:02-08:00 showToc: true TocOpen: false draft: false hidemeta: false comments: false disableShare: false disableHLJS: false hideSummary: false searchHidden: true ShowReadingTime: true ShowBreadCrumbs: true ShowPostNavLinks: true ShowWordCount: true ShowRssButtonInSectionTermList: true UseHugoToc: true Most of this information is super easy to deal with - everything after showToc is static, so our template can just write those directly....

November 18, 2022 · 2 min · 404 words

November 17, 2022 - Running Single-Server MySQL on Kubernetes

Getting anything running on Kubernetes is a bit of a challenge, but today I was working on deploying MySQL so I could migrate my Ghost blog from v4.x to v5.x. This means creating a mysql instance, a user (for ghost) and any other data that we need to run the deployment. The first thing that we need to do is add a secret which will define the root user password and the password for ghost user:...

November 17, 2022 · 2 min · 395 words