A friend recently asked how to get started watching Gundam, and as I tripped all over myself, equal parts excitement and not wanting to sound like a lunatic, I fumbled around for a good answer.
What I landed at was inelegant and I eventually panicked and found a watch list online. BUT! BUT! What is a blog for if not do overs!? Also, what follows has literally no information in it about where to get started watching Gundam, it is all about why I like Gundam…and Jane Austen.
“Okay, so, like, they’re both about tensions between duty, social position, and personal desires.”
I love Gundam for all the same reasons that I love Jane Austen.
Austen writes drawing room comedies about marriage and property in Regency England. Gundam is a space opera about war, its impacts on the people that make and are victims to it, and giant mech suits…also sometimes magical teens…
Folks in Austen’s books have to navigate rigid class structures where marriages are strategic alliances and personal feeling has to be balanced against social obligation. Gundam, especially the Universal Century timeline stuff, is filled with characters torn between personal relationships and their positions within military and political hierarchies.
They also both, mostly, focus on characters who have enough privilege to have choices, but not enough power to escape circumstances. Characters in both aren’t peasants without agency, but they’re also caught in larger systems they can’t opt out of…save for Iron Blooded Orphans…what I find compelling about both Austen and Gundam is watching the gap between personal desire and institutional logic do stuff.
Elizabeth Bennet wants to marry for love and respect, but in her world marriage is fundamentally about economic security and social alliance. Her refusal of Collins is personal desire asserting itself. Her family’s panic is institutional logic demanding she comply. The whole novel is the tension between those two forces, and arguably Austen’s project is figuring out if you can thread the needle; if Darcy can be both economically suitable and emotionally right. Having cake. Eating it.
Char Aznable wants…well, it’s hard to say exactly what Char wants, which is part of what makes him such a compelling mask-wearing disaster. He wants revenge for his father. He wants Amuro to acknowledge him. He wants Lalah back. He wants to be Casval Rem Deikun, or maybe he wants to stop being Casval. He’s committed himself to leading a colonial independence movement, and then to dropping asteroids on Earth. His personal desire, this unresolved stuff with Amuro and the ghost of Lalah, gets channeled through institutional logic in a way that threatens to kill many millions of people.
Both Elizabeth and Char are presented as the smartest people in most rooms they enter. Both are hyper-conscious of social dynamics and relish in having the ability to wield sometimes devastating wit. Both are shaped by wounds from their past that they can’t move away from: Elizabeth’s wound is social humiliation and economic precarity (this is maybe a stretch, tbh). Char’s is literal patricide and the loss of his birthright. Both are performing roles while pursuing deeper agendas. But, you know, Char’s agenda involves colonial war rather than securing a good marriage, but the emotional architecture is similar.
Emma Woodhouse and Suletta Mercury also pair well! Emma wants to play matchmaker, but the social institution of matchmaking is actually about managing property and bloodlines. Her meddling with Harriet kinda sorta almost destroys Harriet’s life because Emma is applying personal whim to institutional machinery. She thinks she’s helping. She’s actually just another gear in the system. Badly done.
Suletta wants to help Miorine to maybe understand what’s happening around her. But she’s a tool in her mother’s (who is also a Char stand in!?) plan, and the arranged marriage she’s been pushed into is institutional logic and corporate alliance dressed up as personal connection. Witch from Mercury kinda beats you over the head with this. Both Suletta and Miorine are heirs to massive corporate power but have almost no control over how that power operates or what’s expected of them.
The arranged marriage plot is straight out of Austen, and the show mostly kinda knows it, I think. But, whereas Emma eventually learns to see the system clearly and makes choices within it. Suletta has to learn that some systems can’t be reformed from within…and so kinda becomes a killing machine for a wee bit there to burn down the sources of corporate power entrapping her and Miorine and everyone else.
…and then I cut a lot more rambling examples that reveal me to be waaaaay to deep into this line of thought…
Smash cut!
There’s also something Austen-like in how Gundam does drawing room politics. Austen is very very good at showing how personality, wit, and emotional intelligence play out in constrained social settings where everyone is performing their role. The dinner party at Netherfield, the card games at the Musgroves. These are all arenas where characters perform their social identities while maneuvering for advantage or connection.
Gundam has all those diplomatic dinners, peace negotiations, military briefings where characters are similarly performing their institutional identities while personal tensions try to poke through from underneath. The constant political maneuvering in Unicorn. Every conversation in the Buch Concern boardrooms in Witch. What you say and what you mean are usually different things, and the camera lingers on faces the same way Austen lingers on small gestures and loaded phrases. But then, also, the giant mech battles are kinda Gundam’s drawing room politics, too, maybe?
My unhinged ending is that Iron Blooded Orphans is the exception (that I’ve seen…I’m not actually so obsessive as to have watched all of every single Gundam thing ever…yet). Mikazuki and the Tekkadan crew are trying to break into the social structure that other Gundam protagonists are trying to figure out how to navigate or escape. They’re not conflicted aristocrats trying to balance duty and feeling. They’re child soldiers attempting to use violence to gain legitimacy within the system that exploited them, kinda like an inverted Austen story.
I think that the stories in Gundam that work the best are the ones that understand that the tragedy isn’t just that war is bad, but that institutional logic and personal desire are fundamentally incompatible, and someone has to lose. Meanwhile, Austen’s stories posit that you can thread that needle, at least sometimes, if you are clever and lucky and good. Gundam is less optimistic. Maybe because within Gundam war as an institution is more totalizing than marriage is. There’s no Darcy compromise available when the institutional machinery is designed to kill…which is a very hilariously heavy thing to have written, but then I realized that Gundam GQuuuuuuX is out and that is where I suggested my friend start because…like…who doesn’t wanna see what Hideaki Anno does with Gundam?
Besides thinking too much about Gundam, I’ve been learning more about Gleam and Erlang and playing a lot of both Pokemon X and Pokemon ZA with my kids. We’re going for the full Lumiose City experience. I’ve also been thinking a bit about the next december adventure, because I’ve been making plodding progress on a game, I think I may continue to work on that throughout the close of the year.
In a sneaky moment, I assumed that the new The Last Dinner Party album would take over my listening, but what has actually taken over my listening and what I’m already ready to call my favorite album of the year is Florence + The Machine’s new album, “Everybody Scream.”
Oh! And I “released” a silly macOS app I made. FloatingClock.
The other day a co-worker showed me a project that seemed genuinely useful, but I didn’t love some bits of how complicated and resource intensive its architecture were, so, I made my own version of it! Check out diff heatmap.
As an aside, I put this one on github which I don’t generally choose to use for personal projects, but I’d love to see folks contribute rules to this project, and this seemed like the most straight forward way to enable that…maybe.
Turning to fall. While playing a little squash this morning one of the pros that hangs out at the courts asked if he could give me and one of my kids some tips. He then proceeded to spend 40 mins or so with us. It was honestly rad. Totally changed how I approach playing squash in that little time. I’m excited to play more this winter.
I’m also excited for the new The Last Dinner Party album to come out in a few days. Been listening to a lot of them, Wet Leg, and this playlist I made last year called “dreary wearies” that is a lot of Lando Chill and similar.
I’ve been playing a handful of games. I’m starting to come to terms with the fact that I have actual, like bona fide anxiety about playing supposedly cozy farming games where there is some sort of calendar or progression of seasons. I want to play them, but when I sit down to do so I feel a pang of panic. So, once again, rather than playing Fields of Mistria I’ve put some more time into Celeste, and started both ElecHead and Isle of Sea and Sky. Both are fun, and ElecHead may well be on par with Celeste when it comes to scratching a puzzle itch. Isle of Sea and Sky is a pretty bog standard (positive) sokoban flavored game so far, though I find some of the iconography in the game that is supposed to provide hint a bit inscrutable.
For the past 3 or so years I’ve been slowly drifting away from emacs. This has brought me to and fro between a whole heap of editors and IDEs. I’ve been using helix more and more lately. I’ve always had kinda weird tastes when it comes to what I write code in, so helix isn’t really dreamy for me, but I like that I don’t need to futz with any configuration files or settings for what I want out of it. For similar reasons, I’ve started to use zellij instead of tmux.
Last weekend I snuck out a little project, grid. After seeing a couple folks post grids of images made with an app, I think retro.app, I decided that was neat and wanted to be able to do the same. Grid lets you upload any number of images, and then it automatically packs them into a grid. You can configure the background color, gutter size, and the method used to pack the images into a grid.
Kartik recently reminded me of my own project playground that I do use from time to time, but that I’ve always been a little frustrated with.
That reminder paired with that frustration lead me to revisit something similar that I’d started a while ago, but hadn’t finished. Notebook is kinda my take on Jupyter Notebooks minus a ton of features and capabilities.
Here is a little video demo of it in action that I put together over my lunch break today.
There are likely some bugs still left to be ironed out! Sharing scrappy fiddles and what not.
There’s a whole lot going on, and I’ve been feeling myself develop bad habits concerning doom scrolling. I can’t reconfigure my life to not have a phone, so, instead, I made a thing to replace those things that invite me to doomy scroll. Meet Read the Book.
Read the book is a relatively simple website where you can read a book. The books are presented in short chunks so you’re never faced with a big scrolling wall of text. It has support for dark mode and light mode, and you can use either a serif or a sans-serif (monsters) font. Text size isn’t configurable, yet, but let me know if that’d be nice and I can add it easily.
All the books are from Project Gutenberg, but because books can be big(ish) to hold in memory, and because I want to keep track of your reading position I’ve gently pre-processed the books into chunks so your device never needs to hold the entire thing in memory.
If there are other books from Project Gutenberg you’d like to see up there let me know and I’ll drop ’em in!
Stay safe out there, keep reading, and no one is safe unless everyone is safe.
We went to the Franconia Notch, which is on objectively funny thing to name a region. It was beautiful and the weather was wildly clear. Even on top of Mount Washington, the highest peak in the entire north eastern United States, it was sunny and calm. We could see all the way back to Maine…supposedly…it all looks kinda like green lumpy blurs to me.
While there I started to read two books, Katabasis, by R.F. Kuang and The City and Its Uncertain Walls, by Haruki Murakami.
Katabasis already really sets itself apart from the other Kuang books I’ve read. It’s playing in a space more aligned with Sally Rooney than I anticipated, and not only because it has an academic setting, but in how Kuang is characterizing experiences, and embodying emotionally laden interactions. I’m really digging it. It is also funny, which isn’t really a thing I’d say about the other novels I’ve ready by Kuang.
I’ve read a lot of Murakami, I think that I’ve read every novel he’s ever published, save for this one, and I honestly never really enjoy Murakami. I adore his approach to a (usually) understated magical realism, but find myself kinda put off by his stories and protagonists. I also still think it’s kinda weird that a professor recommended Murakami to me after learning that I really like Banana Yoshimoto. As far as I can tell the key similarities between the two authors are that they’re both roughly the same age, and both Japanese, but they’re kinda moving in totally different registers of story telling and theme.
I’ve been toying with a game that uses APL to draw simple patterns, so I’ve been playing around a lot with APL lately, which got me also thinking more about the array programming utilities of Baba Yaga. The APL expression ∘.=⍨⍳7 breaks down kinda like,
⍳7 generates the vector 1 2 3 4 5 6 7
=⍨ takes the equals function and creates a monadic function that compares its argument with itself
∘.=⍨⍳7 becomes (⍳7) ∘.= (⍳7) - the outer product of the vector with itself using equals
Which results in a 7 by 7 identity matrix where element where there is a diagonal row of 1s starting in the upper left corner running through to the lower right corner. You can take a look!
Quick edit to thank Spindley Q Frog, admin over at gamemaking.social for pointing out an error in my previous description of how the APL expression was working. Dyadic, monadic, nomadic.
How can I achieve this using Baba Yaga?
The most direct translation I came up with uses an explicit outer product function that mimics ∘. from APL.
outerProduct : op left right ->
map (l -> map (r -> op l r) right) left;
identityMatrix : n ->
with (
indices : iota n;
equalOp : x y -> when (x = y) is
true then 1
_ then 0;
) -> outerProduct equalOp indices indices;
But, like, the whole terrible fun of APL is concision, so more concise!
identityMatrix : n ->
map (i -> map (j -> when (i = j) is true then 1 _ then 0) (iota n)) (iota n);
But, Baba Yaga is all about that functional programming, and I (perhaps wrongheadedly) believe that functional programming is useful for increasing a program’s clarity (something that APL isn’t wicked famous for). So, how about an approach that makes use of Baba Yaga’s capacities for functional composition?
isEqual : x y -> when (x = y) is true then 1 _ then 0;
identityMatrix : n ->
with (
indices : iota n;
createRow : i -> map (isEqual i) indices;
) -> map createRow indices;
But once you have all these different implementations of supposedly the same program how can you test that they’re kosher?
// Check diagonal elements (should be 1)
diagonal : map (i -> at [i, i] result1) (iota 7);
// Check off-diagonal elements (should be 0)
offDiagonal : [at [0, 1] result1, at [1, 0] result1, at [2, 5] result1, at [6, 3] result1];
// Verify all methods produce identical results
check : reduce (acc row -> acc + (reduce (a x -> a + x) 0 row)) 0 res;
But that is more than enough of that…
I’ve been playing a lot of Sol Cesto. After hearing it described to me and making Strata based off of my understanding of what was described to me I decided to actually grab the game and play it. Dear reader — Sol Cesto is my new Balatro. It is a lot of very weird fun. I also adore that a run in Sol Cesto takes like 3 - 5 minutes, it is great for dipping in and out of.
Here’s The Last Dinner Party covering Kate Bush’s Army Dreamers.
A Counterfeit - a Plated Person -
I would not be -
Whatever strata of Iniquity
My Nature underlie -
Truth is good Health - and Safety, and the Sky.
How meagre, what an Exile - is a Lie,
And Vocal - when we die -
– Emily Dickinson
I made another game! This one pretty much has one single verb: “move.” The game, like most games I make, is a roguelike that relies heavily on probabilities and rng (random number generation).
Each level is made up of a four by four grid. There are collectable buffs and curses distributed randomly across the grid, as well as collectable gems. The goal of the game is to collect 50 or more gems.
As a player, you don’t decide to move to a specific grid, instead you can traverse the rows — you then have a random chance of landing on any given grid cell within the row you selected. The chance of landing on any given grid cell is determined by a couple factors.
Each cell displays your probability of landing on it. The cards modify these probabilities, while some persistent effects accumulate across levels.
…and eventually a monster spawns and will try to get you.
The game uses a deterministic probability calculation system that processes each cell through a few steps:
const calculateRowProbabilities = (rowCells, player) => {
// Everyone starts equal - 25% chance per cell in a 4x4 grid// Then cards mess with this baseline in dramatic wayslet modifiedCells = rowCells.map(cell => applyCardModifier(cell, player));
// Magnets can completely override everything else
modifiedCells = applyMagnetEffects(modifiedCells, player);
// Finally, make sure we don't break math (keep it between 2-75% and sum to 100%)
modifiedCells = normalizeProbabilities(modifiedCells);
return modifiedCells;
};
The normalization step is important to make sure that no row’s probabilities exceed 100% by applying hard floors and ceilings.
const MIN_PROBABILITY = 2; // Keep some danger - nothing is ever "safe"const MAX_PROBABILITY = 75; // But also prevent boring certainty and locked states
The goal here is to create a bounded system inside of which you can achieve nearly-certain outcomes (75%) or avoid almost-impossible ones (2%), but never eliminate uncertainty totally. The probabilities (should) always sum to exactly 100% after normalization.
Sometimes the grid will include magnets that create localized probability distortion fields. These can dramatically override the normal calculation pipeline.
const applyMagnetEffects = (rowCells, player) => {
const magnets = rowCells.filter(cell =>
cell.card && cell.card.type === CardType.MAGNET);
if (magnets.length === 0) return rowCells;
const hasReverseMagnetism = player.curses.includes(CurseType.REVERSE_MAGNETISM);
magnets.forEach((magnet, magnetIndex) => {
const baseEffect = 45 - (magnetIndex * 10); // First magnet is strong, others weakerif (hasReverseMagnetism) {
// Cursed magnets push you away instead
targetCell.currentProbability = Math.max(2, targetCell.currentProbability - baseEffect);
} else {
// Normal magnets pull you toward them - can get up to 75% "attractive"
targetCell.currentProbability = Math.min(75, targetCell.currentProbability + baseEffect);
}
});
return modifiedCells;
};
Multiple magnets have diminishing returns, and the REVERSE_MAGNETISM curse inverts all magnetic behavior, creating repulsion fields instead of attraction.
The monster that eventually appears that, conceptually, I think of as like the guy in Ski Free has three levels of action that scale depending on your progress through the game:
const calculateMonsterMove = (monster, player, intelligence) => {
switch (intelligence) {
case'basic':
// Simple city-block distance - like Pac-Man ghostsreturn getBestMove(possibleMoves, (move) =>Math.abs(move.row - playerPos.row) + Math.abs(move.col - playerPos.col));
case'smart':
// Straight-line distance - more direct, more dangerousreturn getBestMove(possibleMoves, (move) =>Math.sqrt(Math.pow(move.row - playerPos.row, 2) +
Math.pow(move.col - playerPos.col, 2)));
case'predictive':
// This one tries to guess where you're goinglet targetPos = playerPos;
if (player.lastPosition) {
const playerDirection = {
row: playerPos.row - player.lastPosition.row,
col: playerPos.col - player.lastPosition.col
};
targetPos = {
row: Math.max(0, Math.min(3, playerPos.row + playerDirection.row)),
col: Math.max(0, Math.min(3, playerPos.col + playerDirection.col))
};
}
// Heads you off at the pass instead of chasing behind
}
};
The monster spawns earlier in higher levels (3-4-5 moves before level end) and moves more frequently to create an escalating time pressure.
Strata should work on touch screens and with the keyboard and/or mouse, but I’ve only really tested it in Firefox, so don’t hesitate to let me know if it is buggy somewhere!
Oh, and the game was kinda inspired by that Emily Dickinson poem…but I lost the plot somewhere along the way and let the game become what it would. The core mechanic is also inspired by another game that I haven’t actually ever played called Sol Cesto that I heard someone describe relatively recently.
I haven’t posted anything remotely resembling week notes since the middle of June! Since then many things have happened including, but not limited to: a trip to Minnesota to visit Isaac, a couple trips to New Hampshire for work, a family trip to Mount Desert Island to revisit our old stomping grounds, a whole heap of bicycle riding, I finished a couple great books, played some games, made some games, and wrote what is probably an unhealthy amount of code — mostly for Baba Yaga, but also a bit for rawk and other such adventures. I’m keeping busy to ignore the state of…everything? All of this?
Summer is given way to the start of school so we’re all figuring out our new cadences here and, all in all, things are pretty solid.
Of my reading, honestly, everything has been enjoyable, but I think the two stand out titles are the last two I read at the time of my writing this: The Essex Serpent by Sarah Perry and The Invisible Life of Addie LaRue by V.E. Schwab. Perry’s The Essex Serpent is especially notable for me because I adore gothic and romantic tragedies of yore and it really does a great job of capturing the same kinda story but with a few modern sensibilities thrown in that help to humanize the characters a bit.
On and off I’ve been making a few games — the only one that is in any state to share (because it is implemented in JS and the others are being used to learn OCaml so are more cumbersome to distribute) is called “strata.” Strata is a puzzle strategy roguelike game where you have to travel between layers of a dungeon. It is loosely inspired by an Emily Dickinson poem because I’m wholly insufferable. It is kinda boring, so I’m going to keep tweaking the balance of the mechanics to see if I can make it a bit more strategy-y and puzzle-y. The game has a single verb, and that is moving between strata wihtin a level. Everything else is random number generation.
Update: I added a monster to strata.
At home we’ve been playing a ton of card games — especially a game that my 9 year old introduced (I think from camp) called trash! This is an s-tier game. I’ve also been playing a bit of Tactical Breach Wizards as well as Octopath Traveler II. Both are fun, and I’d like to play more, but I honestly don’t seem to have the attention span for video games…which is weird because I’ll sit and read a book for hours and don’t mind staying up stupid late writing fiddly silly code. Fields of Mistiria continues to call to me…I continue to ignore the call.
I fear that both of my children’s teachers are gonna identify us as a weeb family because I’ve been packing them onigiri for lunch a lot…mostly because they’re more fun for me to make than sandwiches, but also because my kids are extraordinarily picky and their sandwich aesthetic is exceedingly boring, like European airport sandwiches (yes, I’m looking at you that one “butter and tomato” sandwich I had that one time I was at the airport in the Netherlands).
I spent a good bit of time this summer learning OCaml for the fun of it…and while I’m pretty smitten I let my attention drift and now I wanna learn a language (or two?) on the BEAM. Gleam seems especially appealing because it is cute, and also because it shares a lineage with Elm that Roc claims to have that I, honestly, struggle to find…which isn’t a kick at Roc, just that I think Roc’s goals are kinda different than what I want in a programming system these days. I’d like to see if I can implement a toy array programming something to the BEAM. From what little (which is exceedingly small) I know about the BEAM I think it could be a cool host for an array programming monster.