Jack Harrhy
Linkblog /2025/04/11

Bickle - Gut Feeling, Python Template Strings, Tofu Engine, a love letter to level editor icons, the armchair of great blogging, Jane Remover Interview, twilight of creativity, Xbox 360 BadUpdate.

Bickle - Gut Feeling

New Bickle album, its good

Joe Marshall - Lisp Programs Don’t Have Parentheses

Lisp programs don’t have parentheses — they are made of nested linked lists. The parentheses only exist in the printed representation — the ASCII serialization — of a Lisp program. They tell the Lisp reader where the nested lists begin and end. Parenthesis are the contour lines in the topographic map of your Lisp program.

A lot of the memes about Lisp are on its usage and abuse of parenthesis, but as Joe points out, that’s basically the easiest way you can represent a nested link list in an ASCII text file, its just representing a construct for us to consume.

PEP 750 – Template Strings

template: Template = t"Hello {name}"

Python is getting template strings!

A friend asked the honestly good question, what above would be different from say, f"Hello {name}"?

The above expression, say if name was "John", would resolve to "Hello John", but the template becomes basically a unresolved object, its not just stringified right away, its left in a state interpreted later on.

JavaScript has had this with ‘Tagged templates’ for some time now, one of the best examples of this is what Drizzle uses that feautre for: Magical   sql   operator 🪄:

import { sql } from 'drizzle-orm' 

const id = 69;
await db.execute(sql`select * from ${usersTable} where ${usersTable.id} = ${id}`)

Will generate the following SQL:

select * from "users" where "users"."id" = $1; --> [69]

If the above was just string interpolation, you’d have SQL injection fun if id was user controlled, but as you can see by the generated SQL, that field is correctly broken out into a parameter thats passed in separately.

So while template strings in Python might not be super useful to regular users of the language, it will hopefully give library authors interesting ways to expose interfaces to users, I’d love to see a SQLAlchemy Core interface built using this, since I like aspects of SQLAlchemy but I would rather just have my hands directly on my dear SQL syntax please.

Tofu Engine

Tofu Engine is a free and open self-contained game-engine suitable for small-to-mid 2D projects.

It is entirely self-contained, as no additional runtime modules/libraries required (system-wide libraries excluded). Everything is bundled in the engine executable.

Very cool engine!, here’s a selection of its features I find really cool:

  • Fully scripted in Lua.
  • Array of predefined common/famous resolutions (e.g. C64, Capcom’s arcades, Nintendo DS, Sony PSP, etc…).
  • Predefined library of 8/16/32/64 colors palettes.
  • SNES’ Mode7-like transforms, with scan-line based (HDMA) changes.
  • Library of “retro-feel” post-effects (LCD, CRT, color-blindness, etc…).

Setting up a project is done via a cute little .toml file:

[display]
title=Hello, Tofu!
width=320
height=240
scale=0
fullscreen=false
[keyboard]
exit-key-enabled=true

And then a lil main.lua:

local Class = require("tofu.core.class")
local Canvas = require("tofu.graphics.canvas")
local Display = require("tofu.graphics.display")
local Font = require("tofu.graphics.font")

local Main = Class.define()

local MESSAGE <const> = "Hello, Tofu!"

function Main:__ctor().
  local palette = Palette.default("pico-8")
  Display.palette(palette)
  ...
end

function Main:render(_)
  local canvas = Canvas.default()
  ...
  self.font:write(canvas, x, y, MESSAGE)
end

return Main

You can see the full example on the ‘getting started’ page.

To me, this feels like a retro LÖVE, very nice.

[…] multi-platform through cross-compilation (Windows, Linux and Raspberry-Pi systems are supported – macOS isn’t currently on the radar […]

Sadly I won’t be able to give it a go since my daily driver right now is a Macbook.

erysdren - a love letter to level editor icons

i want to show you some cool art from the late 90s and early 00s. this art was only ever intended to be seen by the developers at a select few games companies, and thus may contain obscure in-jokes and references that nobody outside of the company is likely to understand.

Classic Hammer entity icons.

hammer_icons.png

ava - the armchair of great blogging

This is the Armchair of Great Blogging.

You should go see the armchair of great blogging… so cozy.

I need me an armchair of great linkblogging.

And maybe one day blogging but for now I just linkblog… soon…

Anthony Fantano - J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-J-JANE REMOVER INTERVIEW

This is a great candid interview between Anthony and Jane, great watch.

Jane dropping the Dariacore name was funny to me, but, TIL, she coined the Dariacore term in 2021 with her album called Dariacore, wow.

I have a lil playlist of some Dariacore type tracks, daria, it needs growing.

Also Jane is still rocking FL for all of this… respect.

Also Sony Vegas for video editing, truly of a better era.

Mr @snakesandrews AKA the Horse Race Tests ring leader, has been bumping Psychoboost.

zeerooth - The ultimate twilight of creativity

A quite absurd thought has been on my mind for quite some time. It’s a fact that since the dawn of Anthropocene, humanity has accumulated so many stories, books, music and later films, games, animations, videos, that a single person couldn’t possibly consume all that media over their lifetime even if they wanted, much less remember all of it.

[…] if you can think of a story, there is a big chance that it, or something similar at least, has already been told

[…] The only realistic impact you can really make as an individual is on yourself and people around you, so just make shit for the fun of it. Not for seeking validation, chasing after ideals, or some extrinsic motives.

Found on Andreas’s Linkdump No 50.

MattKC Bytes - How does BadUpdate take control of the Xbox 360? (A Technical Analysis)

I wasn’t aware of just how well protected the Xbox 360 has been from software based attacks until now, and it looks like the battle still isn’t won as its not a homebrew / mod that persists across reboots.

MattKC goes into depth covering grimdoomer/Xbox360BadUpdate, in which is covered by one the authors of the exploit in his own part 1 / part 2 on the topic.

Good watch as always from Matt!