djhworld

thoughts


Intercepting t.co links using DNS rewrites

When someone links to something on twitter, either by embedding something or just pasting a URL, twitter will front it with its own t.co link. This means that you cannot verify what the URL is until you click it and your browser goes to the end result via t.co. I only really noticed this properly when my DNS sinkholing server (Adguard home) started blocking t.co links and I was getting an error when say, clicking a linked news article.

Read more »

ChatGPT corrects itself when you tell it off

The internet has been abuzz around playing with ChatGPT, a new chat AI thing. Putting biases and unfortunate responses aside, curiosity got the better of me and I started to fool around with it. One of the surprising interactions was, I told it (assistant? eliza? alexa? mega-clippy?) off for getting something wrong, and it corrected itself. You are correct, the matrix in my previous response was incorrect. Like a teenager half arsing their homework, I managed to get them to actually make an effort.

Read more »

Warn me when processes on my Mac are running under Rosetta

Rosetta is a great piece of technology, but can be a battery drain. Most things on my Mac run natively but now and again I need to run apps under the x86 translation layer, and sometimes I forget these apps are running. You can see what processes are running under Rosetta by looking in Activity Monitor under the “Kind” column, but this requires frequent checking. So I wrote this little xbar plugin to tell me when there are apps running under Rosetta.

Read more »

Executable PNGs

It's an image and a program A few weeks ago I was reading about PICO-8, a fantasy games console with limited constraints. What really piqued my interest about it was the novel way games are distributed, you encode them into a PNG image. This includes the game code, assets, everything. The image can be whatever you want, screenshots from the game, cool artwork or just text. To load them you pass the image as input to the PICO-8 program and start playing.

Read more »

Socket activated services

I’ve been running Linux on my personal computer for nearly six months now and just thought I’d write about a neat feature in systemd called systemd.socket Personal finance on-demand tl;dr Created a socket activated service to spin up a local webapp I use sometimes when something connects to it, and then tear it down again after 5 minutes I’m a big personal finance nerd and have spent the last 3 years cultivating a ledger file that contains pretty much every facet of my financial life.

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 »