Abstract Nonsense

A place for musings, observations, design notes, quick tips...
thought gists, if you like.

Surely you're `jq`ing

Today I read through the jq manual cover-to-cover. For those unaware, jq is a popular CLI tool to query and manipulate JSON. It’s also a Turing-complete mini-language with nice functional semantics that fits well into the ethos of composable CLI tools.

It was an exemplar of well-written technical documentation. Concise, well-written, littered with examples, and linking to an interactive playground to test-and-learn.

Some learnings:

  1. It’s surprisingly functional! You can implement recursive functions and use higher-order functions! For example, here’s factorial in jq:
jq '[.,1]|until(.[0] < 1; [.[0] - 1, .[1] * .[0]])|.[1]'
  1. It supports string interpolation - this is really nice if you’re piping stuff from JSON into a string. Coupled with format strings this becomes frictionless:
$ echo '{"search":"hello; world"}' | jq -r '@uri "https://www.google.com/search?q=\(.search)"'
# https://www.google.com/search?q=hello%3B%20world
  1. You can define functions that accept functions1, and control structures that allow labelling.
echo '[[1,2],[10,20]]' | jq -r 'def addvalue(f): . + [f]; map(addvalue(.[0]))'
[[1,2,1], [10,20,10]]
  1. You can traverse complex data structures with first-class pathing support. And you can easily modify nested structures to extend objects.
  2. For the category theorists/polyglots, there’s a denotational semantics paper written about jq.
  3. Bonus: You can build a Brainfuck interpreter in jq; and you can build a jq interpreter in jq - how’s that for bootstrapping!

Side note: This is one of my goals for 2025 - read through documentation end-to-end to develop mastery over tools. I’m trying to prioritise selectively depth over breadth.


  1. The line between “functions” and “filters” is a little blurry to me. ↩︎

Developer Ergonomics

“I wonder how much it is insightful to watch someone doing a workflow and to note when discomfort kicks in. That’s a really insightful thing to realize what matters from bitter experience, right? … Experience tells you when to worry about something and when not to worry about it” - Ben Sparks

That is - the rising discomfort of a programmer when employing a new tool, framework, or library is a good window into the ergonomics of how one uses your tool, framework, or library. Source: How I animate 3Blue1Brown | A Manim demo with Ben Sparks. The whole video is worth checking out! It’s a masterclass on how to construct a programatic-animation library and demonstrate how to work within it.

When I get a chance, I’d love to unpack the source code for how sprite-to-sprite transforms (part of 3B1B’s signature look) and the vectorised rendering engine are implemented with OpenGL.

Week 22

  1. I noted that there’s a difference between Anomaly detection and Outlier detection.
  2. Word of the week ~ enjambement

    enjambement: (in verse) the continuation of a sentence without a pause beyond the end of a line, couplet, or stanza.

  3. As an aside, I find Rust as a language fiendishly complex at a first glance, and I’m amazed by people who find it so straightforward. Having said that, I’d much rather have lived in a universe where Rust was the first ’low-level’ language I learnt instead of C.