<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ari.blumenthal.dev</title>
  <link href="https://ari.blumenthal.dev/" />
  <link href="https://ari.blumenthal.dev/rss" rel="self" />
  <updated>2026-04-13T01:58:37.372Z</updated>
  <author>
    <name>Ari Blumenthal</name>
  </author>
  <id>https://ari.blumenthal.dev/rss</id>
  <entry>
    <title>lee sedol.</title>
    <link href="https://ari.blumenthal.dev/!/7/-9/lee-sedol"/>
    <id>https://ari.blumenthal.dev/!/7/-9/lee-sedol</id>
    <updated>2026-04-12T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Once a man has changed the relationship between himself and his environment, he cannot return to the blissful ignorance he left. Motion, of necessity, involves a change in perspective. -- Commissioner Pravin Lal "A Social History of Planet"&lt;/p&gt;&lt;p&gt;Okay, after taking claude for a spin a few months ago, I've been using it pretty heavily at my new job.&lt;/p&gt;&lt;p&gt;I'd estimated that the SWE role would change to just doing code reviews for a living, and that isn't far off. And it is so incredibly far off.&lt;/p&gt;&lt;p&gt;I have a lot of thoughts on this topic. Most people have articulated them better than me. But, as is true of most stuff on this site, it's nice for me to be able to have a reference to look back at down the road.&lt;/p&gt;&lt;p&gt;My setup&lt;/p&gt;&lt;p&gt;I'm currently on the $100/mo Claude Code 5x Max plan. I consistently hit the 5 hour cap twice each day during working hours, so I'm considering bumping that to the 20x plan. Or hoping that Anthropic fixes whatever is going on.&lt;/p&gt;&lt;p&gt;My current setup is a my 2024 M3 MacBook Pro hooked up to two Dell S2719DGF 27" monitors I got in 2019. My right monitor is dedicated to a full-screen terminal with a tmux session containing 6 panes in a 2x3 grid.&lt;/p&gt;&lt;p&gt;Each pane is (typically) dedicated to an ongoing claude session, although depending how involved a particular task is, I may have just 1-2 running or all 6.&lt;/p&gt;&lt;p&gt;I try and make sure that of the 6 panes, at least one is working on new features, one is fixing bugs or improving old features, one is cleaning up technical debt, and one is doing exploration and planning. The other two are wildcards for whatever needs to get done.&lt;/p&gt;&lt;p&gt;To handle parallel claude instances working in the same codebase, I tried git worktrees, but didn't like that I couldn't have the same branch checked out in multiple places. So I ended up with my own bespoke setup.&lt;/p&gt;&lt;p&gt;I have a ~/foo directory for everything related to my current job (not actually foo, but you get the idea). Within that directory, I create new "workspaces" as needed following the NATO phonetic alphabet, e.g. ~/foo/alfa/, ~/foo/bravo/, etc. In each of those, I'll clone one or more of the git repos that we use on our team.&lt;/p&gt;&lt;p&gt;This setup seems to work pretty well, but we'll see how it evolves over time.&lt;/p&gt;&lt;p&gt;Wrangling&lt;/p&gt;&lt;p&gt;In my experience so far, no matter the difficulty, vibe coding today successfully creates amazing prototypes and functional yet garbage code. There are 2 things that I've found are an absolute necessity to mitigate this. Always plan and always review.&lt;/p&gt;&lt;p&gt;If you're asking, "Hey Ari, aren't Googlers known to write way too many design docs and have onerous processes around code review?"&lt;/p&gt;&lt;p&gt;I'd say, first of all, I'm a Xoogler, I left. And secondly, yes. Historically, absolutely. And yet that is the only thing keeping the results of AI generated code from devolving into an unmaintainable mess.&lt;/p&gt;&lt;p&gt;Always plan before writing a single line of code. And always do a code review pass at the end with the mindset of how would I have done this differently?.&lt;/p&gt;&lt;p&gt;Blackbird&lt;/p&gt;&lt;p&gt;I have a custom claude status line based on which workspace and git repo I'm working in. I used a bunch of bird emoji to help differentiate (because Unicode has a lot of birds).&lt;/p&gt;&lt;p&gt;But turns out the 🐦‍⬛ emoji causes issues. Specifically, that emoji is a combination of the 🐦 and ⬛ with a zero width joiner in-between. And tmux does not handle these well. Something to look out for.&lt;/p&gt;&lt;p&gt;Lee Sedol&lt;/p&gt;&lt;p&gt;I found out recently, that Lee Sedol retired from playing Go in 2019 after losing to AlphaGo in 2016. In an interview, he said:&lt;/p&gt;&lt;p&gt;Even if I become the number one, there is an entity that cannot be defeated.&lt;/p&gt;&lt;p&gt;Back in high school (in like 2004 or 2005), I had a classmate that had played a lot of RuneScape. He was one of the players that had accumulated 100s of party hats and other ridiculously expensive items from early rune ore farming or whatever. His philosophy was that if you couldn't be the best at something, why bother.&lt;/p&gt;&lt;p&gt;In the current era of AI genuinely coding faster than me, and only getting better, I've been thinking a lot about Lee Sedol and my old classmate's mindset.&lt;/p&gt;&lt;p&gt;Code reviews&lt;/p&gt;&lt;p&gt;Doing code reviews used to be one of my favorite parts of being a tech lead. A new engineer joins the team, I review their code, I provide feedback, they learn from it, I see them grow as engineers, they're eventually better and more knowledgeable than me.&lt;/p&gt;&lt;p&gt;Great loop. Rewarding. Less so now.&lt;/p&gt;&lt;p&gt;Instead, I'm reviewing Claude's code. Which is fine, I already mentioned above that you absolutely need to do this. But you don't get to see Claude grow. Also this doesn't really fell like being a SWE anymore. It's a new role. Like Software Dispatcher or something.&lt;/p&gt;&lt;p&gt;Or alternatively, when I'm reviewing my coworkers code, more often than not, my feedback just gets fed back into Claude and I don't see the same growth or learning from the process.&lt;/p&gt;&lt;p&gt;And new engineers don't have the "how would I have done this?" learned yet, since they haven't done it. So they have to rely more on how Claude did it, which is less than ideal.&lt;/p&gt;&lt;p&gt;Changing how I write&lt;/p&gt;&lt;p&gt;As mentioned in how and claude, I will once again reiterate that this blog does not and will not use AI or LLMs to generate any of its content.&lt;/p&gt;&lt;p&gt;I feel like I need to include that caveat in every post I talk about using Claude Code.&lt;/p&gt;&lt;p&gt;That said, I have found that even without using AI for writing these posts, it is changing how I write. When doing code reviews, I used to write a lot like how Claude sounds. And em dashes were great — even for folks that followed the Chicago Manual of Style's awful opinion that there shouldn't be whitespace on either side of them. Now I actively avoid things that make me sound like a generic LLM.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>claude.</title>
    <link href="https://ari.blumenthal.dev/!/6/-9/claude"/>
    <id>https://ari.blumenthal.dev/!/6/-9/claude</id>
    <updated>2026-01-19T12:34:56Z</updated>
    <content type="html">&lt;p&gt;So between a past coworker's recent recommendation, antirez's Don't fall into the anti-AI hype post a week ago, and the internet not shutting up about how good Opus 4.5 is since it released in Nov, I decided to give Claude a try.&lt;/p&gt;&lt;p&gt;Reminder&lt;/p&gt;&lt;p&gt;As mentioned in how, This blog does not and will not use AI or LLMs to generate any of its content.&lt;/p&gt;&lt;p&gt;This is my personal immaterial journal. It's already pointless as it is. No reason to make it even more meaningless by not even bothering to write it myself.&lt;/p&gt;&lt;p&gt;Caveat&lt;/p&gt;&lt;p&gt;I had given Claude a quick look previously while working on my Sherwalk side project. After tediously transcribing three short stories to conversations manually, I was curious if an LLM could handle this task quicker or better.&lt;/p&gt;&lt;p&gt;And yeah, that was definitely in its wheelhouse. If I ever go back to that project, I'll probably have Claude knock any of the remaining adventures that would be interesting in that format.&lt;/p&gt;&lt;p&gt;The project&lt;/p&gt;&lt;p&gt;My first prompt to Claude was:&lt;/p&gt;&lt;p&gt;Suppose I wanted to write a Chrome extension to open Google Meet links automatically in a new tab when an event starts on my calendar in Google Calendar. Is it possible to build such an extension that can read my calendar via an official API? What might that look like?&lt;/p&gt;&lt;p&gt;(This is based on an internal extension at my last job, which I heavily relied on. It helps make sure that you don't be late to meetings).&lt;/p&gt;&lt;p&gt;The process&lt;/p&gt;&lt;p&gt;The first response was 90% of the way there.&lt;/p&gt;&lt;p&gt;Next I had it generate a README which stepped me through the Google Cloud Console nonsense, name the project Meteion, do some minor feature changes, download and scale an icon for the extension, and update the code style to match my personal preferences.&lt;/p&gt;&lt;p&gt;After that, there were a couple larger fixes. Some superfluous Promises wrapping Promises that could be cleaned up and other similar sort of async code cleanups. A security bug due to automatically opening any link someone put in the body of any event on my calendar. Fixing an issue where the icon wasn't rendering in the toolbar.&lt;/p&gt;&lt;p&gt;The conclusion&lt;/p&gt;&lt;p&gt;The extension nearly works at time of writing. Claude (rightfully) assumed I was using Chrome, so it used my logged in identity via chrome.identity.getAuthToken. When I said I was using Vivaldi instead, it swapped that out for a different flow via chrome.identity.getRedirectURL.&lt;/p&gt;&lt;p&gt;But this requires logging in every hour. ¯\_(ツ)_/¯&lt;/p&gt;&lt;p&gt;It seems the alternative would be spinning up a backend for this and using refresh tokens via chrome.identity.launchWebAuthFlow, which I guess I could do, but I was hoping the extension could be simpler and self-contained.&lt;/p&gt;&lt;p&gt;Anyways, it took less time for Claude to code it after my kiddo went to bed this evening than it did for me to write this blog post after. So, um... yeah. As a SWE, these are interesting times. Admittedly, this was a small greenfield project, but the results were impressive nonetheless.&lt;/p&gt;&lt;p&gt;The epilogue&lt;/p&gt;&lt;p&gt;This process felt a lot like doing code reviews for a junior SWE, except Claude responded to my comments essentially instantly.&lt;/p&gt;&lt;p&gt;I wonder if we're moving to a world where every SWE is just a TLM for their own team of AIs. I guess other roles on the team will have to increase in scope accordingly.&lt;/p&gt;&lt;p&gt;Thankfully, I have the background to be able to find and cleanup bugs like those mentioned above (I've reviewed a lot of code...), but I worry about new engineers entering the field that will lean more heavily on the generated output.&lt;/p&gt;&lt;p&gt;Maybe the AI will get better at handling the TLM responsibilities, as well. Time will tell.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>paint.</title>
    <link href="https://ari.blumenthal.dev/!/6/-8/paint"/>
    <id>https://ari.blumenthal.dev/!/6/-8/paint</id>
    <updated>2026-01-06T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Added a canvas to the grid for fun. Requires js. Might delete later.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>game roundup.</title>
    <link href="https://ari.blumenthal.dev/!/5/-8/game-roundup"/>
    <id>https://ari.blumenthal.dev/!/5/-8/game-roundup</id>
    <updated>2025-11-21T12:34:56Z</updated>
    <content type="html">&lt;p&gt;I don't game nearly as much these days, what with competing hobbies and responsibilities (I'm looking at you 1473 hrs in dota 2, 402 hrs in factorio, and however many days in ffxiv).&lt;/p&gt;&lt;p&gt;But, I've played a handful recently. Here are some quick thoughts in no particular order.&lt;/p&gt;&lt;p&gt;Artifacts&lt;/p&gt;&lt;p&gt;I hit bronze for the current season of artifacts (currently at 110/200 achievement points), but my automation stalled a little bit after defeating rosenblood.&lt;/p&gt;&lt;p&gt;I'll need to go back at some point and add some logic to handle everything on Sandwhisper Isle.&lt;/p&gt;&lt;p&gt;Dispatch&lt;/p&gt;&lt;p&gt;Back in the early 2010s, I loved the puzzles and stories that came out of Telltale Games. Looking at my Steam history, I picked up an Indie Story Pack in 2010 that had Puzzle Agent, Puzzle Agent 2 in 2011, The Walking Dead in 2012, The Wolf Among Us in 2014, and Tales from the Borderlands and Game of Thrones in 2015.&lt;/p&gt;&lt;p&gt;Now 10 years later, AdHoc Studio (made up of some ex-Telltale folks) is reviving the genre with Dispatch, which I just finished a few nights ago.&lt;/p&gt;&lt;p&gt;Apparently it has sold really well, which is well deserved! The story and dispatch/hacking/dialogue tree gameplay were great, and the voice acting and animations were superb.&lt;/p&gt;&lt;p&gt;Strange Antiquities&lt;/p&gt;&lt;p&gt;In my 2022 epilogue, Strange Horticulture (an occult puzzle game of identifying plants and uncovering plots) came in as my #3 game of the year.&lt;/p&gt;&lt;p&gt;Yesterday, I started playing its sequel, Strange Antiquities, which with a quick s/plants/artifacts/ made for another fun set of puzzles.&lt;/p&gt;&lt;p&gt;Tiny Bookshop&lt;/p&gt;&lt;p&gt;This game has you selling books out of a tiny mobile trailer. It's very cozy and has some fun characters, but it uses real books in its gameplay and therefore has dangerously added books to my backlog of stuff I need to read.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>no floating promises.</title>
    <link href="https://ari.blumenthal.dev/!/5/-9/no-floating-promises"/>
    <id>https://ari.blumenthal.dev/!/5/-9/no-floating-promises</id>
    <updated>2025-10-07T12:34:56Z</updated>
    <content type="html">&lt;p&gt;I'm taking another swing at artifacts for its 6th season. This time around, I'm coding it entirely in TypeScript. So naturally, I've run into multiple async bugs from forgetting to await promises.&lt;/p&gt;&lt;p&gt;The no-floating-promises eslint check can "Require Promise-like statements to be handled appropriately" and help mitigate this problem by alerting you in your editor.&lt;/p&gt;&lt;p&gt;This essentially requires us to use or explicitly void promises we don't await.&lt;/p&gt;&lt;p&gt;Why isn't this enforced by default?&lt;/p&gt;&lt;p&gt;Back in 2017, kduffie filed microsoft/TypeScript issue 13376 asking for exactly this. See discussion there.&lt;/p&gt;&lt;p&gt;What about deno lint?&lt;/p&gt;&lt;p&gt;Yeah, I recently moved over to using Deno as the JS runtime for my projects. Deno has built-in linting and formatting, but it doesn't natively support a no-floating-promises lint rule.&lt;/p&gt;&lt;p&gt;Specifically, Deno lint doesn't support any lint checks that require knowing type information (deno_lint issue 1138).&lt;/p&gt;&lt;p&gt;So we have to fallback to using eslint.&lt;/p&gt;&lt;p&gt;Setting up eslint with Deno&lt;/p&gt;&lt;p&gt;This section has my notes on setting eslint up with Deno (my runtime environment) and VS Code (my editor).&lt;/p&gt;&lt;p&gt;There isn't clean interop with Deno and existing eslint rules (deno_lint issue 25). So we have to set it up ourselves.&lt;/p&gt;&lt;p&gt;First, add a minimal tsconfig.json (if you don't have one already) and get rid of the compilerOptions from your deno.json config, since eslint can't use those. Something like:&lt;/p&gt;&lt;p&gt;You can also include some of the Deno defaults.&lt;/p&gt;&lt;p&gt;In this minimal config, we add a target library of ES2023 so that when we run eslint later, it knows that we can use the latest and greatest JS features. Otherwise we might get errors for using anything added after ES5. See the tsconfig docs for details.&lt;/p&gt;&lt;p&gt;Next, update your deno.json to include "nodeModulesDir": "auto" as recommended in the Deno docs.&lt;/p&gt;&lt;p&gt;Then, add an eslint.config.js that provides the configuration for eslint itself. Something like the following to get started:&lt;/p&gt;&lt;p&gt;As mentioned before, no-floating-promises uses type information, so we have to set up our config to include that. See typed linting in the typescript-eslint docs for details.&lt;/p&gt;&lt;p&gt;Finally, in VS Code, install the ESLint extension and you should start seeing some errors!&lt;/p&gt;&lt;p&gt;Unfortunately, that will include a few no-unsafe-call and no-unsafe-member-access errors because of our use of the Deno global. While it would be ideal if we could just add deno.ns to the libraries in our compiler options above, it is not an accepted value there (vscode_deno issue 326). (╯°□°）╯︵ ┻━┻&lt;/p&gt;&lt;p&gt;To get around that, we can add a declaration file (typically suffixed with .d.ts) to our codebase that provides the type information for stuff from the core Deno library. For example:&lt;/p&gt;&lt;p&gt;And there we go. Not an ideal last step, but voilà. We now have warnings in VS Code for TS code served by the Deno runtime for floating promises. ┬─┬ノ(º_ºノ)&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>sherwalk.</title>
    <link href="https://ari.blumenthal.dev/!/4/-9/sherwalk"/>
    <id>https://ari.blumenthal.dev/!/4/-9/sherwalk</id>
    <updated>2025-10-02T12:34:56Z</updated>
    <content type="html">&lt;p&gt;During week 0, I started working on my Sherwalk idea from project ideas i.&lt;/p&gt;&lt;p&gt;Sherwalk is a game based on the works of Sir Arthur Conan Doyle. By traveling around Victorian London, you get to explore some of Sherlock Holmes most famous mysteries. But in order to take steps in the game, you need to walk around in the real world.&lt;/p&gt;&lt;p&gt;The game does not use your GPS or location, does not have any in-app purchases, and does not have any ads.&lt;/p&gt;&lt;p&gt;I got it to a pretty good state a month ago with its first three adventures: The Red-Headed League, The Adventure of Silver Blaze, and The Adventure of the Speckled Band.&lt;/p&gt;&lt;p&gt;There is tons of room for improvement, but after not touching it for about a month, I figured I should probably put it out there and see if there is any interest in me building it out further and adding new features or adventures.&lt;/p&gt;&lt;p&gt;You can check out the website for the app at https://sherwalk.com or download it for iOS on the app store.&lt;/p&gt;&lt;p&gt;I already wrote a little bit in that week 0 post about my very first impressions of developing in Swift, but here are a few more thoughts about the Sherwalk app development experience in no particular order:&lt;/p&gt;&lt;p&gt;It is easy to try and sell stuff&lt;/p&gt;&lt;p&gt;StoreKit makes it ridiculously easy to add in-app purchases.&lt;/p&gt;&lt;p&gt;I originally figured I'd release the game with a few free adventures and the rest behind an in-app upsell (which I called sherunlock). But then after only implementing three before moving on to other side projects, I just got rid of the paywall.&lt;/p&gt;&lt;p&gt;But yeah, Apple makes this easy. I just had to add an entry in App Store Connect (the website where you manage your apps) and add a few lines of code to connect the purchase to a state that tracked locally whether or not the game was sherunlocked.&lt;/p&gt;&lt;p&gt;Writing mystery configurations&lt;/p&gt;&lt;p&gt;My first prototype had the mystery and chat configurations stored in json. Which was fine, but very repetitive with lots of duplication and boilerplate.&lt;/p&gt;&lt;p&gt;If I was still at the company I probably would have used a GCL config to manage those issues (and there are similar external configuration languages like Jsonnet). However in the Swift/iOS ecosystem, the canonical approach seemed to be to create a Domain Specific Language (or DSL for short).&lt;/p&gt;&lt;p&gt;(Aside: There isn't much about GCL on the internet; however, Google's borg paper from 2015 references an MS thesis from 2008 that provides a little info.)&lt;/p&gt;&lt;p&gt;Anyways, using a DSL worked out pretty well. I was able to encode mysteries and conversations in a very simple syntax, with additional metadata as needed:&lt;/p&gt;&lt;p&gt;Testing and sharing the app was simple&lt;/p&gt;&lt;p&gt;Apple provides TestFlight to share developer builds of your app with other people.&lt;/p&gt;&lt;p&gt;This let me write my app in Xcode, create a build, hop over to that App Store Connect site, push a few buttons, and then anyone I'd allowlisted could download it from the TestFlight app on their phone.&lt;/p&gt;&lt;p&gt;Significantly easier than I was expecting and a very well designed end-to-end user journey.&lt;/p&gt;&lt;p&gt;The app review process&lt;/p&gt;&lt;p&gt;Pretty painless too. Submitted for approval earlier today and got my Welcome to the App Store email before going to bed.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>how 2.</title>
    <link href="https://ari.blumenthal.dev/!/4/-8/how-2"/>
    <id>https://ari.blumenthal.dev/!/4/-8/how-2</id>
    <updated>2025-10-01T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Nothing like writing how your site is built (and a little free time) to make you want to completely redo everything. So, let's dig into what's new.&lt;/p&gt;&lt;p&gt;Rendering updates&lt;/p&gt;&lt;p&gt;This site is an infinite grid. In the original new site, who dis post from nearly 3 years ago, I mention how that works.&lt;/p&gt;&lt;p&gt;The approach to rendering today hasn't changed too much. However, while I originally left all the panels offscreen in the DOM, it turns out some browsers don't like that too much (I'm looking at you mobile safari).&lt;/p&gt;&lt;p&gt;So instead, I schedule panels for deletion that are no longer visible, taking into account the zoom level (which may mean that multiple panels are visible at any given time).&lt;/p&gt;&lt;p&gt;SSR and nojs visitors&lt;/p&gt;&lt;p&gt;In that new site, who dis post, I mentioned:&lt;/p&gt;&lt;p&gt;I load the whole site on every page load which isn't ideal. If I stick at this blogging thing for a while, I will probably write a small server to better handle loading panels as needed.&lt;/p&gt;&lt;p&gt;Well, nearly 3 years later, I haven't written all that much (&lt;50 kB of gzip'd text). Turns out loading the whole site on every page load will still work well for awhile.&lt;/p&gt;&lt;p&gt;But the ability to load individual panels is still useful for supporting nojs visitors that otherwise had a broken experience.&lt;/p&gt;&lt;p&gt;So instead of having a codegen step that generates a static version of the site and picking the appropriate panel client-side, I now use the Deno JS runtime and package manager (with Oak middleware) to render the appropriate panel server-side.&lt;/p&gt;&lt;p&gt;Authoring blog posts&lt;/p&gt;&lt;p&gt;Previously, my blog posts were written in html and I used nginx's server side includes to add them to the page.&lt;/p&gt;&lt;p&gt;But with my recent switch to using Obsidian during week 0 for my private notes, I found that I wanted to use markdown for my public journal, as well.&lt;/p&gt;&lt;p&gt;After building my own format to support a metadata-embedded version of markdown (with different emojis for different categories (e.g. 📍 for coordinates, 🎨 for panel type, etc)), I learned about about YAML Front Matter and just went with that instead.&lt;/p&gt;&lt;p&gt;As part of the build step for the site, the YAML is stripped and parsed using the jonschlinkert/gray-matter library. The remaining markdown content is rendered with the markedjs/marked library.&lt;/p&gt;&lt;p&gt;Backlinks&lt;/p&gt;&lt;p&gt;A minor feature I've wanted for awhile (but never got around to) are links back to the panels that linked to the panel you're on. So yep, added those too.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>rhinoceroi.</title>
    <link href="https://ari.blumenthal.dev/!/4/-7/rhinoceroi"/>
    <id>https://ari.blumenthal.dev/!/4/-7/rhinoceroi</id>
    <updated>2025-09-20T12:34:56Z</updated>
    <content type="html">&lt;p&gt;After updating the dictionary used by my booggle app, I noticed several words had been removed. One of them was rhinoceroi.&lt;/p&gt;&lt;p&gt;what is a dictionary?&lt;/p&gt;&lt;p&gt;The Oxford English Dictionary (OED) defines a dictionary as&lt;/p&gt;&lt;p&gt;A book which explains or translates, usually in alphabetical order, the words of a language or languages (or of a particular category of vocabulary), giving for each word its typical spelling, an explanation of its meaning or meanings, and often other information, such as pronunciation, etymology, synonyms, equivalents in other languages, and illustrative examples. Also (from the late 20th cent.): an electronic resource performing this function.&lt;/p&gt;&lt;p&gt;But languages evolve and the words and meanings change. So who decides what a dictionary includes at any given point in time?&lt;/p&gt;&lt;p&gt;If you're playing a casual game of scrabble. You might reach for the Official Scrabble Players Dictionary (OSPD) published by Merriam-Webster.&lt;/p&gt;&lt;p&gt;In a tournament setting, you'll probably use either the NASPA Word List (NWL) or Collins Scrabble Words (CSW) depending on what country you live in.&lt;/p&gt;&lt;p&gt;rhinoceroi?&lt;/p&gt;&lt;p&gt;Yeah, so I recently updated from NWL2020 (the second edition) to NWL2023 (the third edition) for my app. That change got rid of several words, including rhinoceroi.&lt;/p&gt;&lt;p&gt;In the NWL2023 Draft Report (pdf), they noted:&lt;/p&gt;&lt;p&gt;“rhinocerotes” is the newly added correct Greek plural, “rhinoceroi”* was erroneously added to Wiktionary in 2006 and subsequently added to dictionary.com&lt;/p&gt;&lt;p&gt;If you go to dictionary.com, rhinoceroi happily gives you a "No results found" message. But it is still live at https://en.wiktionary.org/wiki/rhinoceroi and we can see its history.&lt;/p&gt;&lt;p&gt;origins&lt;/p&gt;&lt;p&gt;In June 2006, the user Doremítzwr added the rhinoceroi definition as an "Etymologically correct plural of rhinoceros".&lt;/p&gt;&lt;p&gt;This was controversial and spawned a spirited discussion in the Tea Room on what words should and should not be included in the dictionary.&lt;/p&gt;&lt;p&gt;By July another user had marked it as hypercorrect. This was to inform readers that while this was an attempt to follow the rules of language and be more correct, the word is instead usually considered incorrect.&lt;/p&gt;&lt;p&gt;The list of hypercorrections on wiktionary has additional plurals added by Doremítzwr (like avocadi, agendae, scenarii, and platypi).&lt;/p&gt;&lt;p&gt;deeper into the debate&lt;/p&gt;&lt;p&gt;In Jan 2007, the spirited discussion continued with Labelling plurals as “irregular” and/or “nonstandard”: important points from a discussion concerning the case study “scenarii”&lt;/p&gt;&lt;p&gt;While that internet debate may or may not be worth your time to read, I like EncycloPetey's point at the end that:&lt;/p&gt;&lt;p&gt;What English could use is outside the scope of Wiktionary. Our goal is to describe what English does.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>week 0.</title>
    <link href="https://ari.blumenthal.dev/!/5/-7/week-0"/>
    <id>https://ari.blumenthal.dev/!/5/-7/week-0</id>
    <updated>2025-08-11T12:34:56Z</updated>
    <content type="html">&lt;p&gt;As mentioned in an update on last week, I left my job.&lt;/p&gt;&lt;p&gt;After over a decade working for the company, there's a lot I'll miss. But the three at the top of my mind right now are:&lt;/p&gt;&lt;p&gt;There's not much I can do about (1) and (3) right now, but for (2), I've started using Obsidian to keep daily notes of what I'm working on, design docs for side projects, and miscellaneous learnings as I navigate the tech stacks I'm less familiar with.&lt;/p&gt;&lt;p&gt;This journal entry is a collection of various interesting (to me) notes from my personal logs over the last week.&lt;/p&gt;&lt;p&gt;Project ideas&lt;/p&gt;&lt;p&gt;The hardest part of a new project is coming up something that lies in the intersection in the venn diagram of being&lt;/p&gt;&lt;p&gt;I had an idea in project ideas i called Sherwalk Holmes that I've started tinkering with, since it seems like it might hit all those criteria.&lt;/p&gt;&lt;p&gt;The Web&lt;/p&gt;&lt;p&gt;I switched over to the Vivaldi browser, since I no longer work at the company and Safari and Chrome both have issues that I find aggravating.&lt;/p&gt;&lt;p&gt;For example, in Safari, dynamic favicons on desktop often show stale versions of themselves, due to how they're cached. See this post on Stack Overflow from 2018! Also, forward and back buttons on my mouse aren't supported. And on mobile, I'll frequently get into a state where the back button navigation is buggy.&lt;/p&gt;&lt;p&gt;In Chrome, more and more AI features are getting pushed into the browser layer, which is not my preference. On the other hand, Vivaldi has explicitly stated: "We don’t buy into the idea that everything needs to be powered by AI. Especially not the kind that uses your data without permission, or plagiarizes and pollutes the web with misinformation."&lt;/p&gt;&lt;p&gt;That said, I really like the look of the liquid glass version of mobile Safari in the iOS 26 dev beta. I might be convinced to switch back to that...&lt;/p&gt;&lt;p&gt;Vim keybindings&lt;/p&gt;&lt;p&gt;It's funny (to me) that one of the first things I have to switch over in any new text editor (Obsidian, XCode, VS Code, etc) is to vim keybindings.&lt;/p&gt;&lt;p&gt;I say that as I'm typing this journal entry in vim.&lt;/p&gt;&lt;p&gt;Muscle memory is a crazy thing.&lt;/p&gt;&lt;p&gt;Swift&lt;/p&gt;&lt;p&gt;My first impressions of developing in Swift are mostly positive. I like a lot of the syntactic sugar that it has (guard clauses, for-when, implicit member expression (aka the leading dot syntax), etc).&lt;/p&gt;&lt;p&gt;It sucks that I have to fallback from SwiftUI to UIKit for some seemingly obvious things (e.g. changing the tint color of indicators in a TabView).&lt;/p&gt;&lt;p&gt;There is a mix of really solid documentation and tutorials, and absolute garbage that hasn't been updated as functionality changes. For example, I banged my head longer than I care to admin on installing custom fonts, because the official docs are wrong! You don't specify the full path to the font. Just the filename.&lt;/p&gt;&lt;p&gt;If you somehow made your way to this journal post from a search just because of this issue, let me give you more details. The Fonts provided by application under Custom iOS Target Properties on the Info tab should just be the filename of your font, irregardless of where in your directory structure the file is. Also note that you have to edit it via that menu, if you update the Info.plist manually, it won't work.&lt;/p&gt;&lt;p&gt;What's up next?&lt;/p&gt;&lt;p&gt;I've got some basic data models and the intro flow of Sherwalk, as well as the ability to pull step count data from HealthKit, and some minimal mocks in Figma done already. I hope to get an end-to-end demo out this week in the hands of some of my friends for some early testing and feedback.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>an update on.</title>
    <link href="https://ari.blumenthal.dev/!/5/-6/an-update-on"/>
    <id>https://ari.blumenthal.dev/!/5/-6/an-update-on</id>
    <updated>2025-08-05T12:34:56Z</updated>
    <content type="html">&lt;p&gt;It has been an amazing 11.5 (!) year run at Alphabet, by my access was just cut off and my role eliminated.&lt;/p&gt;&lt;p&gt;Why are you leaving?&lt;/p&gt;&lt;p&gt;"Local Remote" work is going away and I've declined the ask to RTO. I would prefer to work somewhere with a remote-friendly culture. ¯\_(ツ)_/¯&lt;/p&gt;&lt;p&gt;One of my awesome past teammates has also shared some interesting thoughts on Google in 2025.&lt;/p&gt;&lt;p&gt;What do you plan to do next?&lt;/p&gt;&lt;p&gt;No immediate plans yet, I intend to take some time off between roles hanging out with my very nearly 3 year old.&lt;/p&gt;&lt;p&gt;And maybe travel a little bit or work on some personal projects. I'll probably update this journal more frequently.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>music in games.</title>
    <link href="https://ari.blumenthal.dev/!/4/-6/music-in-games"/>
    <id>https://ari.blumenthal.dev/!/4/-6/music-in-games</id>
    <updated>2025-06-14T12:34:56Z</updated>
    <content type="html">&lt;p&gt;wrapped&lt;/p&gt;&lt;p&gt;If I've learned anything from seeing my spotify history over the years, it's that video games have a lot of really talented music composers — Masayoshi Soken (FFXIV), Piotr Musiał (Frostpunk), and Danny Baranowsky (Crypt of the Necrodancer) to name a few.&lt;/p&gt;&lt;p&gt;adaptive music&lt;/p&gt;&lt;p&gt;One of the details I love in some of my favorite games is when the music dynamically responds to what I'm doing. For example, listen to the battle music in Skies of Arcadia from the early 2000s as the player enters and exits a crisis.&lt;/p&gt;&lt;p&gt;Other games also make sure that certain beats in boss fights have solid scores to accompany them. A couple years ago, when I was playing Honkai: Star Rail, the Cocolia fight had this moment before the boss's big attack that I really enjoyed.&lt;/p&gt;&lt;p&gt;clair obscur&lt;/p&gt;&lt;p&gt;I just finished this game a few weeks ago, and I'm still thinking about it.&lt;/p&gt;&lt;p&gt;And Lorien Testard with Sandfall Interactive absolutely nailed the music across the board. Boss fights, cutscenes, wandering around, whatever. It's so, so good.&lt;/p&gt;&lt;p&gt;The battle at the end of act 2 has one of my favorite pieces in the game. And of course the cutscene in Lumière at the beginning of the game is unforgettable.&lt;/p&gt;&lt;p&gt;The whole 8+ hour soundtrack is astounding. I hope it wins a million awards and I can't wait to see what else he composes in the future!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>how.</title>
    <link href="https://ari.blumenthal.dev/!/3/-6/how"/>
    <id>https://ari.blumenthal.dev/!/3/-6/how</id>
    <updated>2025-01-27T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Technological advance is an inherently iterative process. One does not simply take sand from the beach and produce a Dataprobe. We use crude tools to fashion better tools, and then our better tools to fashion more precise tools, and so on. Each minor refinement is a step in the process, and all of the steps must be taken. -- Chairman Sheng-ji Yang, "Looking God in the Eye"&lt;/p&gt;&lt;p&gt;colophon&lt;/p&gt;&lt;p&gt;I've written previously in new site, who dis on the structure of this site, but not much on how I build it.&lt;/p&gt;&lt;p&gt;Everything on this site is hand-written in vim by sshing into (and attaching to a tmux session on) a linode (named santiago) from my laptop (more recently an M3 Pro named acen, but previously a 10+ year old asus zenbook with long-standing keyboard and not-wanting-to-boot issues). That server hosts this site and some of my other assorted projects.&lt;/p&gt;&lt;p&gt;I check my work on a staging instance of the blog, git push from the staging repo when I'm done, and then git pull from the prod repo to update the live site.&lt;/p&gt;&lt;p&gt;authorship&lt;/p&gt;&lt;p&gt;This blog does not and will not use AI or LLMs to generate any of its content. The code is entirely written by me or scripts that I've written and checked into its zkhr/blog github repo. (I briefly toyed around with the idea in 2023 of sharing dialogues with bots on my site, but I've since removed them.)&lt;/p&gt;&lt;p&gt;permanence&lt;/p&gt;&lt;p&gt;Jeph Jacques made a comment on QC #5458 that he could just go back and fix old comics, but it took him ~20 years to realize that.&lt;/p&gt;&lt;p&gt;I had this similar idea in my head that the content of these journal entries needed to be static snapshots and any changes needed dated caveats (like in birds), but at the end of the day, this is my blog so I can fix mistakes (like "sweet spot" to "soft spot" in pokémon scarlet).&lt;/p&gt;&lt;p&gt;And this is all checked into a git repo, so the history is still there if I want.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>p90x.</title>
    <link href="https://ari.blumenthal.dev/!/2/-6/p90x"/>
    <id>https://ari.blumenthal.dev/!/2/-6/p90x</id>
    <updated>2025-01-20T12:34:56Z</updated>
    <content type="html">&lt;p&gt;If our society seems more nihilistic than that of previous eras, perhaps this is simply a sign of our maturity as a sentient species. As our collective consciousness expands beyond a crucial point, we are at last ready to accept life's fundamental truth: that life's only purpose is life itself. -- Chairman Sheng-ji Yang, "Looking God in the Eye"&lt;/p&gt;&lt;p&gt;14 years&lt;/p&gt;&lt;p&gt;of watching Tony Horton tell me to do my best and forget the rest.&lt;/p&gt;&lt;p&gt;In 2011, I'd graduated college and moved out to California with a few boxes and a duffel bag. After living on my own a bit realized, "Yeah, guess I should probably work out".&lt;/p&gt;&lt;p&gt;But this was the tail end of the era of dvds. Netflix had some streaming options, but not everything was available there yet. I had to wait for episodes of Dexter to show up in the mail one disc at a time.&lt;/p&gt;&lt;p&gt;So I bought the p90x dvds. And now in 2025, I've forgotten how many times I've stopped and started and just pushed play.&lt;/p&gt;&lt;p&gt;Sometimes I complete all 90 days, sometimes I don't. Sometimes I stream the workouts, sometimes I put the dvds in a PS3 or PS4.&lt;/p&gt;&lt;p&gt;But once again, today is day one.&lt;/p&gt;&lt;p&gt;MLM&lt;/p&gt;&lt;p&gt;I can't write something positive about Tony and p90x without the Beachbody caveat. Their content is good. Great. Shaun T, Vytas, and others have created a lot of fun, engaging workouts and programs.&lt;/p&gt;&lt;p&gt;But beachbody has historically had some very questionable practices like their MLM business model. Although thank goodness, it seems they finally ended it a few weeks ago.&lt;/p&gt;&lt;p&gt;Midnight workouts&lt;/p&gt;&lt;p&gt;Back in 2015 (and then again in 2018), a small group of us had a bet with the following rules:&lt;/p&gt;&lt;p&gt;Those were definitely the p90x runs where I most consistently worked out.&lt;/p&gt;&lt;p&gt;Reddit&lt;/p&gt;&lt;p&gt;I had an alt I hardly used named u/greenbeansoup. Although, I rarely go on reddit at all anymore after the API changes in 2023 (that's around the time I dropped my main handle from the about me page on this blog).&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>artifacts.</title>
    <link href="https://ari.blumenthal.dev/!/2/-7/artifacts"/>
    <id>https://ari.blumenthal.dev/!/2/-7/artifacts</id>
    <updated>2024-12-30T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Superior training and superior weaponry have, when taken together, a geometric effect on overall military strength. Well-trained, well-equipped troops can stand up to many more times their lesser brethren than linear arithmetic would seem to indicate. -- Spartan Battle Manual&lt;/p&gt;&lt;p&gt;Not the valve one.&lt;/p&gt;&lt;p&gt;After playing spacetraders a few months ago, I've once again found myself playing an API game. In Artifacts, you're automating characters in an mmorpg.&lt;/p&gt;&lt;p&gt;Last time around I wrote everything in JS to go fast, but wished I'd tried out something new. This time around, I went with Rust.&lt;/p&gt;&lt;p&gt;I haven't used any languages with memory management since C/C++ at university, so actually thinking about the stack and heap and reference counting and all that was an interesting change of pace.&lt;/p&gt;&lt;p&gt;For some definition of interesting. Was that a &amp;str or a String that I wanted?&lt;/p&gt;&lt;p&gt;Read the book.&lt;/p&gt;&lt;p&gt;I don't remember what blog I found it on, but a few days into using Rust, I read a comment like "you can't just jump into using Rust, you have to read the book". Whoops, I guess.&lt;/p&gt;&lt;p&gt;Personas.&lt;/p&gt;&lt;p&gt;My implementation for artifacts is pretty similar to what I'd done for spacetraders with personas I could attach to my characters, but just a different set of tasks. Usually characters stuck to a specific persona, but sometimes I would have them all do the same one overnight (e.g. to get a bunch of resources or level up). The ones I ended up settling on were:&lt;/p&gt;&lt;p&gt;The Crafter persona to make weapons, gear, or jewelry.&lt;/p&gt;&lt;p&gt;The Gatherer persona to chop wood and mine ore.&lt;/p&gt;&lt;p&gt;The Fighter persona for characters to farm individual monsters or tasks coins.&lt;/p&gt;&lt;p&gt;The Angler persona to fish and cook.&lt;/p&gt;&lt;p&gt;At one point I also had a Chicken Chaser that just battled chickens.&lt;/p&gt;&lt;p&gt;Rust positives.&lt;/p&gt;&lt;p&gt;As a fan of Optional introduced recently in Java 8 (okay so I guess 2014 isn't considered recent anymore, but at least that isn't as old as that chicken chaser reference (Fable came out in 2004) and I did have a coworker whose license plate was JAVA 8, but that's unrelated) as a way of making code more explicit and readable, Rust's Option is pretty handy as well. Result is handy for similar reasons.&lt;/p&gt;&lt;p&gt;Spinning up and coordinating multiple threads was super painless. If something went wrong with one of them during the night, the other characters could still do their thing.&lt;/p&gt;&lt;p&gt;loop {} is rad.&lt;/p&gt;&lt;p&gt;Grabbing code from other crates was relatively straightforward. I used chrono (for dealing with time stuff), reqwest (for making the API calls), and serde (for handling json).&lt;/p&gt;&lt;p&gt;Error messages during compilation are excellent. No notes. For someone totally new to the language, they provided great starting points for learning more.&lt;/p&gt;&lt;p&gt;Skies.&lt;/p&gt;&lt;p&gt;My five characters are named after protagonists from Skies of Arcadia, the best RPG ever made (when wearing my particular set of nostalgia goggles): Vyse, Aika, Fina, Enrique, and Drachma.&lt;/p&gt;&lt;p&gt;It is surprising that in ~2 years of doing this blog I haven't written anything about that game yet. Guess I have to replay it in 2025.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>magic.</title>
    <link href="https://ari.blumenthal.dev/!/3/-7/magic"/>
    <id>https://ari.blumenthal.dev/!/3/-7/magic</id>
    <updated>2024-11-09T12:34:56Z</updated>
    <content type="html">&lt;p&gt;Urza and the Kor&lt;/p&gt;&lt;p&gt;My foray into magic began with the Call of the Kor deck from Stronghold (1998).&lt;/p&gt;&lt;p&gt;However, when I think of my personal magic nostalgia, the picture in my head is of the Lightning Dragon on the cover of those Urza's Saga tournament packs.&lt;/p&gt;&lt;p&gt;Of the cards I own from this generation, some of my favorites were Memory Jar, Rancor, and Deranged Hermit from Urza's Legacy (1999).&lt;/p&gt;&lt;p&gt;On again, off again&lt;/p&gt;&lt;p&gt;Magic as a hobby came and went. There were sets I drafted with my friends again and again like Mirrodin (2003), Champions of Kamigawa (2004), and Ravnica: City of Guilds (2005).&lt;/p&gt;&lt;p&gt;And sets I missed entirely.&lt;/p&gt;&lt;p&gt;While I mostly drafted, I do remember buying singles to get a set of Wellwisher and Llanowar Elves to build an elf deck around Voice of the Woods from Onslaught (2002).&lt;/p&gt;&lt;p&gt;Of the cards I own from this generation, some of my favorites were Isamaru, Hound of Konda from Kamigawa, Skyknight Legionnaire from Ravnica, and Sarkhan Vol from Shards of Alara (2008).&lt;/p&gt;&lt;p&gt;Duels&lt;/p&gt;&lt;p&gt;I briefly played Magic Duels in 2015, but gave up fairly quickly.&lt;/p&gt;&lt;p&gt;I posted on reddit about an issue with deck size limits (but never heard from the devs for that bug report).&lt;/p&gt;&lt;p&gt;Arena&lt;/p&gt;&lt;p&gt;I played a bit of arena a few years ago. There were two decks I built that I remember really enjoying.&lt;/p&gt;&lt;p&gt;The first was a Brushfire Elemental deck (Zendikar Rising, 2020) that used those landfall creatures to try and win the game quickly (and a few Goldspan Dragons (Kaldheim, 2021) to finish the job.&lt;/p&gt;&lt;p&gt;The other was an Archon of Sun's Grace deck (Theros Beyond Death, 2020) that used enchantments to make a bunch of pegasuses (pegasi?).&lt;/p&gt;&lt;p&gt;Intrigue and Critters&lt;/p&gt;&lt;p&gt;This year, I've found myself playing paper magic again, first with the preconstructed Murders at Karlov Manor commander decks and then drafting Bloomburrow and Foundations.&lt;/p&gt;&lt;p&gt;I absolutely love that full art lands have made a strong resurgence in recent sets. So many cool options, from the Phyrexia: All Will Be One lands in the Phyrexian language and the unique art style of the Kamigawa: Neon Dynasty lands to the stained glass Dominaria United lands, the stellar Theros Beyond Death lands, and the negative space Outlaws of Thunder Junction lands.&lt;/p&gt;&lt;p&gt;Of this generation, I've in general enjoyed the art and theme of Bloomburrow, but my runaway favorite card is the Mabel, Heir to Cragflame I drafted.&lt;/p&gt;&lt;p&gt;Final Fantasy x Magic&lt;/p&gt;&lt;p&gt;Another on again, off again game I've played over the years are the various iterations of Final Fantasy (e.g. see me previously trying to replay FFXV in the 2022 epilogue before my son was born (spoiler, he got here 2 weeks early) and looking forward to Dawntrail earlier this year (spoiler, it was great)).&lt;/p&gt;&lt;p&gt;So it's no wonder I'm excited for the upcoming collaboration between these two franchises next year. I can't wait to build a chocobo or moogle deck.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>spacetraders.</title>
    <link href="https://ari.blumenthal.dev/!/3/-8/spacetraders"/>
    <id>https://ari.blumenthal.dev/!/3/-8/spacetraders</id>
    <updated>2024-08-17T12:34:56Z</updated>
    <content type="html">&lt;p&gt;And so we return again to the holy void. Some say this is simply our destiny, but I would have you remember always that the void EXISTS, just as surely as you or I. Is nothingness any less a miracle than substance? -- Sister Miriam Godwinson "We Must Dissent"&lt;/p&gt;&lt;p&gt;Spacetraders is a "space-themed economic game with HTTP endpoints for automating gameplay and building custom tools." It's had me hooked during the evenings the last couple weeks in a "just one more turn" sort of way.&lt;/p&gt;&lt;p&gt;UI&lt;/p&gt;&lt;p&gt;I kicked off with a minimal web frontend to explore the mechanics of the game. Specifically, I built three pages to get started:&lt;/p&gt;&lt;p&gt;A market UI where I could see all the waypoints with markets and what goods they were importing and exporting.&lt;/p&gt;&lt;p&gt;A fleet UI where I could see the status of my ships, have them mine an asteroid, refuel as needed, transfer cargo to other ships, or fly around the system.&lt;/p&gt;&lt;p&gt;An rpc builder UI where I could hit arbitrary endpoints to fill the gaps for things that I hadn't added in my other pages (buying ships, handling contracts, etc).&lt;/p&gt;&lt;p&gt;Automation&lt;/p&gt;&lt;p&gt;Once I got the hang of the intro mechanics to the game, I started building some basic automation. This was done with a nodejs server that tells the fleet what to do.&lt;/p&gt;&lt;p&gt;Each ship is given a persona that assigns it an event loop which contains a sequence of actions to repeat indefinitely. I currently have five personas in use:&lt;/p&gt;&lt;p&gt;The Hauler persona (for my freighters) which has them fly to an asteroid, load from other ships until their inventory is full, and sell their cargo at a nearby market.&lt;/p&gt;&lt;p&gt;The Miner persona (for my drones) which has them fly to an asteroid and mine whenever they have cargo space.&lt;/p&gt;&lt;p&gt;The Pricer persona (for my probes) which has them fly in a loop around the different markets and stores the prices of goods in a postgres db. This uses a naïve nearest neighbor algorithm for generating the route.&lt;/p&gt;&lt;p&gt;The Trader persona (for my frigate) which has it find the most profitable good in the system, pick it up at one waypoint and sell it at another.&lt;/p&gt;&lt;p&gt;The NOOP persona for ships I have stationed at a particular waypoint (e.g. so I can buy ships at its shipyard, etc).&lt;/p&gt;&lt;p&gt;Current Status&lt;/p&gt;&lt;p&gt;The game is an alpha, so the server resets every ~3 weeks. The last reset was on 2024-08-11 (I started playing a little before then) and my handle for this reset is ZAKHAROV.&lt;/p&gt;&lt;p&gt;At time of writing, I have ~1.5 million credits which puts me 14th on the leaderboard for this reset (mind you there are very likely more players that have more credits than me if you include the cost of their ships (and 1st is currently at ~500 million, so there is that)).&lt;/p&gt;&lt;p&gt;My fleet consists of 21 ships: 1 frigate, 4 probes, 1 shuttle, 3 freighters, and 12 drones.&lt;/p&gt;&lt;p&gt;What's Next&lt;/p&gt;&lt;p&gt;There are several directions I could go from here. Some ideas in no particular order:&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>university.</title>
    <link href="https://ari.blumenthal.dev/!/3/-9/university"/>
    <id>https://ari.blumenthal.dev/!/3/-9/university</id>
    <updated>2024-06-16T12:34:56Z</updated>
    <content type="html">&lt;p&gt;There are two kinds of scientific progress: the methodical experimentation and categorization which gradually extend the boundaries of knowledge, and the revolutionary leap of genius which redefines and transcends those boundaries. Acknowledging our debt to the former, we yearn nonetheless for the latter. -- Academician Prokhor Zakharov "Address to the Faculty"&lt;/p&gt;&lt;p&gt;Prelude&lt;/p&gt;&lt;p&gt;While digging through some files, I found my college transcript from — looks at calendar — 13 years ago and thought it might be fun to jot down some recollections.&lt;/p&gt;&lt;p&gt;Transfer&lt;/p&gt;&lt;p&gt;I took a few AP tests in high school and got out of intro chemistry and calculus freshman year. It's still interesting that after a decade or so of school before university, a handful of transfer credits from AP tests are the only things that carry over.&lt;/p&gt;&lt;p&gt;Fall 07&lt;/p&gt;&lt;p&gt;I actually started off as a mechanical engineering major, hence taking ME 170. It was cool to play around with CAD for a semester, but ultimately not what I wanted to do.&lt;/p&gt;&lt;p&gt;My AP physics score wasn't high enough and I didn't pass the exam to get credit for multivariable calculus, so even though I took both PHYS 211 and MATH 241 in high school, I had to take them again freshman year.&lt;/p&gt;&lt;p&gt;Spring 08&lt;/p&gt;&lt;p&gt;After quickly deciding to switch to a CS major, I had to take CS 125 and CS 173 before the program would let me officially transfer in. Which is so much easier than today, since you're apparently no longer allowed to move into the CS program from within the university.&lt;/p&gt;&lt;p&gt;Fall 08&lt;/p&gt;&lt;p&gt;Learning data structures in CS 225 was one of the top two most important software dev classes I took. Useful for day to day coding fundamentals (and passing interviews).&lt;/p&gt;&lt;p&gt;Spring 09&lt;/p&gt;&lt;p&gt;CS 460 was pretty neat, we read articles like Smashing The Stack For Fun And Profit and then implemented them in the computer lab.&lt;/p&gt;&lt;p&gt;Fall 09&lt;/p&gt;&lt;p&gt;I remember putting a certain penny arcade comic in a presentation for my CS 210 ethics class. Got a good score on it, but the teacher wasn't fond of the cursing.&lt;/p&gt;&lt;p&gt;Hands down, my favorite class at university was CS 242. This class had a weekly programming assignment that you could solve in any number of ways, but you would have to present your solution to a small group of other students and a TA. This meant you saw the different ways that everyone in your group approached the same problem.&lt;/p&gt;&lt;p&gt;Some weeks, the assignment would build up off of the previous week's work (without you knowing ahead of time), so if you wrote clean code, you'd be better off than if you quickly hacked something together and left yourself with a bunch of techdebt.&lt;/p&gt;&lt;p&gt;Probably the closest class in college to actually having a software job.&lt;/p&gt;&lt;p&gt;Spring 10&lt;/p&gt;&lt;p&gt;Along with data structures, CS 473 is the other of the top two most important software dev classes. I still recommend Erickson's algorithms textbook as a canonical reference for learning or reviewing this topic.&lt;/p&gt;&lt;p&gt;When a student asked if dancing would be on the final exam, the answer was yes! We got a final where every question was about dancing.&lt;/p&gt;&lt;p&gt;Fall 10&lt;/p&gt;&lt;p&gt;During my last year of college, I had to finish up some gen eds and decided to start taking some extra math classes like MATH 417 for fun.&lt;/p&gt;&lt;p&gt;CS 598 with LaValle was a super interesting dive into relevant research papers (and the only grad-level course I've taken).&lt;/p&gt;&lt;p&gt;Spring 11&lt;/p&gt;&lt;p&gt;My senior thesis for CS 499 was A primer on covering spaces for robot exploration, which was essentially a variation of the art gallery problem.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>looking forward.</title>
    <link href="https://ari.blumenthal.dev/!/2/-9/looking-forward"/>
    <id>https://ari.blumenthal.dev/!/2/-9/looking-forward</id>
    <updated>2024-06-07T12:34:56Z</updated>
    <content type="html">&lt;p&gt;I&lt;/p&gt;&lt;p&gt;The fifth ffxiv expansion, Dawntrail, releases in exactly three weeks on June 28 and I'm excited to continue the adventure. It will be interesting to see how the dynamics between the Scions plays out on opposite sides of the political struggle over in Tural and Wuk Lamat seems like a great addition to the cast.&lt;/p&gt;&lt;p&gt;If there isn't a battle on that big bridge between the northern and southern regions, I will be sorely disappointed.&lt;/p&gt;&lt;p&gt;II&lt;/p&gt;&lt;p&gt;I have one book left in The Murderbot Diaries series by Martha Wells after which I'll be caught up (until the next three come out). The titular character's relatable perspective on this dystopian universe has been entertaining to read, what with Murderbot's growth as a person, their relationships with ART, Ratthi, Mensah and the rest of their crew, and all the various adventures, missions, and whodunits.&lt;/p&gt;&lt;p&gt;It also looks like there will be a TV adaption of the books expected to release later this year, about which I'm fairly optimistic. Although with Murderbot processing so many things in parallel, it will be interesting to see how it translates to this medium.&lt;/p&gt;&lt;p&gt;III&lt;/p&gt;&lt;p&gt;I tried out the Ultracube mod a few weeks ago, but the weekly friday facts for Factorio really have me excitedly waiting for the next expansion that might be releasing later this year.&lt;/p&gt;&lt;p&gt;The fff-414 details earlier today about resources spoiling on Gleba have me cautiously optimistic, since it's a mechanic that penalizes my habit of frequently buffering materials on my bases.&lt;/p&gt;&lt;p&gt;The music in fff-406 is amazing. A lot of my spotify history is whatever game soundtrack I'm listening to in the background while coding (FFXIV, Frostpunk, Octopath Traveler, etc) and this looks to be a strong addition. (The rest of my history is my kid's playlists.)&lt;/p&gt;&lt;p&gt;I have such a huge amount of respect for the factorio devs. It is obvious how much love and polish they put into the game and I can't imagine this expansion will be any exception.&lt;/p&gt;&lt;p&gt;IV&lt;/p&gt;&lt;p&gt;After writing the first three sections of this journal entry, I looked up out of curiosity if there had been any news on when Civ 7 was coming out, and lo and behold, it was accidentally announced earlier today! (It has since been formally announced for 2025.)&lt;/p&gt;&lt;p&gt;With previous Civ games releasing in 1991 (I), 1996 (II), 2001 (III), 2005 (IV), 2010 (V), 2016 (VI), this 9 year gap will have been the longest between major releases.&lt;/p&gt;&lt;p&gt;Last year I launched roze, a discord bot for tracking turns for multiplayer Civ 6 games. She is now a verified bot in over 100 servers, which is pretty exciting (and required me to do some extra data retention cleanups and introduce a terms of service). If they don't include built-in support for something similar in Civ 7, I'll try and get roze up and running pretty quickly after launch.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>zoom.</title>
    <link href="https://ari.blumenthal.dev/!/2/-8/zoom"/>
    <id>https://ari.blumenthal.dev/!/2/-8/zoom</id>
    <updated>2024-06-02T12:34:56Z</updated>
    <content type="html">&lt;p&gt;If you're on desktop, you can now zoom in and out on the grid with the [ and ] keys.&lt;/p&gt;&lt;p&gt;I'd previously toyed with animations that would zoom in and out when navigating far distances on the grid, but never settled on one that I liked. This feature takes inspiration from that, letting you just zoom in and out as you please.&lt;/p&gt;&lt;p&gt;At 3 levels of zoom, the performance of the page is a little janky, but not so bad that I want to do further rendering improvements (above and beyond the switch from position offsets to css transforms in this commit).&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>feed.</title>
    <link href="https://ari.blumenthal.dev/!/1/-8/feed"/>
    <id>https://ari.blumenthal.dev/!/1/-8/feed</id>
    <updated>2024-05-05T12:34:56Z</updated>
    <content type="html">&lt;p&gt;I've added an rss feed to the site. Well, not actually. Everyone calls it an rss feed, but when digging into it, the recommended choice in 2024 for the fast-moving technical domain of metadata syndication is Atom, defined in rfc 4287.&lt;/p&gt;&lt;p&gt;It's auto-generated using the same scripts I use for generating this hilbert curve journal itself, so it should stay up to date with the latest 20 entries.&lt;/p&gt;&lt;p&gt;And at least at time of writing this entry, it is a valid Atom 1.0 feed.&lt;/p&gt;</content>
  </entry>
</feed>