blog

A high-level asyncio server and client

Published · 2min

Life got in the way of me publishing anything for the last month, but I was able to convert uwhoisd to use asyncio. That PR has a lot more in it aside form the code to switch from Tornado to asyncio. Here, I’ll just cover how the echo server …

Health Tools

Setting up redshift

Published · updated · 3min

I revived my old Lenovo Miix 310 yesterday. It’s not a great machine by any stretch, but it at least fills a niche similar to the one netbooks used to play for me: it’s small, low-power, and can be thrown in a bag. The top row of the …

Coding Projects Python

asyncio: an interlude

Published · 3min

Yesterday’s entry contained some issues I didn’t notice until later. The main one is that after the initial successful test, I’d notice that the client would start to disconnect. There’s no explicit timeout on the connections, so this might be either some underlying socket timeout or …

Coding Projects Python

A simple asyncio client

Published · 2min

In the last entry, I implemented a ‘chat’-style protocol. Using loop.create_connection(), I can reuse ChatProtocol, but with a different client implementation to allow some interactivity. I’m assuming the server is in the same directory as this file so ChatProtocol can be imported from it.

import asyncio

from …
Coding Projects Python

Exploring asyncio protocols

Published · 4min

In the last entry, I managed to get a very basic daemon running. Now I need to flesh out the initial Protocol implementation to first turn it into a proper echo server and then implement a simple parser for a ‘chat’-style protocol.

The first bit is at least easy …

Coding Projects Python

Starting with asyncio

Published · 3min

I have an old project called uwhoisd from a previous life. It’s been about eight years since I last did anything significant with it. It’s now largely obsolete owing to the ICANN policy changes partially forced by the GDPR, but I’d like to use it as a …

Life

Autumn cleanup

Published · 2min

I’ve started on a bit of a cleanup of various distractions in my life. I’m also looking to see what I can wind down that I currently run.

I’ve deleted and blocked YouTube for a start. It’s became nothing but a timesink and I’m not …

Coding

A TOTP implementation

Published · 3min

Here’s a TOTP (RFC 6238) implementation I submitted to a library. The PR was rejected because the maintainer considered it out of scope, but the implementation is fine.

I’ll be deleting the branch, but I figured I’d might as well store it here for posterity.

import base64 …
Python Hacks Tools DevOps

Building Python fat RPMs with nfpm and some magic

Published · updated · 4min

I’d an awkward problem to solve recently: how do you build a relatively cross-platform fat RPM for a Python application without having to build out a bunch of extra build infrastructure.

On the face of it, this is easy, and this is something I’ve partially solved before. I …

Retrocomputing Agon Light

Initial explorations of the Agon Light

Published · 3min

The Agon Light doesn’t have an equivalent of the “programmer’s reference guides” of old, so I’ve been doing some poking around in different places to see what information I can gather together.

There’s an agon-light tag on Github that lists a few interesting repositories. In particular …

Retrocomputing Agon Light

The Agon Light 2

Published · 1min

I ordered an Agon Light 2 recently from Olimex, which is a modification of Bernardo Kastrup’s original Agon Light.

A still-bagged Agon Light 2

It’s a small, inexpensive Z80-based board with a GPIO port, allowing it to be used as a microcontroller board, but it can also be used similarly to an …

Coding

Notes from Real World OCaml, chapter 7, part 2

Published · 4min

Covering the second part of chapter 7, which deal with exceptions and backtraces.

Coding

Notes from Real World OCaml, chapter 7, part 1

Published · 4min

Covers the first prat of chapter 7: error-aware datatypes and exceptions.

Coding

Notes from Real World OCaml, chapters 4 and 5

Published · 2min

Covers records and program structure (files, modules, and programs).

Coding

Notes from Real World OCaml, chapter 3

Published · 2min

Covers lists and patterns.

Coding

Notes from Real World OCaml, first edition

Published · updated · 17min

Because it’s been so long since I’ve done anything in OCaml, I’m going through Real World OCaml. I have the first edition, and though the second edition came out earlier this month, it’s the original that I’m going through. I’m hoping this is useful …

Life

Starting 2023

Published · 3min

It’s been a while since I did one of these. The world imploded a few months after the last one.

I think we can agree that the last three years have been a total shitfest for everyone. Things certainly haven’t been getting much better, and it doesn’t …

Meta

Hi! Long time, no see!

Published · 3min

I haven’t posted here for quite some time. However, I’ve been doing some work on restoring some old content such as my Aonsdát Éireann page, fixing up a bunch of missing redirects, and so on. There are a number of entries I want to restore from my old …

Electronics

A homebrew computer project

Published · 4min

I’ve always wanted to build electronics for myself, but I’ve never had the chance. That’s something I’d like to fix.

I’ve a few projects that have been banging around my head for a while, which are all related in some way or another.

The first …

Tools

Doing

Published · 1min

I haven’t posted anything here in a very long time. I figure I’d might as well share a small tool I knocked together.

Here it is:

#!/bin/sh

set -eu

usage () {
    echo "usage: ${0##*/} [-h] [MESSAGE]"
}

# Ensure data directory exists
: "${DOING_ROOT:=${XDG_DATA_HOME:-$HOME/.local/share}/doing}"
mkdir -p …
continue   →