I do a lot of electronics projects in my spare time, and I tend to try to make
reusable parts to save myself effort in the future. Because I have to order
ingredients in certain quantities, I often wind up with more than I need for my
project.
So I’ve opened a Tindie store, called Overengineered Widget
Laboratories. Right now there’s one product in the store, called
Keypad:GO. See, I built a sculpture last summer that needed to interact
with people through a phone-style keypad. The keypad interface part of it seemed
like something other people could use, so I made a few extras. This is a very
easy way to interface a keypad or small keyboard to an embedded electronics
project, because it handles all the basics for you — matrix scanning,
debouncing, key matrix collisions, etc.
It will also help you reverse engineer the keypad’s circuit, because often
cheap keypads arrive without good documentation. In the tiny flash of the
embedded microcontroller, I’ve packed a setup wizard that will walk you through
the process of setting up the keypad of your choice. All you need is a terminal
program. This is honestly my favorite part, and I demonstrate it in the video
below.
Since I started running this site in 2011, I’ve adhered to some principles to
make it fast, cheap, and privacy-respecting.
As few third-party cross-domain requests as possible – ideally, none.
No trackers (which tends to follow naturally from the above).
Use Javascript but don’t require it – the site should work just fine with
it disabled, only with some features missing.
No server-side code execution – everything is static files.
Out of respect for my readers who don’t have a fancy gigabit fiber internet
connection, I test the website primarily on slower, high-latency connections –
either a real one, or a simulated 2G connection using Firefox’s dev tools.
I was doing an upgrade of my httpd2 software recently and was frustrated at
how long the site took to deliver, despite my performance optimizations in the
Rust server code. To fix this, I had to work at a much higher level of the stack
– where it isn’t about how many instructions are executed or how much memory is
allocated, but instead how much data is transferred, when, and in what order.
On a simulated 2G connection, I was able to get load times down from 11.20
seconds to 3.44 seconds, and the total amount of data transferred reduced from
about 630 kB to about 200 kB. This makes the site faster for everyone, whether
you’re rocking gigabit fiber or struggling to get packets through.
In this post I’ll walk through how I analyzed the problem, and what changes I
made to improve the site.
tl;dr: Check that your RSS reader is using an HTTPS URL, because the HTTP
one will start redirecting soon, and you probably want to find out if it breaks.
Edit from four days later: I’ve flipped the switch on this and, from the
logs, it doesn’t seem to be messing anybody up.
It’s been just about four years since I finally got HTTPS and HTTP/2 working for
this site. During that time, I’ve seen most incoming traffic from humans
transition over to encrypted connections. (HTTP/2 connections are also
significantly faster for both my server, and your user experience, than earlier
editions.)
You might wondering what I mean by “traffic from humans.” Well, it turns out the
vast majority of my remaining unencrypted HTTP traffic (ye olde port 80) is from
a combination of:
RSS readers (80%)
Shady crawler bots that don’t check robots.txt (15%)
Google, for some reason – I’ve poked them about it (~4%)
Requests that may be from actual humans (1%ish)
Since I deployed httpd2 back in 2020, I’ve been waiting for an opportunity to
turn off publicfile, the HTTP server I’ve used since time immemorial.
publicfile has served well, but the code is as archaic as its protocol
support, its license makes it difficult to maintain, and (frankly) I’m less
excited about appearing to support DJB and his software ecosystem these days.
So, I figure I will do the following:
Respond to all HTTP requests with a 301 redirect to HTTPS (…something
publicfile can’t actually do out of the box), and
Turn on the Strict Transport Security header.
For best results, check your RSS reader today and verify that it’s using an
HTTPS URL. It should follow the redirect when I enable it, but, you never
know.
I really like the STM32 series of microcontrollers in general. They’re generally
quite reliable, the peripherals are well tested, and more often than not I can
just grab one off the shelf and not think about it too much.
However, like every microcontroller, they do contain implementation bugs, so
it’s always important to read the “Errata Sheet” (or in ST’s language, “Device
Limitations”) when you’re using a part.
I appear to have hit an implementation bug in certain STM32 lines that is not
listed in the errata sheet. I can’t find any specific description of this bug on
the internet, so I’ve attempted to nail one down. Hopefully this will come up in
the search results for someone who hits this in the future and save them some
time.
I’m trying to do something kind of unusual with lilos: in addition to almost
all the APIs being safe-in-the-Rust sense, I’m also attempting to create an
entire system API that is cancel-safe. I’ve written a lot about Rust’s async
feature and its notion of cancellation recently, such as my suggestion for
reframing how we think about async/await.
My thoughts on this actually stem from my early work on lilos, where I started
beating the drum of cancel-safety back in 2020. My notion
of what it means to be cancel-safe has gotten more nuanced since then, and I’ve
recently made the latest batch of changes to try to help applications built on
lilos be more robust by default.
So, wanna nerd out about async API design and robustness? I know you do.