December 2024

TABROOM

Had a short hiccup on Friday night; it was largely because I’d spun up extra capacity but the process of spinning it up didn’t quite finish, alas, for a really stupid reason.  But fortunately it was also quick to fix; the process to get around the stupid reason was fast, and we were back after like 6-7 minutes.  I can’t promise never to have issues, after all; nobody can in tech.  But it’s nicely affirming when the problem is just a little turbulence instead of a full plane crash, especially when I recovered so fast as a direct consequence of some blood sweat & tears I’ve recently put in.

That brings me to a wider point about the rewriting process and the concept of a feature freeze.  I’m trying to not code up new material in the old programming environment as much as possible, except for direct bug fixes and flaws, while I get the infrastructure rolling behind the new framework. However, to some degree that is impossible.  Tabroom’s reality is constantly changing, because you all keep using it.

Even if I never add another feature and only fix bugs and errors, Tabroom must change, simply because the scale increases. We get more traffic year over year, more tournaments, more students, and every one of our end participants uses the tech more heavily too; we bring three devices per person to tournaments now. That growing load represents unavoidable change permanently baked into Tabroom, that will always demands a measure of attention.  Software in active use can never be paused.

So after our fun times in November I combed through our records of moments the database locked up with heavy write traffic, and rewrote every page and query that featured there to avoid them. The big one was the pref entry screen.  Did that cause our corrupted index?  I’ll never know. But it will perhaps make them less likely in the future, and it will definitely make parts of the site run faster and better.

The expanded load also means the software is more unforgiving.  Smaller mistakes become big problems. To a degree the expansion of Tabroom represents an expansion of the world of forensics.  This is good!  But it does demand I keep up with it, so I’ll never be able to entirely focus on the rewrite.

But all the same, I’ve made some good progress there. One big advantage of the new framework is it runs a lot faster on less powerful hardware.  The other big win is that I’m a far better coder than I was twenty years ago; the code I put out after rewriting will be more robust and capable.  I can already feel the system reaping the benefits of both of those things.  I’m not traveling at all in December, either for myself or tournaments, after this weekend.  I’m hoping I can use the stillness to hunker down and turn the corner; I’ve seen its edge, so we are perhaps near to seeing some reality there.

THE OTHERS AROUND

My sister got a new gig already after the old one had a round of layoffs; the new one seems much more comfortable and promising, though, so props to her for landing so quickly.  I continue to have some pretty phenomenal nephews and nieces, as finding things they’ll like during my travels has confirmed for me.  But then, I am somewhat biased.

JUST LITTLE OL’ ME

Welcome to the Holiday Season, such as it is.  I confess a dearth of conventional Christmas spirit, and generally I try to avoid traditional observance of the holidays. For one, Christmas really my dad’s holiday; he always made it a big deal, and since we lost him some 13 or so years ago, his passion for the day adds a tang to the holiday that I find it better to avoid. Don’t take up smoking, kids.

And as it happens, December 25th is the least common birthday of the year, but it was still the birthday of Humphrey Bogart, Jimmy Buffet, Sissy Spacek, Rickey Henderson, and your humble Tabroom programmer.  I therefore prefer to spend the day away from indoor trees and too much rib roast. Instead I go off and find someplace quiet with more outdoor trees.  It works for me.

My European Gallivant was lovely for the most part. I found Munich warm, comfortable and welcoming. Venice was fun as always especially for me having company there — I’ve never actually traveled with people in Europe before, and they spurred me into seeing and doing things I’d not usually find on my own, such as a performance of Verdi’s Otello at the iconic La Fenice opera house. I confess I’m not much of an opera person, despite loving classical music generally.   But it was still great to go if only the once.  And then I swung through Amsterdam for some time in coffee shops reading tech docs, rijsttafel, and cloudy skies.

I confess however that travel to Random European Cities has grown both easy for me, but also less interesting and exotic. I found myself walking around places feeling more at home, but less engaged by them as interesting in their own right as a result.  I intend to focus my wanderings to more rural places and probably further afield in the days to come.

Eat One Street

One of the hardest things to do when traveling alone is choosing a place to eat.  If you’re in a small place, it’s not so tough, but in a city of any size, you’ll have hundreds of choices with nothing to thin the list.  A large group can be helpful in winnowing — this person just had Thai yesterday, and that person is a vegetarian so doesn’t want to go for barbecue, and soon you’re left with just 2-3 logical choices.  Alone, and unpicky, you might have 200.

I used to spend — waste — a lot of time on these decisions. I don’t tend to return to places, except for a couple of special ones. So if I’m in a mid-sized European city with dozens of good options, it’s hard to not feel I might be missing something special by choosing the restaurant with 4.4 stars instead of the one with 4.3.  Sometimes I’d walk around for two hours trying to weigh the visual merits of the places around me. I like walking around neighborhoods, but this particular brand of aimlessness just felt stupid when I was already hungry.

So ten months before Covid closed the world, I found myself in Porto, Portugal.  The first night I arrived, I was tired, so I walked three blocks downhill from where I was staying, and found a long street ranging down the hill that had about a dozen restaurants visible from one end.  The one on the corner was praised by the other assholes on Google, so I went in and had a lovely meal in a crowd that was open and chatty like Americans. The waiter was headed to Istanbul for his honeymoon in two weeks; I plied him with recommendations. I stayed too late, and stumbled back.

And after just landing there with little effort and only one consultation to the mass wisdom of the Internets, I decided to make one element of my next six days in Portugal easy.  The street looked full of nice places, with some variety in cuisine and style.  So, I would just eat this street’s offerings, nowhere else.  And I’d take it one step further, and not check the internet anymore.

And so I spent most of a week in Porto, working by the morning, touring the afternoons, and then enjoying dinner somewhere on Rua da Picaria. You can do much worse, and it took me all of ten minutes to find dinner each night.  I had Chinese bao, Portuguese tinned fish, tapas from a menu that spanned the globe, and more.  I never had trouble finding something I wanted to eat, and never had a bad meal.  The rest of Porto spread around me, untouched except for breakfast, and it was just fine.

It can distort things a little. I ate one street in Munich and first believed it a city full of young people; only after day three did I realized I’d picked a street right between two large universities.  And some places it’s just not possible with any sanity.  Try to eat one calle in Venice and you’re likely signing up for six identical meals of often questionable quality; Venice is too touristy, so too many bad restaurants survive there without worry or hope of repeat business.

It also makes one realize just how much culture is built up around eating. In the USA you can, just by looking, understand the general quality of a restaurant, what type of food they serve, and the protocol for how to behave — do they seat you? Do you order at the counter? Most people would have a hard time explaining why they knew the drill. Abroad, all those cues are useless, and you either have to watch other people do it first, or ask and immediately brand yourself the dumb American. But it’s better to be the dumb American who asks politely, than the one who barges in.

And it’s always better to be the dumb American who just picks a damn place to eat than the one who circles around an entire neighborhood three times trying to decide what the absolute best restaurant is.  There’s no such thing.  You’re probably not going to find the restaurant of the 200 in Porto or Munich or Venice that is ideally suited to you.  So just find the one that looks like it’ll make a soup you’ll remember.

 

November Supplement

At 7:16 AM Central, on Saturday November 16th, Tabroom’s database server had this to say:

2024-11-16 13:16:00 0 [ERROR] InnoDB: tried to purge non-delete-marked record in index uk_ballots of table tabroom.ballot: tuple: TUPLE (info_bits=0, 4 fields): {NULL,[4] \ (0x805CEFD5),[4] u (0x807514D1),[4] ZO(0x82B95A4F)}, record: COMPACT RECORD(info_bits=0, 4 fields): {NULL,[4] \ (0x805CEFD5),[4] u (0x807514D1),[4] ZO(0x82B95A4F)}

Poof goes the ballots table.

A ballot in this context is a data record.  One is created for every judge in a section for every entry in that section.  So someone judging a single flight of debate would have two ‘ballots’; a three-judge panel in a room with six speech contestants would have 18 of them.  Each one tracks what side the entry is on, what order they speak in, when that judge hit start, and whether the round is finished. All the points, wins and losses the judges hand out are stored below it; all the information about room assignments, scheduled times, the flip, and event type are above it. So, it’s a rather critical table.  And it’s large: there are 16.1 million such records in Tabroom, making it the second largest.

At 7:16 CST this morning, Tabroom had to delete just one of those records. Maybe a judge needed to be replaced. Maybe a round was being re-paired and all the entries were dumped. Whatever the reason, a ballot was queued for deletion.  That happens thousands of times on a Saturday. But in deleting that particular ballot, the database server software wobbled just a little bit. Perhaps it hit a very obscure bug. Perhaps it wrote the information on a part of the disk that has a small chemical flaw buried in its atoms, and so it failed. Or perhaps a cosmic ray hit the memory and flipped a zero to 1, and changed our world. However it happened, the table’s index was transformed to nonsense.

An index is a data structure used to speed up reading the database. If you ask for all the ballots in Section 2424101, the database server would have to scan all 16.1 million ballots in Tabroom to deliver the 12 you are looking for. That’s very slow on a large table. So for commonly accessed data, you create an index, which is a record in order of all the Section IDs in the Ballots table. The database finds the range you’re looking for quickly, and all 12 ballots IDs are listed there together.

But indexes aren’t free; you can’t just create them for every data element. Each one takes up space, increasing the disk size of the database. They also slow down writes: you have to update the index every time you create new data. So you only create them for data elements that you search by; the Section ID of a ballot yes, but the time of your speech, no.

That little glitch at 7:16 AM deleted the index records for that one doomed ballot, but not the ballot itself.  Suddenly the number of rows in the index did not match the table. Therefore, the database stopped using it — it knew the index was no longer reliable. The slowdowns, lockups and downtime on Saturday morning is what it feels like to use ballots table without indexes: it starts out slow, and goes downhill from there.

First, I tried the gentle fix: a utility that tries to verify the data and rebuild just the indexes, which it does without any invasive changes to the data itself. If it succeeds, the database just starts working afterwards. It takes about 12 minutes to run on that large ballots table; a fact I learned this morning. And then, it failed.  It can fail for a lot of reasons, but mostly it has a very hard time verifying data that is changing as it operates, which is what a live database must do.

So I had to turn to invasive procedures. What you do is cut off the ability of anyone to access the database, so nothing changes in the data in the middle of your surgery. Then you dump a backup copy of the table. Then you run the most scary command I’ve yet typed into a database:

DROP TABLE ballots;

That’s right, that deletes them all. And then I hope beyond hope that your backup data file is accurate and not itself corrupt. In reality, in my paranoia, I took four backups. Two of the primary database, and two of the replica. That took eight minutes, which included me comparing them against each other to make sure they were all identical. If they disagreed as to how many ballots exist, you then have to try to figure out, or then guess, which one was right.  Today I was spared that.

Then I had to make a choice between the Right Way and the Fast Way to reload the data. Loading up the ballots data takes about 15 minutes. Deleting all the ballots takes about 0.15 seconds, and can’t be undone. So if I do a test run, your downtime is longer. If I don’t test it but the file is bad, then I’d have nothing to recover it from. In trying to shorten the downtime by 20 minutes, I would lengthen it by several hours.

So today, caution won. I took one of the backup files, and loaded it into my test machine. Simply copying the file took a few minutes, and then I got to sit there and watch as it re-created ballots in batches of about 8,500. All 2,000 of them. Each batch takes about 0.45 seconds to run on average, thus it was about 15 minutes of time total of just sitting and waiting as line after line of data was reloaded in, like this:

Query OK, 8770 rows affected (0.260 sec)
Records: 8770 Duplicates: 0 Warnings: 0


Query OK, 8594 rows affected (0.272 sec)
Records: 8594 Duplicates: 0 Warnings: 0


Query OK, 8927 rows affected (0.270 sec)
Records: 8927 Duplicates: 0 Warnings: 0

It’s a real fun thing when you are sitting and waiting and can do nothing while you know everyone else is doing the same. But eventually, it worked. And so I braced, dumped the real database’s  ballots, and ran it again.

And phew, it was fine.

The site came back immediately, though naturally was a bit slow at first because then EVERYONE was pairing their first round at once, which is far from typical. But that worked itself out fast.

And then I got to clean up the resulting mess.  I have 31 terminals windows open with full access to the entire database — better not typo in any of those!  I spun up a bunch of servers to get spare capacity going, and found a different, less grievous bug in the process with that — but that thankfully was Hardy’s fault, and so I shoved if off on him.  And then of course, you know how I get email every time that error message screen happens? I got to clear out the 92,822 error reports that were queued up in the email server before any other messages would send.

And then I wrote this post.

After a downtime, you want to take apart the causes and figure out how to make it not happen again that way. The last year’s downtimes were all capacity related; we had too few resources for too many users. It was mostly me figuring out how powerful our new cloud system was, and sometimes wasn’t. We also lacked a system that could quickly bring new resources online when I guessed short. I spent a fair chunk of August building a system to help; now it takes me about 5 minutes to spin up new servers, instead of an hour.  So, neither of our episodes this fall were caused by that.

The one in October was in the category of “my fault, preventable, but super unlucky.” It’s the type of thing where there does exist a level of care that might have prevented it. But practically speaking that level of care would also paralyze me if I adopted it; I would do nothing else if I were that fanatic about validating code and queries. So instead, I created some automated systems to check for slow queries during the week and notify me, to try to find these issues before they explode. That system has already ferreted out a number of annoyingly — but not tragically — slow functions. These things only blow up when there’s hundreds of them running at once, but if they don’t exist at all, then that will never happen instead of rarely happening.

Today’s episode was worse: there’s no way for me to prevent errors deep in the underlying database code. I have neither control nor capacity to address it. I will probably schedule a very early morning downtime in the next week or so — or maybe over the Thanksgiving break — to do a full rebuild of all the database tables, and to deep scan the disk they live on. That’s worth doing anyway; rebuilding the tables gets rid of empty spaces that once held deleted records, and makes the whole thing run a few percent faster.

And I might just move all the data onto a new disk altogether. That’s proactive and reduces some risk, but the truth is I might be chasing chimeras. And that’s life with computing. Technical complexity can cause a lot of grief. Human error causes even more. And sometimes, it’s neither; it’s just the stars decided today is not your day, and you’re going to know it.

And such a day was Saturday the 16th of November. It’s been many years since we’ve had a problem of this particular flavor; may it be many years before we have another.

The Channel Island Challenge

The Channel Islands are one of the least visited national parks in the system, even though they’re only a few hours drive from LA.  They’re protected from the hordes by a moat: the boat ride takes most of two hours.

Edward Abbey’s believed that cars shrink the perceptual size of our parks; we could expand our parks immensely by banning all cars. The Channel Islands are his best proof; they are small in land area, but no paved roads web them. Since North Americans express distance in terms of time, not miles, crossing the few dozen miles of island is thereby transformed from “half an hour’s ride” into “all day.”  The hills rise up all around you, immune and indifferent to the petty amount of noise you bring to them.  You had better fill up at one of the water spigots in the rough campground, because this land will give you nothing more.

August 2015

I went for the first time almost ten years ago.  I went to LA for a trip that was nominally work related, but I also used it to visit friends, and to skip into another national park. I took a day to drive to Ventura, a day to sail out and hike around, and then a day to brave the LAX Airport and return east.

The boat ride turned out to be a bonus I did not plan for — the Channel that you cross to the eponymous islands is a major Pacific migratory route. The August morning dawned spectacularly clear to my New Englander eyes, though it was probably ho-hum to a Southern Californian.  Dozens of whales and hundreds of dolphins played and swam around the boat during their long commute. A fair few people came just for the marine show, and would never set foot on the actual islands.  I can’t say they chose their day wrong, though they missed so much.

I landed on the island and a helpful ranger asked who was here to hike, and who was here to kayak.  Almost everyone else went off to one of the organized kayak tours on the island.  I was the only one left.  “Did I choose wrong?” I asked.  “Is this not a great hiking place?”

“No,” he assured me.  “Usually it’s about half and half.  This is unusual.”

“I got lucky then,” I said, and meant it.  And he then told me about my choices.  I had checked the map that morning, and two trails interested me: one went up the spine of the island to a high point in the center.  The other followed the eastern coastline, skimming the top of the bluffs and offering the ocean below.  Both were dead ends; at some point you had to turn back and rewind your journey. I didn’t have time for both. So I asked the ranger: which should I pick?

He looked me up and down, and decided I was Worthy, and gave me some secret wisdom. “It’s not on the map, but those trails do connect in a loop, here.” He stabbed his finger on the blank nothing the map showed between them.  “If you want to, just follow the coastal route here, and at this point, you’ll see a fork inland. There’s even a sign there. I don’t know why the maps don’t print it.”

“If you’re feeling like you have enough time and energy and are up for a little bit of climbing, take it and it’ll join up with the central trail in the hills, and you’ll come right down here.”

Aha. I had my mission. I launched off along the bluffs, and walked by as the glass green waves crashed below. I drifted my hands along the tops of the tall grass dancing in brown waves. The island is an open clean place, the world around visible for miles, without another soul around to bother anyone. My late Mémère would dub it “the kind of place you can fart as loud as you want”.  You can even see over the channel back to the suburbs, but I tried to avoid looking that way, and pretended I was here on this island in an earlier, unmolested and unlit age. My cell phone had zero signal.  I considered chucking it into the ocean, which might have purified the experience, but polluted the waters, so I declined.

I reached the fork in the trail easily — this trail was very flat after a short climb up to the top of the bluffs. So I ate a quick lunch, and launched up the left fork with gusto. The Ranger had declared me fit and competent, after all, so here I go! I climbed a hill, and then the one behind that one, and then the one behind that. The ocean behind me grew bigger and bigger the higher I got, and the breeze was a little cooler. Another hill, and another. It was the type of landscape where you couldn’t see the final peak; each crest appeared just after you finished climbing the last fold in the earth.

I started to look at my watch. I replayed the boat operator’s warning: “If you’re a day tripper, and you don’t make the 5:30PM departure time, congratulations!You’re now a camper!”

The minute hand was relentless, and I didn’t know how many hills were left.  The next could be the last, or it could be the fifteenth from last.  There was no GPS or indication of where I was exactly that could save me here. AllTrails was still to come. And so, I hit the Point of No Return.  I could turn back and make the boat landing, but not if I went much further; every step forward I took would create the need for another on the return.  So if I went forward, there had better be enough time to cover the unknown miles and hills between me and the end of the loop. Maybe the next hill crest was the last one, and I’d see the boat launch an easy mile or two away.  But the trail could also loop around a lot, and I’d still be looping when my ride departed, and then I’d be looking for a soft patch of grass to spend the night.

I summoned my nominal adulthood, the faint legacy of my experience in Boy Scouts, and my general respect for nature in its many forms.  I decided to turn around, and take the guaranteed path. I was a rule follower as a kid; old habits die hard. Plus, I was nearly out of drinking water, and the sun was hot. Downhill sounded good to me right about then. So I turned, and covered the ground I’d crossed before, and made the boat with 40 minutes to spare.

I almost immediately regretted it. We attack ourselves most harshly for the things that make us most ourselves. “You always wuss out of things like that. You never get the best stories because you’re risk shy.” I could hear the other 11 year olds mocking me for not jumping off the higher diving board back in lost summers. That incomplete loop bugged the hell out of me for years.  I suspected that I turned around at the three quarters point. If I’d just gone forward a bit more, I would have punched over the top and been treated to an easy gradual descent over new terrain. My pedometer, after all, said I’d managed to hike almost 14 miles on a 9 mile trail loop.

That memory caused me to push myself more. I started hiking more seriously, choosing the longer paths and harder loops when I had a choice.  I carried more gear, a bit more water and some filters as a matter of course, extending my range. The extra weight made the exercise more intense. I looked beyond popular hikes and started choosing the kind that have lots of warning signs at the trail head, and want you to sign in and out of a little book, so they know when to send a chopper to come collect your body.  I found valleys and notches and hilltops I don’t think I would have before, if I didn’t have to beat myself up about wussing out on the Channel Islands.

I was grateful for that push.  But I still had unfinished business on the Islands themselves.

March 2023

Work brought me to southern California again in March of 2023, and it was finally time to finish this nonsense. Another stay in Ventura, another boat ticket, boots, and a much bigger water bladder came with me this time.

I would tackle the loop from the other direction.  That would get me up the spine and done with the big climb first. Then I could descend in full vision of the flat bluff-side path for the end. I had solid boots and poles. I had the full route map downloaded on AllTrails. And once the boat released us, I started right away up that hill spine trail, determined to see just how much time it actually took me to do that loop. I would conquer this unfinished challenge, and know the full extend of my decade-old shame while retiring it for good.  I’d celebrate with a snack and an hour reading my book before the return boat home.

That winter was the first a true California rainy season in years. The island was shocking green, not sere and brown. Last year’s tall grasses were matted down, and their green children grew up around the stalks. The trees and bushes exploded with flowers. Clouds drifted back and forth at eye level, caught by the hilltops.  For a good hour, I had no view other than the mist that clouded around me.  My rain jacket came out early, and stayed on.

Rain doesn’t stop an outdoorsy New Englander by definition. So I climbed up a bowl valley, then followed switchbacks up to the central ridge line. My view was compact and hemmed in, thanks to the clouds, but it still felt big.  Even bigger, maybe, since we couldn’t see the whole thing spread out below us.

I wasn’t totally alone this time, but saw a whopping six other hikers along the trail. It’s easy to avoid other hikers if you want to; you just adjust your pace so you leave them behind or let them advance ahead of you, and that maintains your own bubble. I surprised a few foxes, but never snapped a photo of their rapid flight. I walked along some narrow saddles, only 90 minutes into the hike.  I could now taste the easy victory ahead of me.

I didn’t stop for breaks much, apart to snap a very few photos, and kept my pace going. After a while, the trail drifted downwards. I found myself below the cloud line again. I could see the open plain and bluffs and green grasslands again, with the ocean beyond them.  It was rougher and grayer today, but still the land was silent and indifferent to me.  But I had not yet reached the point where I’d turned back last time around.

I hiked another hour, and still did not hit the stacked hills.  I looked at AllTrails, and realized something.  This trail…was really long.  I picked up the pace a little, risking a stumble on slick wet rocks.  I hopped along another saddle that I’d never seen last time around, through some low bushes that were in full spectacular flower.  I emerged again on the north side of the hill, and sighted the bluffs, huffing a little at this point, until I reached the bluffs and the coastline where I know I’d been before.

And I had an hour left to book it back. I took the last three miles at a fast pace, no stops, and marched up to the boat launch with little time to spare.  I carried half the mud on the island embedded in my pants, and plopped down at the last bit of bench available.

And finally, I caught my breath as the truth sunk in.

My theory of cowardice and shame?  My failure to just push forward a little more and make it? That packet of self-hatred I turned into a guidestar of self-improvement to drive myself up hundreds of miles of trails and backwoods over the last decade?  It was total bullshit. I had not been a wuss at all ten years ago.  If I had not turned around, I would have been screwed.  That ranger misjudged me. I should have realized it.  That happens to me a lot. People instinctively think people of Great Height are correspondingly athletic. But I wouldn’t have ended up a 6′ 6″ debate coach if I had any such talent.

I rode the boat trip back to the civilized shores in silence, chewing on a granola bar. In my pre-approved script, I should have been thinking “See! I totally could have kicked that islands ass all along!”  But instead, I was sitting on my own freshly kicked ass.  I got back to port, then to the cheap hotel, where I washed off all that mud and nasty exercise.  I went to drink a bucket of water and mildly overeat, while pondering the revelation.

When you travel with people, you don’t focus on the strangers around.  But if you travel alone, and listen, you can hear an awful lot of ridiculous things. Overheard bullshit in National Parks is often of the finest grade. One lady at Acadia Park complained that the rocky shoreline wasn’t better designed for her stiletto heels. A German tourist in the Canyonlands wondered why many of the mesas were built with no access to the top. A wheezing dad started kidding-but-not-kidding about wanting an escalator at Zion. And one red faced man yelled at a park attendant who stood between his RV and an unstable cliffside road in Kings Canyon.

Most of the real nonsense boils down to the expectation that the park and its nature was created for us to enjoy. In a legal sense, that is true, but the park is not just lines on a map, and the legal fictions that force us to respect that part of the earth more than the rest. Nature itself is not there for our purposes. The cliffs and bison and trees and rains move to their own agenda, and if you try to count on them to follow your schedule, instead of adapting to them, you’ll just be disappointed. Santa Cruz Island was not built, is not crossable in one afternoon, and does not care about how long you have until the boat departs.

So I unlearned the lesson of the Channel Islands, which is the same as learning one. Caution is good; it’s one of my life goals to never meet a search and rescue party from the business end. But in unlearning my disdain for caution a little, I realized there was another one buried beneath it.  Ever since that first August day out in the Islands, I started spending weeks in nature, not just afternoons.  There’s time and space enough, even in this the smallest part.  I sat at the Upheaval Dome for 45 minutes once, marveling about how the desert comes alive after you shut up for five minutes and listen.  I read an entire book laying back on a slab of rock in Banff.  When the path ahead and your ability to follow it outstrips your schedule, the easiest thing to change is the schedule.  So next time I go to the Channel Islands, it’s time to bring a tent.

November 2024

TABROOM

The rewrite continues apace.  I still feel stuck in the cellar, as it were, working on foundational framework issues instead of the ooh-pretty of an actual page.  But building software is often like making a building; the stage where it looks like a giant pit of dirt seems to go on forever, but once you see a support beam sticking in the air, it starts looking like a real building very quickly after that.   Or at least, so I hope.

I had a fun time today upgrading the ol’ laptop to the latest version of the Linux distro I run.  In the process, somehow this version of Chromium combined with my particular Radeon drivers inverted all the colors of all pages and plugins inside the browser.  I mostly use Firefox anyway, but still.

I gather the Reddits have noted that my logo-hover Easter egg is feeling dumpy.  One enterprising user complained that I waste time on these things, and haven’t updated my “90s style website”. Please. Tabroom’s current design is firmly rooted in the early 2010s era web. And this may shock you, but overhauling a site’s design does take a touch more time and effort than throwing up a goofy quote under a logo; and if the latter gives me a moment of happiness amidst a very large todo list, then why begrudge me of it?  More to the point, the outward appearance is not as important a priority as the inward functionality, which has changed an awful lot.

But while Tabroom’s design is not of the 90s, I did a core chunk of my growing up then.  So I have switched to a quote from that era, a core cinematic masterpiece of the transition between the 80s and 90s.

THE HUMAN SIDE

I’ve been coralling and cataloging the vast swathes of photos I’ve taken over the years into something approaching order, and might even print some of them out so I can enjoy them, after hiking hundreds of miles and spending so much time taking them in the first place.  It’s amazing what following through can do.

Since I go away for some of the heavier holidays, I enjoy the lighter ones with family.  This was my third Halloween trick or treating with my nephew.  The first time around he was inert, a 10 month old being hauled around and gawked at.  Last year he was just barely able to say “Ap-eee Allow-een” but not really “Trick or treat!”

This year he still didn’t quite understand the purpose of the ritual — his parents don’t give him much in the way of sweets and sugar, so the purpose of the outing is more the experience.  His mother mostly hopes for Reese’s cups that she can abscond with.  But he’s now nearly three years old, and he has Opinions about what he wants to do, and they did not include the ritual of trick or treat.  He is mostly interested in pressing buttons that make noise. Halloween lawn ornaments looked to him like the type of thing that should do that.  Cue an evening spent chasing him running into people’s lawns to keeping him from bashing their stuff.  But we managed to depart before his first major meltdown and get him to bed almost on time, so it was a good night.

I have sharply reduced my news and social media intake due to Events.  I’ve grown very tired of the competing fear stories, true or not — one’s energy is finite, and there’s a certain gradiosity we do cultivate in our debaters and speechies that Being Informed matters, and that it is essential that we stay on top of these questions of great policy. So right now my phone is a much less consulted device, and my book reader is front and center.  It’s helped me write more, too.

WHERE ARE YOU

This month, I’m headed to Venice for Thanksgiving then a brief sojourn to Amsterdam before returning to Austin for the Longhorn Classic.  Venice is now an old friend, that city that I should probably hate but instead have loved.  It’s a good time to go back to some old favorites, I think, and be at peace in remote shores.

I haven’t planned anything yet for my birthday, but I can promise you it will not be spent here moping.