Warning

This page can now be found at https://djharper.dev/

Your browser should redirect to the new URL at djharper.dev in 5 seconds, but if this fails please click here

I've migrated my website away from github pages and will no longer be posting content here.

djhworld

thoughts


Moving my blog away from Github Pages

I’ve moved my blog away from github pages to its own domain djharper.dev and hosted the content elsewhere. While github does support custom domains, implementing this now would cause the existing domain (djhworld.github.io) to render a 404 rather than a redirect, meaning existing links would suddenly become broken! To combat this I’ve implemented meta-refresh and canonical links as a poor mans substitute for a 301 and no further updates will be posted to this URL.

Read more »

Running Linux on my Macbook

Obligatory desktop shot with nothing on it This is another one of those posts, the one’s where Linux desktop apologists have the urge to justify to the world why they do things. So here we go, a few weeks ago I installed Fedora 32 on my Macbook Pro (early 2015 model). In this post I hope to document the pitfalls, traps and joyous moments I found along the way, complete with the annoyances that I’ve come to tolerate.

Read more »

I don't know how CPUs work so I simulated one in code

A few months ago it dawned on me that I didn’t really understand how computers work under the hood. I still don’t understand how modern computers work. However, after making my way through But How Do It Know? by J. Clark Scott, a book which describes the bits of a simple 8-bit computer from the NAND gates, through to the registers, RAM, bits of the CPU, ALU and I/O, I got a hankering to implement it in code.

Read more »

Reed Solomon codes are cool

Imagine wending your way through a great book on your e-reader, the world melting away, and suddenly everything comes crashing back to reality with an apologetic Sorry! Chapter 20 corrupted! message. A few tired cells of the flash storage gave up the ghost overnight and corrupted your book. Wouldn’t it be great if your device didn’t complain about its innards, and recovered from the problem itself?

Read more »

I ported my Gameboy Color emulator to WebAssembly

Around five years ago I wrote a Gameboy Color emulator in Go. It was a very frustrating, but rewarding experience that I’ve been dining out on in job interviews ever since. However, as the passage of time progressed, it landed on the pile of mostly-done-but-not-finished projects and left largely abandoned. One might generously say, on hiatus. Well, until very recently that is. That 5 year gap You see, a few weeks ago Go 1.

Read more »

I thought I found a browser security bug

A few weeks ago I thought I’d stumbled across something really bad when just casually browsing the web. It all started on a financial information website, upon clicking a link, the page partially loaded some of its content, then, without warning, redirected the browser to a completely different domain with some weird spam/search engine content on it, from a known domain squatter. Strange… After refreshing a few times, it was still doing it.

Read more »

Using HyperLogLog in production, a retrospective

A few years ago I was involved in a project that required us to provide a time series metric on how many concurrent users were using our products, and what quality of service they were receiving. On embarking on this journey, it quickly became apparent that the tricky part would be doing the count of unique concurrent users, over a set of dimensions in one minute windows. We’d run into the classic count-distinct problem.

Read more »

Running Go AWS Lambda functions locally

AWS recently announced Go support for Lambda, giving developers more choice over how their functions are written. In an attempt to kick the tires of the new runtime, I found myself rummaging around the open source library required when writing Lambda functions in Go, and was delighted to find a glimpse into what happens when your function is invoked. This post is a brief tour of what I’ve gathered, and describes a simple way of invoking your function in a local environment.

Read more »

Warning

This page can now be found at https://djharper.dev/

Your browser should redirect to the new URL at djharper.dev in 5 seconds, but if this fails please click here

I've migrated my website away from github pages and will no longer be posting content here.