If you’re reading this, I finally updated the backend of the site to use a new
framework—from Jekyll to Hugo. I also took the opportunity to redo the homepage
a bit. I don’t have as many blog-post-shaped thoughts as I used to, so I reduced
the post previews to just links to create room for more freeform content. 
 The Hugo migration was
a bit of work because I took…
I read a comment stating that git (a tool programmers use to collaborate on
code, sort of like Word’s Track Changes) is not a version control system but a
“system for creating a version control system.” 
 That got me thinking about other such “metasystems” I use, and the frustration
that arises when one expects a mere system and instead gets the…
I recently learned about PageRank , the
original Google algorithm for ranking webpages. It works by constructing a
Markov chain on links between pages and computing the stationary distribution.
The stationary probability of a given page measures the page’s centrality in the
web, an index of popularity. 
 I wanted to try implementing the algorithm myself and fiddle with a…
Owen Lacey
 blogged about
a reality game show called Are You the One? in which contestants win a
prize by guessing the soulmate ordained for them by the show’s producers.
Specifically, there are n n men and n n women, and each one has an unknown
“perfect” match; to win the prize, the contestants (as a group) must pair
everyone up correctly. 
 During…
There is a pytest-ruff plugin for
Pytest (a Python testing framework) that will automatically run
 ruff format --check and ruff check as part of your test suite. The
 pytest-mypy plugin does the same thing
for Mypy. These plugins are handy, but for some reason , the tests they generate
are exempted from the pytest -k ... logic. Normally, you can use -k to
select a subset of…
If you need a fun fact for a corporate icebreaker activity, you can always say,
“I was Time magazine’s Person of the Year in 2006,” then stand around
awkwardly waiting for someone to Google it. 
 The
 official announcement 
of “your” accomplishment makes for good reading in 2025. In tech circles, we
often regard the early days of Web 2.0 as a time of…
My team at work recently got to host a Career Pathways Takeover at
 Urban Arts , a nonprofit based in New York that teaches
programming, animation, and storytelling education to high schoolers to prepare
them for success in college and beyond. 
 I was so impressed by the students’ thoughtfulness and engagement. We walked our
group of Game Academy students through our team’s…
This year’s application for Critical Language Scholarship from the US State
Department is now open . (Thanks, group chat!) 
 CLS is a fully funded summer language immersion program for American
undergraduate and graduate students. I strongly encourage any interested in
learning one of the nine
 critical languages to apply. Some
languages require prior language study;…
I cleaned up a few utility Python scripts for the GitHub: 
 
 fetch_python_docs.py sets
up a local mirror of docs.python.org on
 http://localhost:8004 for offline reference. It can also provide and enable
a systemd unit file, so you can run the script once, bookmark the local URL,
and forget about it. 
 typography.py (which I mentioned
 here ) checks for ASCII…
GitHub has a tool called Dependabot that automatically finds outdated package
versions pinned in project configuration files and issues a pull request to
update them. Support for conda environment.yml files has long been one of the
 most requested 
features in the Dependabot repo. At long last, GitHub has now added partial
support for conda to Dependabot, first as a
 beta…
Suppose we have data D D and a model that expresses D D as a noisy function
of a parameter vector θ \theta . We want to determine a value of θ \theta 
that fits the data. For the purposes of this post, we’re concerned with models
that are “difficult,” meaning we cannot write down a simple expression for the
likelihood function and maximize it, whether analytically…
I’m obsessed with this essay
 “Raising a person in a culture full of types” 
by Dan Brooks. Before we get to the author’s message, let’s take a moment to
appreciate his sense of comedic timing, e.g.: 
 
 My son talks incessantly about VSCO girls and Karens and other categories of
people he has learned about from YouTube. He described a classmate as…
I wrote my first plugin for the Jekyll static website builder: a tool that
recommends related posts 
at the end of each page. It determines the similarity between post pairs using
a fairly unremarkable token-counting algorithm, so it’s fast enough to rerun on
every site build. You can configure the number of posts to recommend and a
parameter factor which determines the…
Kagi Search: It’s a paid search engine that promises to
give better results than Google and friends. Indeed, the search results are a
little more relevant, especially when researching technical topics. I made great
use of the ability to
 filter and promote entire domains .
However, the pricing doesn’t work for me: $5/month gets you 300 searches, which
isn’t enough (I burned…
Awesome people occasionally reach out to ask me about the US State Department’s
 Critical Language Scholarship (CLS) program.
I participated in CLS Korean in
2016, and I still find myself learning from the experiences I had in Gwangju
all those years ago (and that’s with four additional years of living in Korea
and several visits in between). 
 This year’s CLS cohort…
I remember taking mild offense when my middle school language arts teacher
introduced our class to the thesaurus. I thought, if I let the thesaurus choose
my words for me, then is it even my writing anymore? This seems like a flaw in
my temperament: I always regard technology with suspicion when it threatens to
supplant human creativity. 
 Inevitably, as I progressed through…
The target audience for this post is myself. I recently set up a new (old)
laptop and tried to bring it to parity with my main Kubuntu workstation in as
few steps as possible, which turned out to be … a lot of steps, most of them
manual. I wanted to document the full process and see if I can find worthwhile
opportunities for automation.
I still play the guitar like a piano. It’s most obvious when I try to play along
with the lead guitar part in a recording of a two-guitar band. Often, the lead
guitar just has a simple single-note riff or triads in the upper register, but I
cannot resist the impulse to insert bass notes in the “left hand” (often
grabbing them with my thumb). It doesn’t feel like a complete part…

 Honey, baby, etc. 
 Even young people have the accent. This surprised me because I thought that
regional accents were slowly melting away thanks to mass media. In Korea, kids
may have picked up a few regionalisms from family, but for the most part they
spoke like the video game streamers they watched on YouTube. In Tennessee, you
can hear an accent even in young toddlers.…
I didn’t realize I had a system for this until I did. 
 My system: I only ever open one browser window (OK, two on my work computer
where I use MS Edge profiles for different Microsoft accounts). 
 When I open a new tab, I scan the tabs already open and move it left or right so
that the tabs remain ordered by decreasing priority. “Priority” means something
like, how annoyed…
A side effect of my refusal to subscribe to Spotify (I just buy albums on
Bandcamp or used CDs) is that when someone sends me a song to listen to, I
usually look it up on YouTube and end up watching the music video. Because of
this, there are some songs or artists that I like more than I might have without
the video because the video adds an additional layer of interpretation.…
Reasons (excuses?) that I cannot
 downgrade to a dumbphone : 
 
 2FA apps. You can set up a generic TOTP program on your computer, but that’s
not very convenient, and some organizations explicitly require you to use
Microsoft or Google Authenticator. (I don’t know how they enforce this given
that the algorithm for generating TOTP codes from the secret is an…
This Stack Exchange answer reminded
me of a useful data science trick. In short, if you try to model y y as a
sinusoidal function of x x , you obtain a regression formula that is nonlinear
in the parameters. However, if you know the period, you can use a trig identity
to linearize the formula and compute an exact least-squares fit.
Many Rust projects, such as Topgrade ,
also publish themselves on PyPI. This means you can install them using pip or
 pipx as follows: 
 pipx install topgrade
 pipx install zizmor
 This pulls a binary (wheel) directly from PyPI, which obviates the need to
compile from source—handy on low-powered machines where cargo install can take
a while to run or exhaust the memory…
I attached my real name to this site. That means that above all, this site must
represent me authentically. 
 Authenticity is why I don’t use any generative AI tools in authoring or editing
my posts. Heck, I barely even use spellcheck. The
 2006 Adam Sandler movie Click 
pretty clearly spelled out the risks of letting an AI autopilot your life: Such
technology promises to…
Why is the burden on me to prove that I’m not a robot instead of on the server
to prove I am? This is a vain question if you reflect on the adversarial nature
of internet spam, but I am asking anyway. Here’s a fun game:
 Prove you are a human.

 Phone (Android): Long press the hyphen button 
 Desktop (Linux): Compose key 
sequence --- 
 Work computer (Windows):
 
 If in Word or Office: Type two hyphens and let it autocorrect 
 If Markdown: Use the HTML character entity — 
 Otherwise: ⊞ Win + . character chooser, or just Google
“em dash” and copy/paste 
 
 

Manuel Moreale, a tireless indie web advocate, recently
 had me as a guest on his People and Blogs series 
( local mirror ).
Welcome to anyone visiting this site via Manu’s feed! Take a look around and
 let me know what you think. 
 I was super excited to be interviewed by Manu, as many of his writings have
sharpened my thinking around why I prefer blogging, email, and…
Here is a local mirror of my interview on Manuel Moreale’s
 People and Blogs series. 
 Let’s start from the basics: can you introduce yourself? 
 Sure. I grew up in Seattle, went to college in Los Angeles, then lived in South
Korea for four years, first as an English teacher in Naju, then as a grad
student at Seoul National University. In 2022, I moved to the…
Using a tip from
 Travis Hathaway ,
here is a shell one-liner to check if a Conda environment is up to date: 
 conda update --all --dry-run --json | jq -e '.success and (.actions | length) == 0' 
 It exits ( -e ) with 0 if the environment is already updated and 1 if
updates are available. 
 I use this in CI so that I get an email if my environment.yml file is…
IndieWebCamp wiki: 
 
 You should make a “chipotle” page so when a friend is picking up Chipotle for
you, you can send them a link instead of having to redescribe/retype your
Chipotle order. 

When I migrated from Blogger to Jekyll a few years ago, I left a bunch of posts
behind, with the vague resolution of importing them at some point. Today, I
excavated a few more from the archives, all about teaching: 
 
 The benefits of a
nonnative teacher (2020): A very long-winded way of saying that language
learners often benefit from having a teacher who isn’t a native…
On Tuesday night, South Korean President Yoon Suk Yeol imposed martial law
across the country for six hours. He retracted his declaration only after the
National Assembly passed an emergency resolution ordering him to back down. As
of this writing, the Assembly has drafted but failed to vote on articles of
impeachment. Instead, Yoon’s party has announced a plan for the…
I recently transitioned this blog to self-host its fonts (IBM Plex Sans, Sans
KR, and Mono) from within the GitHub Pages artifact instead of calling the
Google Fonts API. This makes the site a little more “static” by eliminating the
need for your browser to download font files from an external domain. Here, I
explain how (and why) I self-host fonts without bringing them into the…
Illusion Slopes is a personal blog. I write about whatever’s on my mind. My goal
is to document my thoughts and gain perspective on how they have evolved since
starting this site as a college student in 2016. I’m also interested in
connecting with readers who have similar life experiences or contrasting
viewpoints.
I wanted to follow up on my previous post about the CLS alumni seminar in Gwangju to
spotlight my favorite excursion of the week: our visit to the 88.9 Gwangju
FM community radio station. Gwangju FM has
no particular theme, but they dedicate part of their schedule each week to
programming related to the Gwangju international community. When our group of
twenty-five showed up,…
I had the honor this week of participating in the first ever Critical Language
Scholarship Alumni Seminar 
( archive.org mirror )
at Chonnam National University in Gwangju, South Korea. The seminar focused on
media literacy and democracy, and I can’t think of a better time or place to
study the topic. 
 Koreans take their democracy very seriously, as evidenced by the high…
These lecture notes
(PDF) 
from Asu Ozdaglar give a bilinear program whose solution is the mixed-strategy
equilibrium for a two-player, non-zero-sum game with finite action spaces—also
known as a bimatrix game. I wanted to reproduce this highly practical result in
a more accessible format and offer some implementation notes.
Most cafés have separate lines for placing your order and picking it up. After
you order, you move to the next line, and since drinks come out in more or less
the order they were requested, the barista usually announces your drink around
the time you get to the front of the second line. 
 However, for simple drinks like drip coffee, all the barista has to do is fill
the cup, so…
I live near a one-way street, and drivers keep turning into it the wrong way by
mistake. Most react by getting flustered and backing dangerously into the
arterial, perhaps following an instinct to “undo” the error. The safer solution
(in my eyes) is to park the car, wait for traffic to clear, then use a driveway
to point yourself in the right direction. 
 Unfortunately,…
A footrace, but the objective is to run as far as possible in a fixed amount of
time rather than speeding through a fixed distance. The catch is that the time
limit is drawn randomly at the start of the race, so you cannot strategize
around it being a sprint or distance event. 
 I think a good choice of distribution would be an log-normal distribution with a
mean of around four…
I created a new logo for the site today: 
 
 
 
 The old one was just a square with my initials, MK, which seemed a little too
self-indulgent (not to mention that I share these initials with half of my
extended family, so I can hardly claim them as my own): 
 
 
 
 The new logo still kind of forms a stylized letter m, if you imagine the…
The best thing about fish is probably the
 lateral line ,
which sort of like ears for underwater that enable fish to sense and locate
predators even in dark or murky conditions. 
 The best thing about the fish command-line shell, on the other hand, has to be
its “fuzzy” completions. In most other shells (like Microsoft PowerShell, which
I use every day at work), you can…
I am one of those obnoxious people who begins his filenames with an ISO date,
like 2024-03-06_blog_post_idea.md . I know that file metadata already tracks
creation and revision dates, but I don’t like those: The creation date is
misleading when you duplicate a file to reuse its format or content, and the
revision date is all but meaningless because modern software modifies…
On a recent visit home, I dug this 2007
 Sansa Clip 
out of a box. 
 
 
 
 It’s battery life is shot, but everything works, and I unearthed some critical
throwback jams from the built-in 4GB of flash memory (among other things, the
first four Brad Paisley albums in .wma format). As the picture shows, I also
installed a bit of custom firmware called Rockbox .
Mostly novels this time: 
 
 
 조남주, «82년생 김지영», a 2016 novel about (I have struggled to phrase this
in a way that isn’t too dead-on) why it is so hard to be a woman in
contemporary Korean society. 
 The movie version from 2019 is better known, perhaps thanks to the sanitized
resolution in which the title character learns to
channel her resentment into creative…