“The Temper of Revenge” is one of my favorite filksongs, though I was introduced to it by the Star Trek II-related parody, “The Temperature of Revenge”. A few weeks ago, on a bus from Madison to Chicago, I decided to see if I could fit some lyrics about my favorite video game, Outer Wilds, to the tune. It took a lot of revising to do so without massively spoiling the game - and, if you ever intend to play it, do be careful of spoilers! - but I think I’ve succeeded.| Leonora Tindall on Nora Codes
“Fly, Columbia” is a deeply hopeful song. Written in 1981 by Diana Gallagher, Leslie Fish’s performance on Minus Ten and Counting was one of the first filk recordings that really captured me. The chorus names OV-102 “the promise of better days to come”, and blesses her to “Sail an orbit free, track the moon and chase the sun.” Yet, that was not her fate, as we know all too well. When I heard The Longest Johns cover “Roll Northumbria”, I immediately thought of this song, and ...| Leonora Tindall on Nora Codes
As mentioned in the previous post, the web platform is popular for creating apps that would make plenty of sense as desktop software. This is partly because it unifies many platforms, but mostly it’s because it solves the distribution problem. That is, having written a program, how do I get it into the hands of users? Consider the process of installing a desktop app for a user with a fresh install of their operating system:| Leonora Tindall on Nora Codes
The web platform is the delivery mechanism of choice for a ton of software these days, either through the web browser itself or through Electron, but that doesn’t mean there isn’t a place for a good old fashioned straight-up desktop application in the picture. Fortunately, it’s easier than ever to write a usable, pretty, and performant desktop app, using my language of choice (Rust) and the wildly successful cross-platform GUI framework GTK. In this blog post, we’ll walk through the s...| Leonora Tindall on Nora Codes
One of the biggest challenges in software testing is defining the input for code under test in a way that is expressive and powerful enough to test complex situations but doesn’t distract from the intent of the test or clutter the test code to a degree that makes it difficult to read. Many dynamic languages have testing APIs which take advantage of their looser and later type checking to provide easy mocking and stubbing, but strict, statically typed languages can make it difficult to build...| Leonora Tindall on Nora Codes
Rust’s Iterator trait is one of its most useful features. It allows lazy processing of item-by-item streams of anything from the bytes of a file to threads to complex and exotic data structures. Most of the useful functionality, though, is provided by combinators, functions that allow us to combine iterators and process them in useful ways. These include map, fold, filter, and many other useful functions (including those from the excellent itertools crate). Concision and Clarity Consider th...| Leonora Tindall on Nora Codes
This is a sequel to my (rather long) introduction to reverse engineering. It is something of a “whirlwind tour” of some useful methods that weren’t shown in that tutorial, and provides a number of exercises to hone your skills. The CrackMe Programs You can find the CrackMes discussed here on GitHub. Clone that repository and, without looking at the source code, build each CrackMe with make crackme01, make crackme02, etc. Tools and Software These CrackMes only work on Unix systems, and I...| Leonora Tindall on Nora Codes
This document presents an introduction to x86_64 binary reverse engineering, the process of determining the operation of a compiled computer program without access to its source code, through a series of CrackMe programs. There are a lot of excellent tutorials out there, but they mostly focus on the 32-bit x86 platform. Modern computers are, almost without exception, 64-bit capable, so this tutorial introduces 64-bit concepts immediately. A CrackMe is an executable file which takes (typically...| Leonora Tindall on Nora Codes
Install for Firefox or Chrome, or view on GitHub What is RandomUA? RandomUA is a WebExtension that changes your User-Agent string to a sensible-looking, desktop-browser-like UA string which is different for every request. A User-Agent string is a piece of information that your computer sends to every website you go to. It tells them what software you use to access the Internet, what kind of computer you’re using, and what kind of operating system you use. Some of this is really important to...| Leonora Tindall on Nora Codes
I recently switched back to Firefox from Google Chrome. Firefox has gotten a lot faster recently, and is in the process of getting event faster, partly thanks to Mozilla’s Rust language, which is being used to write important components in a provably memory-safe way. This allows them to be made much more concurrent and parallel, leading to large speed improvements. One big draw of Firefox is that it’s not a data collection tool for Google, and I’d like to double down on that promise. So...| Leonora Tindall on Nora Codes
Programmers talk a lot about types, but what is a “type”, anyway? It is, in essence, the set of all possible values for some variable. Defining such a set gives us some information about what we can do with the value of that variable, in general. For example, when speaking about numbers, we might say, “let x be any integer” or “let y be any real number not equal to zero”. These statements tell us what we can do with these values; we know that we can add, subtract, or multiply x an...| Leonora Tindall on Nora Codes
Author’s note: Piston has moved on since March of 2017. This tutorial, for 0.64, is preserved for posterity; I suggest you look instead at the official getting started guide. I’ve been interested in game programming for a while, and I periodically sample the Rust ecosystem’s offerings around game programming. Piston seems like the most promising candidate, but the tutorials are out of date, so here’s a simple one. This tutorial will show you how to build a simple windowed application ...| Leonora Tindall on Nora Codes
Session types are a technique for using a rich type system, like that of Rust or OCaml, to prevent the representation of certain kinds of illegal states. Here, I’ll illustrate them with a (somewhat contrived) example. What is the use-case? Let’s take the example of a system representing packaging and shipping boxes. I want to create a Package data structure, pack data into it, close it (preventing adding data), address it, and then ship it. It makes no sense to send an un-addressed Packag...| Leonora Tindall on Nora Codes
I occasionally spend time randomly surfing the Python standard library docs; there is a lot of useful functionality included in the language’s standard distribution, such as, for instance, the socketserver module, which I didn’t know about until this evening and which is one of the most useful I’ve seen in a while. As ever, the docs are straightforward in their self-description: The `socketserver` module simplifies the task of writing network servers. This is something of an understate...| Leonora Tindall on Nora Codes
Sometimes, it can be useful to know if your program is running in a terminal. Since Python 3.3, this functionality has been available in the os module: #!/usr/bin/env python3# Test if this Python script is running in a terminal or not.import os try: size = os.get_terminal_size() print("I am in a terminal of size {}x{}" .format(size[0], size[1])) except OSError: print("I am not in a terminal.") Here is an example of it in operation:| Leonora Tindall on Nora Codes
Here you will find the key material needed to identify me on various services. OMEMO Here are the keys for my XMPP clients. Desktop: F0AB7263 B6C022EF A8C38705 65076963 FCF10F75 B53666FB 92619D86 807D9619 Laptop: 2140AA59 2159DD24 01508815 90BA116C 9DD7AF4F 63FBFAA0 92346EF7 2AC36361 Phone: 1FC18869 CB8A790E 8264034E 9927DDFF 9424C8CF F0BAA6BE F8BD4DF4 3FFA3A32 GPG My GPG key is as follows. -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBF2nP24BEACxW1Nb9CWGEIihtpbRlO6uPKmI+3AdW/0mL6+kQhuNbEiC/IQD M...| Leonora Tindall on Nora Codes
I’ve written for other sites as well; this is an incomplete directory of that work.| nora.codes
Hi, I’m Nora Tindall. I work in software, but not at a “software company.”| nora.codes
nimi sin| nora.codes