As I try to grasp October, it slips through my fingers like sand in an hourglass. The month lingers in my memory, yet the details are few, the recollections minimal.
My routines unfold like well-rehearsed performances—some bring satisfaction, while most only add stress. My body follows familiar patterns, yet my mind drifts to places I don't even realize.
Conversations drift in from people scattered across different time zones and life paths, their stories collecting in my mind like artifacts from distant places. Archived, but not yet processed.
Over the entire month, all I see is an endless cycle of days bleeding into nights, sleep patterns dissolving into chaos, meetings stretching beyond their bounds.
In this frozen state of existence, books continue to be my go-to escape. Like in September, they create parallel worlds that run alongside a reality that has stalled.
Within their pages, I find movement. Stories unfold with their unique logic, each chapter revealing new possibilities I can't help but follow.
As October departs, leaving behind mere fragments of memories, something continues to shift beneath the surface. I'm still unsure about what is it.
So I persist, my mind continuously streaming input from books like data packets from a trusted source, finding stability in their structured chaos. Because sometimes, running in maintenance mode is enough, and there's beauty in the hum of a system in AUTO mode, preparing for its next deployment cycle.
I have gotten annoyed by timezone calculations for hopefully the final time. Here's a static html page you can download and save locally to roughly compare times in different timezones (just hours; you're on your own for minutes).
If you're not in a whole-number timezone (Hello India), you'll need to do some additional mental arithmetic by comparing nearby rows.
That's it. Since it's almost entirely static, you can always be sure that you're seeing the same thing on this page as anyone else.
Unfortunately you need to know if you're in daylight savings time or not, something that is often beyond me. I'm not sure what to do about that without reintroducing dynamism that takes the current computer's time into account. Then I again end up wondering if others are seeing what I'm seeing.
There are a few abbreviations for America, Europe and Australia in both pages. You can now see *ST and *DT on either page, which might help if you're not observing daylight time yet, but someone else is. There's a tension here between trying not to be overwhelming and emphasizing the Western or Northern hemisphere. My thinking is to only add codes for longitudes with lots of cities or with daylight savings time. Hopefully people in Bhutan or Nigeria or the Chatham Islands won't hold it against me.
October came and went, ideas piled up in notebooks, but I kept on drawing. I
knew already by the time I had finished the Pocket Rewriting zine that I would make a
dynamic implementation of it which, by the way, was very well received despite
my not having even had a chance of giving away a single one. I was delighted to
see folks print their own copies.
These past two weeks have been a throwback to the release of Orca, where the less programmatically inclined
started playing with it right away, and those with preconceptions about what
programming is, what it should look and work like, found it inscrutable and
opaque. To some, the booklet remains near undecipherable. I will try to help
bridge that gap with more approachable documentation and examples over the winter.
Wow, almost November already. I've been having a lot of political anxiety. I started making Youtube videos to distract myself and learn some new skills. It's fun.
I've been getting back into teaching kids programming 1:1. Of course, this time using Lua, LÖVE and Carousel. After a couple of months, it occurred to me to collect all my little impromptu puzzles and exercises into a single app anyone can go through on their own schedule.
Carousel Cards (LÖVE app, really just a zip file containing source code, 169KB)
Nowhere near done yet. But it has 50 112 little "levels", each taking between a few seconds and a minute. A full game/curriculum might need 2000 levels or something.
I always wanted my name in lights,
Or maybe just a perfect hole somewhere,
Carved out especially for me.
I would slip into it seamlessly as if it were a silk dress,
Sewn with utmost precision,
Every inch of my skin, perfectly corresponding
To each dot outlined in its silhouette.
Instead I cut off my breasts,
The hollowed twin concaves on my chest
Now carefully scraped off of all its tissue
So that I could crawl into that space,
A place for me,
And me alone.
I can hear my heart beat a little louder,
I can sit and stand up a little taller.
This month two separate conversations reminded me of some stories I wrote. One is Behind Gray Blocks, my cyberpunk novelette from last autumn, that takes place in the weeks right before Halloween because that's when I started to write it. Doesn't get more seasonal than that. (Speaking of which: I'd like to see more Halloween movies, the same way we have Christmas movies: i.e. not (only) horror, or at least not gratuitous horror.) The other is Parole Planet, a short story I wrote more than eleven years ago and it's still one of my all-time favorites. Haven't touched that setting in a long while though, and generally don't feel like writing any fiction these days, but it's fun to think about it.
This month I also learned to program in Scheme for real, in other words not just fool around with the basics. Turns out it's much more usable in practice than its reputation as an academic language suggests. Active, welcoming communities are a bonus. Another tool that will come in handy sometime, by the looks of it. Just not right now.
Being bored, my next step was relearning Prolog, a language that used to interest me a lot, but only knew from old books, and that showed. Still extremely clunky for any kind of practical task, but one of those languages that change how you think about programming. Also far from dead and being actively developed, though it can take a little research to start getting a clear image of the current landscape. But that, too, is part of the fun. One more thing to put in my notes.
The beginning and end of cycles occur regardless of our preferences. Today was difficult; We had to lay off several people, and I feel terrible about it.
I regret not updating this blog regularly, but it feels minor compared to everything else going on. This situation prompted me to declutter my life. I sold my desktop computer and decided to keep only my laptops, with one as my daily driver. Simplification is key.
That gets me thinking on how other stuff in my life doesn't make sense anymore. so what does make sense now? That's the big question. gotta think, get my thoughts in order, try to figure out wtf is happening. Because there's definitely signs that there's shit's going down that i can't control.
Sometimes it feels like i'm not taking enough initiative. i'm being way too passive because i'm just so damn tired. Even with the changes i've made, there's still things that need to happen, and they are mine to solve.
Life's full of cycles starting and ending that we can't always control. companies restructure, relationships change, shit happens around us. sometimes all you can do is think, reorient yourself, and find that energy from inside to do something about the things you can control.
Change is hardly ever easy, but it's also a chance to level up. by admitting what's not working anymore and growing the balls to leave it behind, we make room for new things to come into our lives. the important part is to not get stuck doing nothing or freezing up. gotta find what matters to you and what motivates you to keep going.
So, while i'm in the middle of this tough ass transition, both with my company and my own life, i'm trying to get back to what i'm about at my core. i'm looking for the next positive moves i can make, even if they're tiny. At the end of the day, life goes on. and it's on us to decide what the fuck we do with it. so here's to new beginnings, even when they suck.
Three weeks! I think that was the longest I went on without writing a single
line of code for the past many years, for even during long transits at sea, I
find time to sneak some in to answer these questions one ponders while gazing
at the horizon. I had other things on my mind this month, slides to finish,
dailies to draw, and settling back in our winter life in Victoria. As of
yesterday, that streak ended.
For the upcoming Handmade event, I wanted to be able to show anyone who
might ask a few simple examples of rewriting computation in a way that would
not be intrusive during a conversation, so I printed a zine that covers the basics of it, basics that I could
foresee myself repeat over again and having a challenging time doing so without
visual aids, rewriting being inherently a visual coding paradigm.
Emacs-style ranges on a text buffer that I can now hang attributes like color, decorations and click handlers on to.
Inserting/deleting text before a range moves it.
Inserting/deleting text after a range leaves it unchanged.
Inserting/deleting text within a range grows/shrinks it.
Deleting text at a boundary shrinks the range, and deletes it when it becomes empty.
Inserting text at boundaries can't disambiguate whether I want the text within or outside the boundaries. But I can grab some handles on the range to adjust.
The final complexity cost was 200 lines but it was a non-linear path getting there. I started out with the notion of pivots from my doodle app. There, pivots live inside the data structure for a single line of text. Since ranges now need two pivots that could be on different lines, I had to move them out. I started tracking pivots in a separate data structure, maintaining bidirectional mappings between pivots and their locations, and then tracking ranges as combinations of pivots. This quickly blew up the implementation to 500 lines, and I was juggling 27 manual tests of which half were failing.
The next day I started from scratch and threw out the notion of pivots entirely. Now I just maintain 2 locations directly inside each range, and linearly scan through them all for any book-keeping. The implementation dropped to 200 lines and the tests passed fairly quickly.
Earlier this year I threw out an implementation after suffering with it for 2+ years. It feels like I'm getting the hang of this programming thing that I threw out an implementation now after just 2 days. I'm setting a higher bar for elegance. At the same time, it's interesting that my instinct remains as poor as ever for the right approach in even a slightly new problem. Here I spent a lot of time trying to squeeze my ranges into lines so that deleting a line would transparently delete ranges within it. But I blindly assumed a fully normalized design with a first-class notion of a pivot must be a good idea.