RSSAmplifier

Blog

Quasimal

There are no musings here.

quasimal.comRSS feed ↗81 posts

Latest posts

Diamond Air Taxis' Flights API

Diamond Air Taxis' Flights API I created a backend service for the Diamond Air Taxis Australian private/charter flights service, which provides possible flight itineraries for use on the search/booking pages, and then performs checking of booked itineraries until departure. If you want to see how those flights look, have a look at the YouTube channel , which Steve Boyd updates from time to time…

Experiences with support of Cabal's public sublibrary feature

Experiences with support of Cabal's public sublibrary feature January 31, 2026 This is not a very high quality post: I don’t introduce anything that hasn’t been written about before already, and I don’t feel like I looked very deeply into the subject. It’s just an experience report, but hopefully that experience is useful to someone out there. Pre-ramble This is a brief rundown of the state of…

2025-11-18-0151_DSCF0151

2025-11-18-0151_DSCF0151 November 18, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-11-18-0032_DSCF0032

2025-11-18-0032_DSCF0032 November 18, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-05-26-dazza the defender

2025-05-26-dazza the defender May 26, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-02-06-01_52_57 IMG_1226

2025-02-06-01_52_57 IMG_1226 February 6, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-02-02-06_37_38 _MG_9707

2025-02-02-06_37_38 _MG_9707 February 2, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-02-02-04_04_53 _MG_9424

2025-02-02-04_04_53 _MG_9424 February 2, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-01-25-00_28_28 _MG_7510

2025-01-25-00_28_28 _MG_7510 January 25, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2025-01-19-20_19_30 _MG_6502

2025-01-19-20_19_30 _MG_6502 January 19, 2025 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

hasql-mover

hasql-mover Moved to https://github.com/mikeplus64/hasql-mover .

2024-04-05-IMG_4357

2024-04-05-IMG_4357 April 5, 2024 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

Journeyman

Journeyman Moved to https://github.com/mikeplus64/journeyman/ .

2023-08-02-kettle-scene

2023-08-02-kettle-scene August 2, 2023 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2023-03-24-refined-clump-friend

2023-03-24-refined-clump-friend March 24, 2023 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2023-02-11-T15_51_56_20230212_0167

2023-02-11-T15_51_56_20230212_0167 February 11, 2023 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

kuachi cups

kuachi cups Moved to https://kuachi.gg .

2022-07-01-nose

2022-07-01-nose July 1, 2022 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

Lenses with OverloadedRecordDot

Lenses with OverloadedRecordDot February 23, 2022 by Mike Ledger Not wanting to let the 6+ gigabytes of storage required for my haskell.nix -provided GHC 9.2.1 shell to go to waste, I immediately set to work using one of the new goodies it provides; GHC 9.2.1 introduced 3 new language extensions, 2 of which ( OverloadedRecordDot , and NoFieldSelectors ) are of interest here. NoFieldSelectors is…

2022-02-08-combo6

2022-02-08-combo6 February 8, 2022 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

solid-typefu-router5

solid-typefu-router5 This is a TypeScript library making extreme use of type-level computation to create a really nice routing library (a la react-router ), for SolidJS, and backed by a router5 router internally. See documentation on GitHub . Moved to https://mikeplus64.github.io/solid-typefu-router5 .

2022-01-05-eye

2022-01-05-eye January 5, 2022 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

melee-vpad

melee-vpad Available on GitHub Simple evdev/uinput virtual gamepad for keyboard controls in emulated Smash Bros Melee. Written in Rust. Sale-speak: Level up your Slippi gameplay with this one neat trick. Is it competition-worthy? Probably not. Will you get banned for trying to play with it in a tournament? Maybe! Will /I/ get banned for playing mediocrely anyway while still having…

2021-08-06-surfshamb

2021-08-06-surfshamb August 6, 2021 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2021-03-05-back-off-mart-small

2021-03-05-back-off-mart-small March 5, 2021 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2021-01-11-clump-zenaku

2021-01-11-clump-zenaku January 11, 2021 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

Respecify

Respecify Respecify was a novel web-based requirements authoring tool developed by me for Ricardo Rail. It aids requirements engineers by applying a simple English grammar that ensures: Basic syntactic correctness. All terms within a specification are defined and have at most 1 meaning. The relationships specified do not contradict eachother. Requirements meet some basic quality checks. A tool…

2020-01-02-card-wandg-robot

2020-01-02-card-wandg-robot January 2, 2020 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2020-01-02-card-moondog

2020-01-02-card-moondog January 2, 2020 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2020-01-02-card-calvary

2020-01-02-card-calvary January 2, 2020 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-11-03-wombat

2019-11-03-wombat November 3, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-11-03-quokka-em

2019-11-03-quokka-em November 3, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-10-14-sunburnt-country

2019-10-14-sunburnt-country October 14, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-10-12-wombat

2019-10-12-wombat October 12, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-10-03-wombat

2019-10-03-wombat October 3, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-10-03-bird

2019-10-03-bird October 3, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2019-07-07-clump-warrior

2019-07-07-clump-warrior July 7, 2019 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

csvmaps

csvmaps This is a command-line tool for manipulating map-like CSV data, where the first column is treated as a “key” for that row. Please see the README for the most up-to-date documentation here . Installation Currently requires stack because of a dependency on an unreleased (or rather, also not on hackage) package cassava-streaming . $ git clone git@gitlab.com:transportengineering/csvmaps.git $…

shrinkmusic

shrinkmusic September 12, 2018 I love music. I have a rather large digital collection of it, hoarded over many years, and I intend to grow it indefinitely. There are a wide variety of formats, from FLAC, to Ogg Theora, to MP3, to (very poor) WMA. Converting all the music at once, preserving the exact directory structure, is more of a challenge than it ought to be – ideally, a command should exist,…

2018-04-18-palmer

2018-04-18-palmer April 18, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2018-03-05-man

2018-03-05-man March 5, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2018-02-04-leo

2018-02-04-leo February 4, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2018-02-02-will-durant

2018-02-02-will-durant February 2, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2018-02-02-age-does-wither-me

2018-02-02-age-does-wither-me February 2, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

2018-01-12-ravel

2018-01-12-ravel January 12, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

nice-html: a fast and fancy HTML generation library

nice-html: a fast and fancy HTML generation library January 11, 2018 by Mike Ledger I’ve been working on and off on a HTML templating library for a few months. It was originally intended for use in Respecify , but that evolved into a single-page application. Thus a library for fast server-side HTML generation wasn’t necessary any more. (Though you could just as well use nice-html on a frontend…

2018-01-10-lazy

2018-01-10-lazy January 10, 2018 = 2 && this.naturalWidth >= 900) { this.width = this.naturalWidth * 0.5; } " /> All images © Michael Ledger, all rights reserved.

Manipulating key-value csv files

Manipulating key-value csv files January 9, 2018 by Mike Ledger This post is about a command-line tool for manipulating map-like CSV data, where the first column is treated as a “key” for that row. This post is largely the same as the README available at https://gitlab.com/transportengineering/csvmaps#unions; except that it’ll (extremely slowly) get buried under other posts I make. I also…

radixtree: a prefix-tree parsing library for Haskell

radixtree: a prefix-tree parsing library for Haskell January 8, 2018 by Mike Ledger This is just a brief post about radixtree , which is a library that: Produces radix (alternatively, prefix?) trees from Text values Provides a generic parser suitable for use with attoparsec , trifecta , parsec , or anything with a CharParsing (from parsers ) Background I’m developing a requirements authoring tool…

nice-html

A nice HTML templating library