Delan Azabani

Meet the CSS highlight pseudos


A year and a half ago, I was asked to help upstream a Chromium patch allowing authors to recolor spelling and grammar errors in CSS. At the time, I didn’t realise that this was part of a far more ambitious effort to reimagine spelling errors, grammar errors, text selections, and more as a coherent system that didn’t yet exist as such in any browser. That system is known as the highlight pseudos, and this post will focus on the design of said system and its consequences for authors.

Chromium spelling and grammar, part 2


Modern web browsers can help users with their word processing needs by drawing squiggly lines under possible spelling or grammar errors in their input. CSS will give authors more control over when and how they appear, with the new ::spelling- and ::grammar-error pseudo-elements, and spelling- and grammar-error text decorations. Since part 1 in May, we’ve done a fair bit of work in both Chromium and the CSSWG towards making this possible.

Group sharing on a FreeBSD home server

My partner and I share a home server for our storage needs, running on FreeBSD 12 with ZFS. We have our own users, delan and aria, and a group (delanria) that in theory we can use for common areas, like our software collection. Services like torrent clients and media libraries have their own users too, and all of these users need to write to things others have created. This was easier said than done.

Chromium spelling and grammar features


Back in September, I wrote about my wonderful internship with Igalia’s web platform team. I’m thrilled to have since joined Igalia full-time, starting in the very last week of last year. My first project has been implementing the new CSS spelling and grammar features in Chromium. Life has been pretty hectic since Aria and I moved back to Perth, but more on that in another post. For now, let’s step back and review our progress.

nonymous + bore(1): DNS toys for Rust


I’ve been writing a DNS implementation in Rust. This project started out as a vehicle for learning Rust, but the more I learned, the more challenging goals I was able to set, to the point where I can see its potential to become useful in its own right. Here’s a post about what I’ve learned so far while writing nonymous, an embedded-friendly DNS library with #![no_std] and no-alloc support, and bore(1), a CLI tool for sending DNS queries.

Introducing xd(1)


xd(1) is a tool that dumps binary input in a more human-readable format. There are countless tools that fit this description, including od(1), hexdump(1), xxd(1), and a bunch of Rust crates in the same vein, but this one has a new trick up its sleeve.

Output version control for static sites


I use Jekyll, a static site generator that’s most notable for powering GitHub Pages. Two years ago, I noticed that the permalinks for several of my blog posts were broken by a Jekyll bug after I upgraded to Ruby 2.4. I’ve since written a Git-based system to stop this kind of breakage from ever reappearing, which should be useful to anyone who uses a static site generator and wants to avoid corruption or inadvertent changes.

My internship with Igalia


I was looking for a job late last year when I saw a tweet about a place called Igalia. The more I learned about them, the more interested I became, and before long I applied to join their Web Platform team. I didn’t have enough experience for a permanent position, but they did offer me a place in their Coding Experience program, which as far as I can tell is basically an internship, and I thoroughly enjoyed it. Here’s an overview of what I did and what I learned.

Farewell, car


It’s been two years since I lost my car to a kangaroo. My partner and I went on a road trip from Sydney to Canberra on a whim, but we didn’t reach our destination. We were fine, but the kangaroo sadly wasn’t. Let our story be a lesson to you: don’t drive out of town at night without a roo bar.

Bad Apple!! for taskmgr


Bad Apple!! is a Touhou song whose music video has been described as “the doom of music videos”, because it’s been played on everything from string lights to oscilloscopes. This post is about that video, writing an improved “video player” for Task Manager’s CPU graphs, and using virtual machines to push my feeble hardware to the limit.

An open letter to Bitbucket about Mercurial

In August 2019, the Bitbucket team announced that they would “sunset” Mercurial on 1 June 2020 (now 1 July 2020) by removing all Mercurial repositories and associated content. I urge them to reconsider that approach with this open letter.

Ad vigendum per aspera


The last four years have fucked with me in ways out of which I’ve only really started clawing myself over the last year or so. I went from feeling like I could do anything and improve the lives of the people around me, to feeling like an unreliable piece of shit whose only skills were botching my responsibilities and disappointing the people I knew. I gave up on learning to play the hand I was dealt, neglected the people I love, and grew to cope with all of my problems the only way I knew: by ignoring them. But the scales are finally starting to tip in my favour, and it’s time for me to end my exile.

Choosing a software licence

The licence that one releases their software under is often a topic that’s given less thought then it perhaps deserves. I’ve been releasing my code under the MIT (Expat) licence for as long as I can remember, but I thought it might be prudent to take a closer look at what’s out there in the wild world of software licensing.

The modern OpenBSD home router


It’s no secret that most consumer routers ship with software that’s flaky at best, and prohibitively insecure at worst. While I’ve had good experiences with OpenWrt and pfSense, I wanted to build a router from the ground up, both to understand the stack and to have something to tinker with. I found many solid tutorials out there, but few of them covered the intricacies of both PPP and IPv6. Here’s what I’ve learned.

On gender identity

Human gender and sexuality are immensely complex concepts due to our complexity as a species. Despite this, it’s quite simple to handle gender identity in an everyday setting. You can initially guess someone’s gender, because you’ll probably be correct most of the time. Otherwise, accept any corrections or simply ask them how they wish to be referred, and respect their identity. If you deliberately misgender a person because they don’t pass your personal threshold of physical characteristics to be worthy of their gender, you’re not just being rude, but you’re also espousing an excessively simplified and internally inconsistent conceptual understanding of gender.

The Curtin Courses Handbook

Almost every university has a handbook which should serve as an authoritative source regarding which units a student needs to complete to be able to graduate. If you are a computing student at Curtin University, this is not the case.

First experiences with OpenBSD


Tired of the sluggishness of Windows on my laptop and interested in experimenting with a Unix-like that I haven't tried before, I gave OpenBSD a second shot after a brief stint on my netbook a couple of years back. Coming from exclusively using Gentoo, this seemed like a natural choice due to its minimalism and the shared roots between ports and portage. Reading Matthew D. Fuller's comparison of BSD and Linux inspired me to venture beyond the familiar walls of the Linux world.

Writing an IRC sedbot

The ComSSA IRC has an official utility bot, KhlavKalash, which currently does some trivia like URL title fetching and server uptime. It uses Twisted for IRC and has a good plugin system with Yapsy. Feeling a bit bored, I decided to try my hand at implementing what I call a "sedbot", which interprets messages that are sed replacement expressions, executing the replacement on the last normal message.

Sidestepping NXDOMAIN hijacking

Until May last year, I was a customer of for a domain name and DNS services. Having just grown out of a comfortable walled garden of all-in-one shared hosting and DNS perhaps about a year prior, I knew little other than that I should avoid GoDaddy. I since discovered that was pulling a scummy trick that an increasing number of name service providers engaged in.

Network installing Windows XP

This was originally going to be a quick guide to Windows Deployment Services with Windows Server 2012. Using it to install Windows Vista and newer is trivial though, with the introduction of the WIM format. However, upon finding a laptop that needed Windows XP and could only externally boot via PXE, things changed a little.

Forwarding Curtin email

In an effort to avoid using any email UI other than the familiar embrace of Gmail via Google Apps, one of the first things I did when I became a Curtin student was to forward my email. I couldn't quite filter all of the incoming emails properly though, until last night I had a sudden realisation.

Network protocol checking tools

I've seen several quick, web-based configuration testing tools for clients and servers of various protocols, so it could potentially be helpful to someone if I compiled a list of them here. These tools test not only that your servers are working, but that they are configured in accordance with best practices, and I use them all heavily. Let's start with TLS, DNS and SMTP, though I'll try to find more in future and append them here.

Forcing a single timezone in Jekyll


Alternatively, How I Learned to Stop Worrying and Love UTC. It was a little more subtle than I had expected to ensure that Jekyll uses an arbitrary timezone for dates in posts and their generated URLs, but is that even a Good Thing™ to do?

Hacking the Casio fx-82MS

The fx-82MS is a cheap two-line scientific calculator that I fondly remember using for countless hours since the beginning of high school. It's so reliable that after using the same one for over six years, the worst that's happened is a bit of corrosion on the rear screws. Here are a couple of useful tricks I've found after digging through forums and videos.

Web workers in a single script file

Web workers are an immensely useful tool, enabling concurrency and perhaps parallelism with JavaScript. Before their introduction, any non-trivial computation would completely lock up the user interface of the current document, or even the entire browser.