RSSAmplifier

Blog

Wesley Aptekar-Cassels

blog.wesleyac.comRSS feed ↗10 posts

Latest posts

End-to-end testing emails

I came up with a really slick trick to write E2E tests that deal with sending/receiving emails recently. This is the sort of thing that seems like it's probably usually sort of a nightmare — I wanted to write a test for registering a account on a website, where part of the flow was clicking on a validation link in a email. The slick trick is a test SMTP server which is also a HTTP server. It's 39…

Motivating X3DH

Signal uses a protocol called " Extended Triple Diffie-Hellman " (X3DH) for key agreement 1 . This essentially takes standard Diffie-Hellman key exchange , and enables it to be used where one party may be offline while they're receiving a message, while providing forward secrecy. While the paper clearly explains how to implement X3DH, the why is slightly less clear. In this post, I'll briefly…

If you think Bluesky is decentralized, you’ve been conned

Bluesky is a purportedly-decentralized social media company that spun out of Twitter, beginning in 2019. It makes sense that people are hunting for new social media platforms right now — Elon Musk's disastrous takeover of Twitter has demonstrated how fragile relying on private VC-funded companies is for something so critical as communication infrastructure. BlueSky's answer to this is that they…

Storage Space PSA for Mastodon Admins

Do you administer a Mastodon instance? Is it falling over all the time now because it's running out of disk space because everyone is joining the network? Here is a quick PSA: tootctl media remove does not remove all the remote media . It removes all remote media more than 7 days old. It used to be that, on the server that I run, recurse.social , that would leave a handful of GB of media. Now it's…

Subdomains as identity

A common identity scheme for websites is to give users pages like example.com/username . Twitter, Instagram, Twitch, Pinterest, and many other websites use this model. Reddit, TikTok, Mastodon, Lobsters, and several others use a slightly more conservative version of this, with a prefix (either @ or u/ ) before the username. I think that in many cases, this is a mistake, and using subdomains, like…

Minify and Gzip

I've been doing a bit of work cleaning up the CSS on this blog in the past couple days — the CSS is from a template that I copied more than five years ago at this point, and it was pretty crufty even when I first got it. When I was poking around, I noticed that I had two separate media queries to check if the browser width was something that looked like a mobile device. This makes the CSS nicer to…

How to reset the USB stack on Linux

I've recently started having issues with the USB stack on my Linux laptop getting itself wedged. Rebooting fixes the problem, but I'd rather not have to reboot, so I looked into ways to reset the USB stack without needing a reboot. Almost all of the answers on the internet about how to do so either do not work on modern Linux systems, or did not reset at low enough of a level to fix the specific…

SNES Development Part 6: Sprites

This is part six of my series on SNES development. You may want to start with the first post . In the sixth, and likely final segment of this SNES tutorial, we're going to draw a sprite (or rather, an "object") on the screen! Once we're through with this, you should have basically everything you need to go off into the world and make SNES games all on your own :) As usual, I recommend the Retro…

SNES Development Part 5: DMA

This is part five of my series on SNES development. You may want to start with the first post . In part three , I mentioned that in the future, we'd switch from using a loop to copy data into VRAM to using DMA. Well, the future is now! Using DMA is much faster than using a loop, which makes it easier to load large amounts of data from ROM to memory, whether that's graphics, sprite data, palettes,…

SNES Development Part 4: NMIs and vblank

This is part four of my series on SNES development. You may want to start with the first post . Last time , we started reading controller inputs! However, we weren't able to get a tile to move around on the screen in response to the controller, because our code was running too fast. In this part, we'll look at how to slow down our main code so that it runs once per frame. We'll do this by…