RSSAmplifier

Blog

the spatula

Recent content on the spatula

thespatula.ioRSS feed ↗65 posts

Latest posts

Under the Sun

It has been some 20 years since I last read the Bible. I can’t say I was particularly impressed by it at the time; the oft rambling, repetitious and contradictory mess that it is. But, today I am an older man — though not an ounce wiser — and the palpable presence of death looming at the end of every prostate exam brings up the spiritual tendencies in me, or at least the pretense thereof.* When…

PDF from EPUB

At the current juncture, where the internet is still open enough to be searched by agents, and models have minimized many of the issues of earlier versions, it feels like we’re kind of in a sweet spot between the old and new web. By the new web, I mean a time where data becomes increasingly walled off, and access falls almost entirely into a transactional model. The Peter Watts Rifters trilogy…

Filling a learning gap

I’ve been working on a project which generates podcasts for learning specific grammar topics in Mandarin. There are plenty of Chinese language podcasts, but the majority are dedicated to beginner and intermediate learners, and few are devoted to grammar. What I wanted was something short and focused so I could use spaced repetition to hit a few topics at a time. For things like this I’m more…

Exploring Arabidopsis Thaliana: Part 1

I recently finished Light Eaters: The New Science of Plant Intelligence which was an interesting look at some of the recent, and recently revived, research into how plants interact with one another and with the world at large. If you haven’t read it, and are interested in some of the contentious areas of current scientific research in botany, then I’d recommend it. In the book, there are two…

2026 books

Non-fiction Would recommend Nature Underfoot by John Hainze This was a delightful and detailed look at a handful of creatures, some of which we might refer to as invasive. The author jumps around at times, and perhaps a bit more than I’d like, but I thoroughly enjoyed both the deep dive into specific species as well big picture view of their ecological importance. Light Eaters: The New…

Katydid (Tettigoniidae) - Taiwan

I found this slightly-worse-for-wear little one resting on a prehistoric-sized elephant ear (colocasia) plant. These are not a common sight along my regular hiking trail, and I’m wondering if I only was able to get a photo was because it was a bit rough around the edges. As far as identification, this one is a bit tough. After looking through TaiEOL I believe it may be a Duceti, known in…

2025 books

This is the first year I’ve done this, and I only started recording mid-way through year. In looking this list, I feel I’ve missed a handful. Non-fiction How Insects Work by Marianne Taylor How Insects Work is by no means a comprehensive work, but it is a fantastic introduction with enough breadth to give one the foundational knowledge they’ll need to go deeper. For a novice, she…

Pilgrim at Tinker Creek

The plum rain, heavy throughout the morning, now lingered, tapping an idle rhythm on the rusted metal awnings that hang like so much tetanus over Taipei’s sidewalks. I walked, umbrella in hand, toward the park and a reprieve from the claustrophobia of the neighborhood. You forget how clean air can be until you’re walking among trees in the rain. I take the well-manicured path that winds…

Leaving no stone unturned

When my wife and I look for a new place to eat, we’ll search through an app, sort by rating, and read a few reviews. Once we’ve optimized our choices, we’ll pick one and go. Something about this process has always unsettled me, and as I’ve gotten older, I’ve come to realize why. In my late 20s, around the mid-2000s, I broke up with my girlfriend of 5 years, and soon…

Rust - A low-level echo server using io_uring

Introduction This is part of a series where I’m working towards building a game from scratch using Rust. By scratch, I mean using only the standard library as much as possible. So far, the only thing that has been somewhat of a cheat was creating io_uring bindings. If you don’t want to listen to me prattle on for pages, you can find the repo for everything here. Today’s goal In this article…

Rust - Using io_uring through your own bindings

Introduction This is part of a series where I’m working towards building a game from scratch. You can find the repo for everything here, and the last part of the series where I did WebSockets is here. Backtracking, in case you missed any or everything prior to this, I am trying to build everything using only the Rust standard library. Up until this point that wasn’t too difficult, but then I…

[CSA]: Static site with AWS

Disclaimer: This is partially based on the requirements of Coursera’s AWS Solution Architect’s course and the exam itself. You can think of these more as notes for myself as I’ve gone through the course in preparation for the exam. Also, these are written as done from the CLI, and using CloudFormation, which I prefer to the web console. You can find the YAML file for CloudFormation in this repo,…

Taipei

Taipei wears its flaws on the outside; on the weather-worn tile facades, dilapidated signage and the collections of miscellaneous things that often crowd entrances and walkways. × function openModal(src, id) { console.log("lfsdfasdklfjaASdfasdf", id); document.getElementById("myModal-" + id).style.display = "block"; document.getElementById("img01-" + id).src = src; } function closeModal(id)…

[CSA]: Adding groups and users in AWS

Disclaimer: This is partially based on the requirements of Coursera’s AWS Solution Architect’s course and the exam itself. You can think of these more as notes for myself as I’ve gone through the course in preparation for the exam. Also, these are written as done from the CLI, and using CloudFormation, which I prefer to the web console. You can find the YAML file for CloudFormation in this repo,…

Rust - Implementing WebSockets

Introduction You can find the repo for this series here. You’ll want to look in the 2_websockets folder. In the previous sections, we wrote the Base64 and SHA-1 modules in anticipation of needing them for our WebSockets. What we’ll do in this post is not the final step for this module, but much of the core functionality will stay the same. Essentially, this is going to be an echo server, and…

Rust - Base64 encoding and decoding

Introduction If all you want is the code, then head over to the repo. This is the second part of a series where we’re building an online game in Rust from scratch. In the first section we went through an overview of how websockets work, and the steps towards connecting to a server, though the code we wrote only dealt with SHA-1 portion of the initial handshake process. In this article…

Rust - Implementing SHA-1

Introduction If all you want is the code, then head over to the repo. There is also a video. This is the start of a project I’ve wanted to do for a while now, building a websocket-based game from the ground up using Rust. I’d like to do it while also teaching some of the fundamentals of the language. By ground up I mean using only the standard library for anything which does not touch…

SvelteKit (Svelte 5) and Supabase

SvelteKit (Svelte 5) and Supabase Just get the code. I’m a big fan of the bases, such as Pocketbase and Supabase. They make getting small projects off the ground relatively easy, though at times the docs could use a bit of love. For instance, the Supabase SSR Auth example works, but it’s mostly copy-and-paste and hope it works. There’s not much of the why, or an understanding which could help…

Rust - Option and Result

Introduction This is a companion, or reference article for the series on creating a game in Rust which starts here. Its intent is to provide a baseline understanding of the Option and Result types. This is not a complete overview by any measure, and readers are encouraged to look at the official docs and Rust book for more information. Option and Result You are going to see both Option and Result…

SvelteKit and Stripe demo

For those who just want the juice, here’s the repo. Introduction I’ve seen a number of Stripe tutorials on how to set up subscriptions and do payments with SvelteKit, but for my own benefit, and I hope others, I want to do a deep dive to make sure I really understand what’s going on. Disclaimer: I’m not an expert, so if you see issues send me an email or submit a pull request on the repo,…

Clickbait detector

Introduction YouTube is an amazing site, but it’s not without flaws. One of the things I’ve grown irritated with is the use of clickbait tactics in videos which arguably shouldn’t have them. By clickbait I mean things like: Red (or yellow) arrows and open mouths as far as the eye can see. Also these ubiquitous red circles: Because we wouldn’t know where to look otherwise.…

Growing up

Getting old is inevitable, but growing up is a choice. What the latter means is debatable, but it seems, at least from my perspective, much less enjoyable than the alternative. Shortly after university I went to visit a friend living in Madrid. I’d quit my job and used what I’d saved to get a flight and a room for a few months. After a short time, I’d developed a routine of eating lunch in a…

Notes on Rust's borrow system

Note: I’ll be adding to this in the future This is not a general introduction to Rust’s borrow system or the use of lifetimes, but notes on scenarios I’ve encountered and how I’ve understood them to work. People far more capable than me have covered this topic, such as here and here, for example. These are written as much for myself as they are to help people who may be experiencing…

AI FAQ: Word2Vec - Skipgram

This is part of an [FAQ)(../faq_index) for AI concepts. Introduction The Word2Vec model is one of the better known methods for creating word embeddings, aka a bunch of vectors from which we can infer relationships within our data. If you’re not sure I mean by any of that, read the links in the last sentence and then mosey on back, otherwise, read on. The goal It will probably help if we have…

AI FAQ: Token

This is part of an FAQ for AI concepts. The word token, at the bare minimum, is a unit of data. In the majority of cases you’ll come across, it will refer to textual data within natural language processing (NLP). In this context, token may refer to a single word or part of a word. For example, you could use the word unadulterated as a single token or break it into pieces like un-adulterat-ed or…

AI FAQ: Embeddings

This is part of an FAQ for AI concepts. Embeddings You’ll hear a lot about embeddings when you start looking at machine learning models. What an embedding is, in broad terms, is a way to take your data, whatever it may be, and turn it into something which can be used by machine learning models. These days, most models are based on neural networks, and require some sort of fixed-length input…

Question builder

About I built this around the time OpenAI came out with their API, and have only touched it up a little so I could put it out there for others to learn from. I never had any intention of turning it into a product, and if I did, I’d have to come up with a better name than the on-the-nose Question builder, and called it Questzinga! or something equally inane. You can check out the repo if…

AI FAQ: One-hot encoding

This is part of an FAQ for AI concepts. Turning words into digits When turning words into vectors one of the simplest techniques for doing so is to use a method known as one-hot encoding. With one hot encoding each word is encoded as a binary sequence N digits long, where N represents the number of unique words being encoded. For example the sentence “This is my boom stick” would have…

AI FAQ: Word vectors

This is part of an [FAQ)(../faq_index) for AI concepts. In order for a computer to understand words we first need to turn it into numbers, since computers relate to everything through numbers stored as binary. We already store individual letters, numbers and symbols as binary using the ASCII table. Character ASCII Code (Decimal) Binary Representation A 65 01000001 a 97 01100001 B 66 01000010 b 98…

AI FAQ

These are questions I’ve had, or that I thought others who are exploring AI and the most recent advances in language models. What I hope these become are answers put into the simplest possible terms while backfilling what is often presumed to be common knowledge in the field. Each section will be kept short, and then link to more details elsewhere. Transformers What is the transformer model?…

Taking away

I’m not a complicated person. Ok, that’s a lie, just look at my docker-compose.yaml. Actions speak louder than words, and I now have pages of them. I started innocently enough, with a development setup for my front and backend, then added a database and Redis and finally pgAdmin and a handful of other containers. The wiring started looking like the back of my parents entertainment center circa…

Microsoft learn's AI course

From the perspective of someone who has been teaching for the last 15 years, the Microsoft Learn platform is frustrating on so many levels. There is plenty of content, some of which definitely wasn’t AI generated, but in the end it feels like a poorly formatted series of textbooks with a handful of useful projects tacked on. For a multibillion dollar company it’s a poor attempt at education…

Async rationality

An insistence on rationalism requires a chain of logic that homogenizes everything it touches. Like async in Rust or JavaScript, nothing other is allowed to play along. It softly - no scratch that - loudly knifes mystery in the back, forcing all unturned stones into a probability distribution dictating that nothing is below but dirt, bugs and gravel. With this you cut the heart out of hope for…

Wababi, why?

Recently, a friend asked if I could help out with small project that required uploading and serving images. He chose Wasabi to store these. If you’re not familiar with Wasabi, it’s a cloud storage provider that uses the same API as Amazon S3. As someone who is not too familiar setting up this sort of storage service, I decided it’d be a good learning experience. In the end I was…

Unsocial media: The world is born

Introduction In the last post we looked at how to organize the data for our project, something which upon starting the code side of the project, I already realize will need to be revised at some point. Fortunately, it won’t affect anything we’re doing here. As with prior posts, you should consider this one a rough draft. I will be revisiting each and revising as I go forward. The goals…

Chinese Banyan

These trees are everywhere in Taiwan, with the most impressive ones often found near temples where they’re left to grow to a massive size. Near a temple in Taitung As you can see in the above photo, the root system spreads out beneath the canopy, dripping down towards the ground. These roots are adventitious in nature, meaning they’ll extend out from any part of the tree. If they reach…

Twoleaf nightshade

I’ve found these small shrubs all over Taipei, mostly in parks and areas disturbed by people. They seem to fill the gaps wherever they can, though they can be crowded out in wilder areas where the more quickly growing local plants take over. They otherwise seem hardy, needing only partial sunlight. Growing rigid deep green leaves in pairs gives them their name twoleaf, which is the same as…

Cassia javanica

I’ve come across this tree in a number of parks here in Taipei. The spring blossoms are exceptionally vivid and their remains blanket the ground with pinks, yellows and reds as summer nears. An example of a tree in full bloom. Source The leaves are distinct, with twelve leaflets coming off a single stem, referred to as being pinnately compound. This notion of leaves in leaves is known as…

GPTease: In the abstract

One thing I’ve been impressed with is the ability of ChatGPT v4 to apply patterns from one context to other. This sort of abstraction is relatively easy for people to do, but for a computer it has always been much more difficult. To see what I can get away with, I’ve steadily increased what I perceived as the difficulty of the task as I’ve gone through. In some cases I reprompt…

Fourplay: A multiplayer word game

Introduction When Svelte 3.0 was released in 2019 I came up with Fourplay in order to give it a try. At the same time I wanted to try out Actix, and the actor model. Four years later, with a mind mostly wiped of the experience, I figure it’s time to write about it. In looking over the code, I find myself both surprised and ashamed. Surprised by the ridiculous backend I built, and ashamed by the…

GPTease: Stacks on stacks

There’s a lot of debate on where ChatGPT stands with regard to being able to reason. Papers such as Sparks of AGI make the case for version 4.0 being a sort of proto-AGI. While it’s interesting to think about, I’m more interested in what I can get it to do. This is the first in what is likely to be a series of posts where I poke and prod and see what I can get out of it. These are NOT…

Unsocial media: The Data

Overview Now that we have an idea of where we’re headed, we can look at the technical side of things. We’re going to start with the data, since the way it’s shaped will inform a number of decisions going forward. Tables I plan on having us use a relational database, and make use of the Postgres JSON type for fields which contain an arbitrary number of subfields. It will also make API responses…

Kids

“I’d stab someone in the eye for a full night’s sleep,” was the message I received early Tuesday morning from my friend. He and his wife recently had a baby boy, a cute little guy named Evan that pisses and shits and has rewired their brains to do the silly things new parents do. In the months leading up to the birth I watched him prepare to be a dad, while also making plans on how he’d attempt to…

NIMP: Getting started

Motivation I’ve been hooked on MMOs since I played MUDs as a kid, but it was Ultima Online (UO) that really opened up what was possible for me. There’s something special about building and maintaining a world with thousands of other people, most of who will happily stab you to death the minute you leave a safe area. It’s as if we’ve taken the complex systems of the real world and…

API endpoints in SvelteKit

Intro Note: This tutorial follows, in part, the code which can be found at this repo. I’d recommend cloning this and following the setup instructions to see things in action first. Over the past few years I’ve come to enjoy working with Svelte, and in particular SvelteKit. It reduced a lot of the friction I had experienced in the first years of the single-page app (SPA) frenzy, when…

Tailored materials for education

A common challenge teachers face is finding quality materials for the classroom. This is especially true for niche subjects or those without an official curriculum. At my previous school, a colleague and I spent significant time developing and updating materials for our middle years technology/multimedia classes. The classes were essentially a design classes, incorporating elements of design…

SvelteKit's load

SvelteKit’s load function is run prior to the page being rendered, whether it’s done on the server side with SSR or on the client side. It allows us to retrieve data, do redirects, and other processing before our route renders the +page.svelte file. That means we can do things like query our database, call a third-party API or other processing, and make decisions which will affect the output of…

About

Why I started this blog in order to help future generative AI models. They need content generated by honest-to-goodness real people, and if there’s anything that I am, it’s that. The site itself is a modified version of Liva Hugo. Me Carbon-based, somewhat sentient, lover of sun-warmed spots on the carpet. Unfortunately, having lived in Asia for the last decade plus, I’ve been…

Instructional Design

Storyline Articulate Demos exhibiting different techniques within Storyline Articulate. Interactive map of Central America animations non-polygonal partioning An interactive map which show information of different Central American countries on selection. A quiz on encryption quiz scoring An example of creating a custom quiz template and scoring page. Color selector javascript buttons Shows how you…

Projects

I also have a portfolio section which is particularly for instruction design. Web development APro node.js vue.js typescript kysely postgres SEO tools website using a mixture of APIs (Adwords, OpenAI, Azure, and others). I took over the project when it was still using Java with Play and then later rewrote the backend with Express, Redis, Kysely and Postgres using TypesScript. Images ▲ × var…