RSSAmplifier

Blog

Ellie's Blog

ellie-g.comRSS feed ↗42 posts

Latest posts

Programming Language Picky Eater

As you might expect from someone who tried her hand designing a programming language , I have a lot of strong opinions about language design. Recently I’ve been thinking about doing some hobby programming, but lately I haven’t found any languages to my taste. Maybe I’m just too picky? Probably my most subjective requirement of a language, but also the one I feel most strongly about: ahead-of-time…

The Perils of ISBN

Last year I got into using Letterboxd, to complement my goal of watching more (good) movies [1] . It’s got a really clean interface, the social features are useful but unobtrusive, and it makes remembering what I’ve watched and when I watched it easy. So why isn’t there a Letterboxd for books? Funnily enough, Letterboxd still describes itself as “like GoodReads for movies”. But GoodReads itself is…

Hot Reloading for Rust Gamedev

An Idea I used to think hot reloading was something only “managed” languages could do, not “compiled” languages. When I change a React component it can update on the page; when I change a line of code in a Rust daemon I have to kill the program and bring it back up. This makes writing games in the “compiled” languages somewhat painful. Games tend to be highly stateful; if a bit of behavior only…

Return-Position Borrows in Felt

Felt Context Feel free to skip this section if you’ve been following my little PL project. I’ve been working on a programming language called “Felt” [1] for the past couple years. I last wrote about it during my batch at the Recurse Center , and that blog post remains a good overview of the general vibe of the project. One of my goals with Felt is to create a simple programming language that…

Introducing Mirror Darkly

Recently I built a little tool I call Mirror Darkly [1] . It exports my blog posts from an Obsidian vault to the blog’s git repo. The meat of the work is being done by the excellent obsidian-export crate and its dependencies. Mirror Darkly adds a few features on top: You can define a JSON config to map multiple paths within one vault to various locations on the filesystem (for example, I have my…

Quick Advice to New Rustaceans

Let’s say you’re new to Rust. Maybe you’ve read TRPL and worked through Rustlings or YARR . You can write enough Rust to solve problems, and can fix compiler errors when they crop up. Now you come to a more nebulous question: how do you write good Rust? And how do you write Rust that won’t require mortal combat with the borrow checker? Start by letting go of a no-compromises approach to…

Recurse Center: Weeks 10 - 12

As I said in week 9 , personal life and my job search were headwinds on the last chunk of my batch. In the last quarter I didn’t have time to write individual week-summary posts, so instead I’ll group them all here. Over the last three weeks of my batch, I: Rewrote Brick’s error handling. Instead of dumping the Debug representation of errors, it now gives the location and error message in a…

Recurse Center: Week 9

Personal life and my job search continue to slow my RC progress slightly, which I expected for the back half of my batch. This week had the second Impossible Stuff Day of my batch. I decided to fix a performance issue with testing brick-ld , which took the test suite runtime from ~11 seconds to ~0.5 seconds. The optimization is based on chunking multiple source files into the same binary , and…

Recurse Center: Week 8

Personal life got in the way for 2 of the 5 days of Week 8, which is unfortunate but happens. I only had time to focus on one project this week, but it was a chunky one: I wrote a linker for Brick ’s toolchain. This isn’t my extremely cursed wasmtime-dl project . It’s a crate that takes multiple WASM modules, resolves any exports that match imports, smooshes them all together, and outputs a single…

Recurse Center: Week 7

In the back half of my batch, job search and life have begun to cut into my RC time just a little. I’m feeling a little bit less productive as a result, but did get some stuff done: The wasmtime-dl blog post is out , which is my longest post yet (both in terms of my RC batch and all the posts before it). I’m pretty proud of it and feel excited to write more deeply here. To get that blog post…

High Crimes and Misdemeanors with WASM and Dynamic Linking

In my programming language , currently codenamed Brick, I want to allow developers to pull in platform-native libraries written in other languages. Brick compiles to WebAssembly (wasm), and wasm is totally sandboxed by design. Without functions provided by the environment (“imports” in wasm lingo), a wasm module can have no side effects when run. I want Brick programs to have plenty of side…

My First NPM Package: markdown-it-callouts

I’ve got a blog post in the works that uses infoboxes. Previously I had a little snippet adapted from eleventy-notes so I could parse Obsidian callouts into aside elements, but now I wanted to have special styling. [!info] They look like this! It’s like my styling for asides, but a little more flexible. The colors can be changed, and a little symbol can be configured to show up next to the title.…

Recurse Center: Week 6

I’m halfway through my batch already! That can’t be true, can it? It feels like I just started! This week I: Focused on Concerto . I got decent-sounding bells synthesized via Web Audio, and rewrote the backend to sync notes between clients. After an afternoon of wrangling with GCP I got the project deployed, and showed it off at Thursday presentations. Made some progress on my browser.engineering…

Recurse Center: Week 5

During week 5, I mostly dedicated my attention to a project I’m calling “concerto”, which I started in week three . It places users in a virtual world and allows them to play music notes, and simulates the notes expanding around the world. My initial draft in week 3 used 2D rendering and very basic note synthesis; this week, I moved to 3D rendering. I started with some very basic ThreeJS tutorials…

Learning What the Heck is Inside SQLite

Starting my batch at the Recurse Center, I knew one of the things I wanted to learn was the basics of database internals. My goal was to answer a basic question: “what does a database look like physically, from the perspective of files on disk?” B+Trees I started with “Build Your Own Database From Scratch In Go” . By working through the first half of the book in Rust, I learned: “Logs” in…

Recurse Center: Week 4

In my fourth week I focused on the Recurse Game Jam, which ran from Monday to Thursday. I teamed up with Robin on her game puzdug-x86 , a roguelike puzzle dungeon in x86 assembly. The game includes fog of war, player movement, mostly-static enemies, a win and loss condition, and color ASCII graphics. Robin had set out to make a game that fit in the boot sector, and we did briefly have a build that…

Drafts that Fail Safe

Last Friday I published a post on my blog entirely on accident. It was a short outline of just a few bullet points, sent to be turned into a full post over the next couple weeks. I thought it may be interesting to write a tiny incident report about how it happened and what I’m changing to avoid it happening again. My blog workflow mostly involves shuffling static files around between Obsididan and…

Learning About the Language Server Protocol

As part of my programming language project , I’ve been writing a language server. I’m familiar with the very basics of the LSP from integrating Neovim with projects like rust-analyzer , but this is the first time I’ve dug into its internals. The protocol consists of JSON messages exchanged [1] between a server and a client. The server understands the programming language and does all the…

Checking train times with Shortcuts

I live in Jersey City and rely on the PATH to get into the city. During commute windows, headways are conveniently every 5 minutes. Outside of those windows, the Newark↔World Trade Center line plummets to every 20 minutes. There’s no use leaving my apartment whenever I’m ready; I have to plan around the train schedule. The PATH’s app does not make this easy. Real-time station information can be…

Recurse Center: Week 3

My third week at Recurse was a little more eclectic than the past two: I got halfway done with my plans to add subscription support to my toy document store - currently you can subscribe to individual documents, but subscriptions to collections of documents aren’t supported. For “Impossible Stuff Day” I started on a web toy that connects many users, all playing piano notes that propagate from…

Recurse Center: Week 2

Orientation is done! We’re in the batch for real now. A few folks in my batch were interested in the CodeCrafters SQLite course , so I gave that a try. It didn’t end up meeting our expectations. Rather than giving any sort of step-by-step explanation of what you should do, the course just sort of links to the SQLite docs. I attempted to forge ahead regardless; after much frustration I made some…

Writing a Programming Language for Fun

For a little under a year I’ve been working on a programming language project . It’s a high level language that compiles to WebAssembly, designed to small games or scripts. Here I’ll introduce the language, explain my design decisions thus far, and complain about naming things. An Example Before I get into the weeds, I figured I should show off what a snippet of the language looks like: import…

Recurse Center: Week 1

I’m one week in to my batch at the Recurse Center ! Here’s what I’ve done and learned so far. Monday and Tuesday were a little more orientation-y last week, so I got to virtually meet a lot of folks from my batch and get a sense of what other people are working on. Despite coming in with no interest or experience in audio programming, the enthusiasm of some other folks may sway me to try to learn…

How to add a custom LSP server to nvim-lspconfig

Normally the nvim-lspconfig package has every language server I could possibly want, so I’ve found it pretty low maintenance. Currently I’m testing out the server for my own programming language, and I needed to add the LSP to my editor’s config. It was a surprisingly annoying task! I wanted to share the little snippet I used to get it configured. Briefly I considered forking nvim-lspconfig and…

Hello Recurse! (Week 1, Day 1)

Today I start a 12-week batch at the Recurse Center ! Here at the outset my goals are: Write a toy database! I’ve used databases before but never written one, and have no idea how database internals work. This is currently my main interest Explore distributed systems! I want to get some exposure to some variety beyond client/web server/database, especially streaming video. Go down a rabbit hole I…

Neovim and VSCode

Around a year ago, I decided to use Neovim as my editor for working on Unity-based projects. After some involved setup , I thought I had everything just how I liked it. Then my autocomplete broke one too many times, and I knew it just wasn’t worth the hassle. It was time to bite the bullet and use VSCode; but could I do that without giving up Vim? Most text editors targeted towards programmer…

Using Neovim with Unity

In the last few years I’ve switched fully to Neovim, and embraced the lua scripting and built-in LSP support. Most development I do these days tends to be TypeScript or Rust, and my editor’s integration with tooling like prettier, rustfmt, rust-analyzer, and tsc is great! Having recently started doing some work in Unity, however, I discovered that I would have to get my hands dirty for a good C#…

Falling in love with git bisect

Recently I found myself tracking down a handful of regressions: bugs I knew hadn’t existed just a week or two before. I vaguely knew that there was a git command that could help me, but I had never really put it to serious use. Now that I have used it, I find myself falling in love with git bisect . bisect , in the style of all things git, is slightly arcane and clunky but powerful nonetheless.…

Dark Mode!

If your browser is set to dark mode by default, you’ve probably noticed the site looks different! I now have some dark mode CSS, so this blog isn’t eye-searingly white if everything else is dark on your screen. Under the hood I’m using a neat CSS feature called CSS variables to switch the colors. Unfortunately this means old posts with syntax highlighting have lost syntax highlighting, because…

Quicksilver and Open Source

So this is a post that’s been bouncing around my head for a while, in one form or another. I created and maintain Quicksilver , a 2D game framework for creating games for desktop and the web. The reason I’m writing this post is that I also haven’t used Quicksilver to make anything for over a year. TL;DR: Quicksilver has been a source of great joy and frustration for me, and was my first real…

A New Quicksilver Crate, Elefont

This blog post has been a long time delayed, but late is better than never! The Quicksilver alpha is humming along, with bugs and API problems being addressed. While that work continues, I want to unveil elefont , a crate that I’ve developed for font caching. What is Elefont? Elefont is a glyph caching layer, intended to reduce round-trips to the GPU when rendering text. When a glyph is sent to…

Website Makeover, Again

Out with the old, in with the new! After some frustration with Hugo, I’ve moved to Zola and some light CSS. I wanted to write a new blog post regarding elefont and Quicksilver’s new text rendering system, but I was dreading making a post on the site. Hugo had proved opaque and fragile for me, and its blizzard of configuration options wasn’t making things much easier. Plus, something small broke…

A Quicksilver Chanukah, Day 8: Rust Gamedev and the Web

This year has been great for Rust gamedev on the web. Huge progress has been made towards a full game stack being available more-or-less “for free:” most of the foundational crates have available web support, in one way or another. Windowing and Input For opening a window and receiving events from it, the Rust ecosystem has winit . Along with Héctor Ramón (hecrj) and and Ben Merritt (blm768) , I…

A Quicksilver Chanukah, Day 7: Quicksilver's New Graphics

The graphics API of Quicksilver isn’t as dire need of a rework as the lifecycle APIs , but I wanted to take the next breaking change as an opportunity to address some long-standing issues. In no particular order, they are: Low-Level Access As it stands, Quicksilver talks to a very specific backend design for graphics. The API is internal-only and designed to wrap up all the GL code in one place,…

A Quicksilver Chanukah, Day 6: Quicksilver's New Lifecycle

Quicksilver has always had some major API compromises to deliver on its core promise: write a game once, and it targets desktop and the web with no changes. The two ugliest compromises are the State and Asset APIs, for managing your application’s core loop and file loading, respectively. State is a trait that Quicksilver uses to manage when your code runs. It requires you define the new method, as…

A Quicksilver Chanukah, Day 5: Golem

golem is a mostly-safe graphics API that targets OpenGL 3.2 and WebGL 1 that helps make writing GL less painful. Why golem and not X If you’re just interested in what golem is and how it works, feel free to skip this section! The previous three days I’ve introduced new crates that mostly stood on their own. I’m not aware of any fleshed-out alternatives, so creating those libraries myself doesn’t…

A Quicksilver Chanukah, Day 4: Blinds

With the recent update to winit , it gained web support! This is great, and it means that Quicksilver doesn’t need to have its own parallel implementation of windowing. However, there is room for an abstraction that’s a little simpler than Winit, and takes advantage of async/.await , which is where blinds comes in. blinds is based on winit , but focused on Quicksilver’s specific use case of…

A Quicksilver Chanukah, Day 3: Gestalt

Often your application might want to store gamestate or configurations, but the web has no filesystem access. Additionally, you don’t want to just dump files in the user’s home directory; each desktop operating system has a different preferred location for storing application-specific data, and often different locations for different kinds of data. Introducing gestalt , a library that bundles up…

A Quicksilver Chanukah, Day 2: Platter

This year saw the release of async/.await in stable Rust, marking a huge change in how asynchronous code is written. Previously, one would have to chain a series of combinators onto a Future instance to accomplish asyncrhonous tasks. In Quicksilver, this was used for asset loading (for compatibility with the web backend), and has been a frequent source of pain. Something as simple as loading a…

A Quicksilver Chanukah: Day 1

I started this year with a blog post about the state of Quicksilver where I set a goal for myself: get web support for important game development crates upstreamed. At the end of the year, I’m happy to update this work (by me and many others!) has been a success, and the core of Rust’s game ecosystem is now-web enabled. In the future, I want to write a brief overview of those changes, but for now…

Website Makeover

So www.ryanisaacg.com has a very new look, powered by Hugo and my (fairly small) fork of the hello-friend-ng theme. Partly the site will be dedicated to a bit of a professional showcase / bio for myself, but also with added blog functionality I can communicate in a more public way about my plans for my open source projects. The State of Quicksilver that I wrote earlier this year has moved from its…

The State of Quicksilver Feb 2019

For anyone who doesn’t know, Quicksilver is my 2D game framework that targets desktop and web. It is a pure-Rust library that focuses on ergonomics and simplicity. Quicksilver is part of a small (but growing) set of Rust game engines. Notable are the Amethyst project, an open-source game engine, and ggez, a LOVE-inspired 2D game framework. Increasingly it is practical to build an entire game with…