221 results for "":
Dynamic linker speed and correctness
In the last article, we managed to load a program (hello-dl) that uses a single
dynamic library (libmsg.so) containing a single exported symbol, msg.
Our program, hello-dl.asm, looked like this:
global _start
extern msg
section .text
_start:
mov rdi , 1 ; stdout fd
mov rsi , msg
mov rdx , 38 ; 37 chars + newline
,
,
,
Making our own spectrogram
A couple months ago I made a loudness meter and went way too in-depth into how humans have measured loudness over time.
Today we’re looking at a spectrogram visualization I made, which is a lot more entertaining!
We’re going to talk about how to extract frequencies from sound waves, but also how my spectrogram app is assembled from different Rust crates, how it handles audio and graphics threads, how it draws the spectrogram etc.
Designing and implementing a safer API on top of LoadLibrary
It’s refactor time!
Our complete program is now about a hundred lines, counting blank lines (see the end of part 3 for a complete listing).
While this is pretty good for a zero-dependency project (save for
pretty-hex), we can do better.
First off, concerns are mixed up. In the same file, we:
- Expose
LoadLibraryA/GetProcAddress - Expose the Win32 ICMP API
Day 12 (Advent of Code 2020)
Time for the Day 12 problem!
In this problem, we have a ship. And we have navigation instructions:
- Action
Nmeans to movenorthby the given value. - Action
Smeans to movesouthby the given value. - Action
Emeans to moveeastby the given value. - Action
Wmeans to movewestby the given value. - Action
Lmeans to turnleftthe given number of degrees. - Action
Rmeans to turnrightthe given number of degrees.
Cracking Electron apps open
I use the draw.io desktop app to
make diagrams for my website. I run it on an actual desktop, like Windows or
macOS, but the asset pipeline that converts .drawio files, to .pdf, to
.svg, and then to .svg again (but smaller) runs on Linux.
So I have a Rust program somewhere that opens headless chromium, and loads just the HTML/JS/CSS part of draw.io I need to render my diagrams, and then use Chromium’s “print to PDF” functionality to save a PDF.
Using the Shipyard private crate registry with Docker
Wait wait wait, so we’re not talking about nix yet?
Well, no! The service we have is pretty simple, and I want to complicate things a bit, to show how things would work in both the Dockerfile and the nix scenario.
And because I don’t like contrived examples, we’re going to do something somewhat real-world: we’re going to geo-locate visitors, and track how many visits we get from each country.
Developing over SSH
With the previous part’s VM still running, let’s try connecting to our machine over SSH.
Network addresses, loopback and IP nets
Normally, to connect to a machine, you’d find its IP address. On Linux, a decade
ago, you would’ve used ifconfig. Nowadays you can use ip addr:
The loopback interface (lo) is local, so it’s not useful to reach the box from
the outside: you can see it can be accessed over IPv4 at address 127.0.0.1 but
not just! What we’re reading here is 127.0.0.1/8, which corresponds to the range
127.0.0.1 - 127.255.255.255
More devops than I bargained for
Background
I recently had a bit of impromptu disaster recovery, and it gave me a hunger for more! More downtime! More kubernetes manifest! More DNS! Ahhhh!
The plan was really simple. I love dedicated Hetzner servers with all my heart but they are not very fungible.
You have to wait entire minutes for a new dedicated server to be provisioned. Sometimes you pay a setup fee, et cetera. And at some point to server static websites and serve as a K3S server, it’s simply just too big, and approximately twice the price that I should pay.
Deploying catscii to fly.io
Disclaimer:
Because I used to work for fly.io, I still benefit from an employee discount at the time of this writing: I don’t have to pay for anything deployed there for now.
fly.io is still sponsoring me for developing hring, but this isn’t a sponsored post. It’s just a good fit for what we’re doing here, with a generous free tier.
In the previous chapter, we’ve written a Dockerfile to build the
catscii service inside Docker. The result is a container image that can be
pushed to production!
When rustc explodes
One could say I have a bit of an obsession with build times.
I believe having a “tight feedback loop” is extremely valuable: when I work on a large codebase, I want to be able to make small incremental changes and check very often that things are going as expected.
Especially if I’m working on a project that needs to move quickly: say, the product for an early-stage startup, or a side-project for which I only ever get to do 1-hour work bursts at most.