What am I working on now?

keycasting-metal

Keycasting: the return! Metal edition

How I’m doing that / Some details:

I’m very much not doing my own metal casting, thank you. Instead I’ll be navigating casting wax and foundries for a very small run of a very small piece. From cursory research, I ideally want to cast some copies in beeswax, send that to a foundry that can pour Nickel Silver (or brass as a fallback), and then get my keys!

notify 5.0

The next release of the Notify file monitor library.

How I’m doing that / Some details:

I’m refactoring: the event system (using the new system from the next branch and by this same act unifying the raw and debounced events), configuration (introducing runtime config, moving some notify features to opt-in instead of being always on), some naming (“raw” mode is not very descriptive in hindsight, so I’m calling it “immediate” mode now).

Where I’m up to now:

Still working on the third prerelease, which will have no debouncing but all immediate events with the new system.

garrīre

A rewrite of rogare in Rust

How I’m doing that / Some details:

I want to get locales in there as well as voice, and the Ruby implementation just isn't solid enough for this kind of thing. There’s also a lot of cruft in rogare I’d like to avoid, bringing over only the Good Parts.

Where I’m up to now:

Converting some commands: starting slow and doing the small stuff first (8ball, basic calc, choose, colour, dice, motivate, pick, pronouns).

percy w.: witch

A Harry Potter fanfic centered around Percy Weasley

How I’m doing that / Some details:

A bit crack-taken-seriously, a bit riff on badass/lazy tropes, a bit inspired by Agnes Nutter: Witch, a bit taken with the utter madness of some Hobbit fics I’ve read recently. It has the potential to be fairly funny even if I’m being a downer and writing super-sad character development up front (because Percy was a child during the wizarding war, and that can’t have been all fucking sunny days and happy occasions).

Where I’m up to now:

Writing various unsorted scenes

trebuchet

A deploy tool / experiment using Btrfs volume archives.

How I’m doing that / Some details:

The actual deploy tool is a client/server/agent suite with some neat features but aiming to be extremely light on resources, at least compared to many other tools I’ve tried. But the core underpinning, the main idea, comes from playing around with btrfs volumes/snapshots and the export/import commands on the tool. Essentially you can ask for an export of a volume, and you can ask for an export of a volume based on another volume, then on import, which can be on a completely different filesystem/disk/machine, as long as you have that same base volume, you can restore. So you can have filesystem-level diff archives on demand, with no awareness from the application being built/deployed, and everything is already in standard linux tools. It just needs some wrapping and managing.

Where I’m up to now:

Proper implementation on pause while waiting for some dependencies to mature, but a proofing of the core technology was built and is in production. Verdict: it’s pretty cool, but the btrfs stuff adds some unforseen constraints. I’d still like an implementation, but some of the technology might need some reviewing.

armstrong

A job system for a wonderful world.

How I’m doing that / Some details:

This is about building a job system that offers rich workflow potential and excellent monitoring/auditability while also being very lightweight. Scalability and partition-tolerance are secondary concerns at the moment. Inspired by Gearman, but aiming to be a superset.

Where I’m up to now:

I made a kinda sorta 50% implementation named Gearbox in Node.js for work, and I made plans for a custom queueing store based on Sled, as well as nailed down the necessary features of the core job queue.

IntPath

A new library for interned path segments and paths with structural sharing.

How I’m doing that / Some details:

String interning is actually a few different programming techniques, which can go from static string interning, where a bunch of strings that will be used by the application are constants — generally this is on a larger and more systematic scale than defining a bunch of consts — to language-level (or VM-level) interning, like Ruby symbols which only exist once in the program, to fully-dynamic interning with a little runtime. IntPath is that last one. Or rather, IntSeg is that last one. IntSeg is based on a global concurrent hash map, which is initialised on program start. An IntSeg, an interned (path) segment, is an OsString that is stored uniquely but weakly inside the map, and where every “actual” copy is actually a strong pointer to that interned value. So every segment is only stored once, no matter where it’s created or accessed from, and unused segments take up no (actually some, but very little) space. Then IntPaths are built on top of that as, essentially, a Vec of IntSeg. That makes paths /a/b/c and /a/b/d use up only 4 path segments, instead of six. And 100 absolute paths with a common prefix of 10 segments and a unique suffix of 1 segment will only use 110 segments total. Additionally, segments don’t care about their position in the string, so the path /a/a/a/a/a uses one segment. There’s more, but that’s the general idea.

reupholstering-chairs

Putting some new fabric on the seat cushions

How I’m doing that / Some details:

I bought six chairs for pretty cheap, mostly because they're dirty and uncleanable. But the chairs themselves are okay, if not very good quality (probably made from recycled wood originally). So I'm going to reupholster them, made sure they’re solid, and perhaps paint some of them white too.

Where I’m up to now:

One chair done, five to go!

rogare

A Discord bot for a local writer/nanowrimo group.

How I’m doing that / Some details:

It’s a custom Ruby bot with its own custom framework. Originally it grew from an IRC bot using the Cinch framework, but when the community moved to Discord the framework got adapted, and then refactored. The bot has a low key sassy attitude, provides a bunch of common small tools (like dice, random pickers and choosers, writing prompts, etc), but also has a pretty good “wordwar” implementation, and its prized jewel: a name generator seeded from some 150 000 actual names from various sources.

Where I’m up to now:

Mostly just doing maintenance.

irish

Learning Irish

How I’m doing that / Some details:

Duolingo, fanfic, etc.

Notify Next Generation

Experiments and development for Notify’s next generation.

Earthquake Sky

An experimental art piece representing a map of all earthquakes around Aotearoa like a star atlas.

How I’m doing that / Some details:

The substrate is an A0 piece of white cardboard/foamboard. On it I'm placing hundreds of dots of varying sizes using clear nail polish, in the rough locations of all earthquakes since 1900 (as much data as is available) in the land and sea around Aotearoa. Once done, I will splash blue inks over the board, then wash lightly. The result should be that where the polish is, the ink slides off, resulting in a dark blue background with white dots peeking out. Ultimately, this is expected to be an experience both near and afar, with the polish providing a tactile feel.

Where I’m up to now:

Picked it back up after many months, starting on the mass concentrations of the North part of the image.

dginn

A personal finance tool for the budgetless.

How I’m doing that / Some details:

Or, rather, a finance/budgetting tool for me, who absolutely doesn’t work with budgets or comprehensive ledgers or putting my household into Xero or anything like that. I’ve tried. I’ve failed. I don’t really need a tool that will track things on a day to day basis, and I don’t need a tool to help me save. But I do need a tool that understands personal finance: incomes, expenses, tax; costs that are always the same on some kind of schedule, costs that are within a range on average, one-off purchases, etc. I’m interested in knowing how much I’m putting away every month, quarter, year; in seeing how much the model differs from the reality; and in having a bird’s eye view of everything I gain and spend, normalised and denormalised, graphed, smoothed, and averaged, to be used as a tool to make informed decisions about the future. In the end, this is what I’m trying for: a tool to empower.

Where I’m up to now:

Drafting a first prototype.

omelette-new-archive-format

Updating Omelette’s archive importer for the new format

How I’m doing that / Some details:

Omelette is a suite of personal archiving tools for tweets. The current version reads the old “slim” archive format, with only few details... I plan to upgrade that tool to the “full” archive format, which is reported to contain a lot more details.

Where I’m up to now:

Requested my archive in the new format, waiting for it to get ready.

pinn

A browser extension companion to track and manage the fanfic I read.

How I’m doing that / Some details:

The idea so far is to track both what I want to read, what I’m reading, following, etc, all with a minimal amount of interactions. Simply visiting a fanfic page should track it, and some work with the Intersection Observer API should yield a pretty accurate detection of actively reading a fic vs just having it open or looking through it without really reading.

Where I’m up to now:

Scaffolding the UI and trying to figure out the data layer.

reasonable.kiwi

An everything-encrypted database and service of reasons for actions on twitter.

How I’m doing that / Some details:

This is both about this frustration with not having reasons for following, or blocking, or not following, or muting, etc... accounts on Twitter, and a challenge to design and write a service with the most amount of encryption while still being able to offer something that works. Really, the philosophy is that I don’t want to be able, as an admin operator, to read any of the reasons, or any of the people affected by the reasons, or even if possible, the social media usernames of the people using the service, at least not without some willful modifications to the service, or a trace on the process, something like that. Someone obtaining an entire copy of the database should not be able to determine anything beyond the number of users, and the number of reasons. Someone otaining that plus either the source or the binary of the service should also have that same amount of access. That means layering and chaining, and careful design thought, especially as putting all user data in one encrypted blob is not going to work efficiently with potentially tens or hundred of thousands of reasons per. Making data queryable without looking inside is an interesting challenge.


In the end, I decided that instead of a public service, I would add tools to omelette. The cryptographic challenge is interesting, but the best way to keep data private is to not actually put it on someone else’s cloud, really.

swp

A utility to swap two files atomically, or as close as

How I’m doing that / Some details:

On Linux 3.15+, the renameat2 call. On macOS, the exchangedata call. On Windows that supports Transactional NTFS, that. On WSL2 (potentially), the renameat2 call. On other platforms, a fallback method or two. In the end I decided there’s other tools and projects that do that and I’m not going to spend more time on it.

ikea-table

Setting up an IKEA table I’d ordered a while ago.

How I’m doing that / Some details:

It’s an IKEA thing. How hard can it be? cue laugh track

what

A small tool to show off what I’m working on.

How I’m doing that / Some details:

It’s a Node script that creates a small static site from a TOML file. On push of its git repo, a Travis build kicks off, and pushes the result to its gh_pages branch, which updates the site.

car-rainbow

Adorning my car with a line of rainbow

How I’m doing that / Some details:

The original idea was to add a decoration that would distract from the various scratches and DIY repairs on my car. I started by calculating the length I’d need, then designing and ordering about five metres of rainbow “bumper” stickers in 30cm lengths. Then I mocked up the shape of the line with masking tape, and sat on it for a few days. In the end I went with a diagonal line rather than horizontal. It needed lots of adjustments to look straight from a distance, while dealing with the reality of curved surfaces. Once I received the stickers, careful application took three afternoons.

car-scratch-repair

Repairing a deep scratch on my car

How I’m doing that / Some details:

DIY: some resin to fill the gap, lots of sanding, applying colour, more sanding, clear coats, some buffing.

keycasting

My house key is uncopyable crap. I tried to make my own.

How I’m doing that / Some details:

Experimenting using epoxy casting in silicon moulds. In the end it wasn’t strong enough for daily use, but I learned lots and even managed to produce something okay!

omelette

A suite of personal archiving tools for tweets.

certainly

A simple certificate tool

How I’m doing that / Some details:

Mostly just binding to OpenSSL and creating/inspecting certificates with the least user interaction possible. There are other tools that take a similar approach but they either do too little (only self-signed certs, no self-CA-signed ones) or too much (install themselves by default into various system certificate stores). Plus it was an interesting way to learn more about the OpenSSL APIs and certificates.