Skip to content

Instantly share code, notes, and snippets.

View jbreckmckye's full-sized avatar

Jimmy Breck-McKye jbreckmckye

View GitHub Profile
jbreckmckye / match.js
Last active January 11, 2024 11:35
Wildcard matching string function
"use strict";
function matchWildcard(match, str) {
match = match.replace(/\*+/, '*');
let sn = 0;
let m, s;
for (let mn = 0; mn < match.length; mn++, sn++) {
m = match[mn];
s = str[sn];
if (m === '*') {
// Bail out at end of match
jbreckmckye /
Last active December 20, 2023 12:22
Analysing CSS compilation

^ see above

jbreckmckye / gist:4553c47e1b26dbe6130f1d7736f148d9
Last active November 10, 2023 02:07
JSTOR Open Access Book List
Title Subtitle Authors JSTOR Discipline 1
Tracking Rural Change "Community, Policy and Technology in Australia, New Zealand and Europe" Socio
jbreckmckye /
Created September 25, 2023 21:36
PSX GPU texture pipeline (copied from Reddit, author unknown)

This article is an extract of months of reading about the PS1 GPU and its inner workings. Writing a PS1 emulator is no mean feat, so I would like to help anyone who finds that there is not enough info online about the GPU. I tried to keep it as simple as possible so that it can be understandable by anyone with some basic familiarity with how GPUs work. There might be mistakes in my thinking throughout so any corrections are welcome. Introduction

The PS1 GPU is arguably one of the most complex parts of the whole machine. It does not have any shader support, so it has specialized functions for drawing specific shapes (See NOCASH PSX docs for more info on those). The simple ones such as "Draw monochrome quad" are easy to understand and implement. But how about the textured ones? I always had no clue on how these work. I mean there is some information online about it, but I could not wrap my head around why there are things called "Textured Pages" and "CLUT tables" and how texels get fetched from VRAM. So I am w

jbreckmckye / trnad53
Last active March 20, 2023 22:16
trnad53 script
TRNAD53 is a cut scene file from the original Final Fantasy VII. A map, at the North Cave, where Sapphire Weapon sleeps, Sephiroth waits, and Aeris' theme plays. Discovered early on in leaks of cut content, TRNAD53 has garnered all kind of wild theories over the years. In this video I want to dig into the data and uncover the truth
I've been into the FF modding scene for a while, but Final Fantasy VII has always fascinated me. It's a weird game in some ways, halfway between the classic 16 bit era and the modern, cinematic era. It's development process was turbulent: originally FFVII was about a New York detective chasing an elusive man; but somehow this became cyberpunk mercenary Cloud Strife chasing Sephiroth through Midgar and beyond.
TRNAD53 also has had a turbulent history of rumours and fan theories. Was it an early version of where Cloud gives Sephiroth the Black Materia? Was it an early script where Aeris dies at the North Cave? It *was* known Aeris has post death dialog files, files that come before
jbreckmckye / update-config.js
Created March 13, 2018 11:04
Beanstalk / general-purpose JSON mass updater
const fs = require('fs');
const cliArgs = process.argv.slice(2);
const key = cliArgs[0];
const val = cliArgs[1];
function parseJSON(string) {
const sanitised = string.replace(/\s\$\w*/g, substr => `"__SANITISED__${substr}"`);
return JSON.parse(sanitised);
jbreckmckye / formatters.ts
Created November 23, 2022 12:34
TypeScript functions for printing a matrix of data as either CSV or a markdown table
type Stringable = string | { toString(): string }
export function toCSV <T extends Stringable>(items: T[][]): string {
return => row.join(',')).join('\n')
export function markdownTable (items: Stringable[][]): string {
const asStrings =
row => => typeof item === 'string' ? item : item.toString())
jbreckmckye / penalty.js
Created June 21, 2022 14:18
Penalty of unnecessary async / await
async function addAwait (a, b) {
const resolved = await a
return a + b
function addOptimised (a, b) {
if (a instanceof Promise) {
return a.then(resolved => resolved + b)
} else {
return a + b
jbreckmckye /
Last active November 18, 2020 23:35



Micro-frontends are a strategy for splitting user interfaces up into separately deployable units. This gives teams great latitude to choose their own technologies and think in terms of self-contained programs. However, the "per page frontend" approach has disadvantages: pages cannot be shared by teams; sub-frontends are hard to modal-ise; and the user must download and execute duplicate JavaScript. Nano-frontends are an alternative that give teams similar freedoms but provide opt-in optimisations to improve user experience.

Give me the gist

Write your frontends as libraries that take a) a DOM element to render in and b) a set of common dependencies to call (e.g. React). Then allow a scaffold app to render the entire thing and inject the dependencies. Libraries can be published by writing artefacts to S3 and then monitoring for changes using SNS/SQS.

What does a 'dependency injected' frontend look like?

jbreckmckye /
Last active October 12, 2020 12:00
TypeScript hack: getting access to the members of a union

I had some fun with TypeScript union distributions this weekend. This is a (kinda) hack around conditional types that lets you access the individual members of a union in a generic type.

A usecase for this might be when your function accepts items from a union of types, but you want all your function parameters to be consistent in which 'branch' of the union they specify.

Let's say you have a type representing some events (this is a contrived example but simple)

type Events =
 | { kind: 'loading', data: void }