Thanksgiving ruminations

It is Thanksgiving. It is a strange Thanksgiving — my first without my mom. Not the first I’ve ever not spent with my mom; for many of my adult years we would spend the holiday with my wife’s larger family, until that Thanksgiving 13 years ago that was the first without her mom.

It’s the first Thanksgiving I can’t spend with my mom, because she’s not here anymore. And it’s not something we’ve had the majority of a year to prepare ourselves for. She’s been gone for precisely 56 days. Enough time for it to become a familiar daily fact of life, but not enough for us to know what to do with the information, much less what to do with ourselves on a holiday we are used to spending together.

Thanksgiving has always been a rather strange holiday, the one most singularly centered around food. Particular types of food that, for the most part, we only consume as part of this annual ritual. It’s a strange ritual, too, reinforcing the simplistic, sanitized version of our (white America’s) history. But I suspect that my family is far from unusual in focusing very little on that history, one way or another, and instead turning towards the activities in the kitchen, accompanied by a soundtrack of parades, dog shows and football, emanating from the TV in the next room.

When we shifted to spending almost every Thanksgiving with my family — many years spent at holiday rentals on Lake Superior’s North Shore, just before heavy winter weather sets in and the trip would be more adventure than my parents would be willing to undertake — I became self-appointed head chef, attending to the turkey, the gravy, and a green bean casserole stubbornly made from scratch. It was my way of giving to those I love, but it was also my way of coping, as an introvert who often needs to flee for some alone time, even amongst close family.

Things in the kitchen always seem to culminate in a moment of peak chaos, as the preparation of all dishes is timed to coordinate with the turkey emerging from the oven. Gravy, by necessity, comes last, made from collected pan drippings as the turkey rests in its foil tent, awaiting the big show. But often there’s still a mad flurry of activity around potatoes, stuffing (which never lives up to its name in our House of Perpetual Fear of Food-borne Illness), and assorted vegetable side dishes. Things got even more chaotic when Sara and I became vegetarian — well, pescatarian, but we only eat seafood 0-5 times a month — and I needed to start making our vegetarian mushroom gravy in addition to everything else. (We don’t faff around with vegan loafs or anything like that. We just make sure that all of the sides that call for broth use vegetable broth, and we’re good. We’ll often have a small piece of turkey but honestly, for us Thanksgiving dinner has always been about the sides anyway!)

Sara has dubbed me the saucier for my (semi-)expertise in the realm of gravies and sauces, and it is true I do take great pride in delivering a perfectly smooth, rich and flavorful gravy to the table. I never forget the first time I made Thanksgiving gravy, in 1999, the year we hosted both of our sets of parents — all four of them, still alive and well — at our one-bedroom, garden level apartment in Uptown Minneapolis. I didn’t know what I was doing, and the gravy was a lumpy disaster I tried to salvage by running it through the blender.

Since that time, I truly did get the knack for making gravy. First, you’ve got to know your proportions: n tablespoons of fat, n tablespoons of flour, and n cups of liquid. For Thanksgiving, n = 4. Melt the fat (butter or skimmed from drippings), stir in the flour and mix until completely combined, and then gradually add the liquid (drippings or broth), about 1/4 cup at a time, constantly whisking until everything comes together before adding more. Along the way, “everything together” gradually changes from the consistency of cookie dough, to paste, to thick cream, to smooth liquid. Once all of the liquid is added, you keep it at a low boil and continue to stir constantly until it’s the desired thickness. Oh, and there’s another trick: in addition to adequate seasoning with salt and pepper, and other herbs if desired, around halfway through the final thickening process, also whisk in around a tablespoon of tomato paste, ketchup, or my personal favorite, Heinz chili sauce (which really is just a more “rustic” ketchup). It adds a bit of color, a slight tang, and helps the gravy to thicken up. Just be sure you whisk it in completely. But the key above all else is that bit in bold.

This year we weren’t sure what to do for Thanksgiving. We’re spending it with my dad, of course, but he’s not comfortable driving in the metro area anymore, so we’re going to him. We didn’t want to cause stress for him with a bunch of dirty dishes (even if we do all the clean-up) and many hours of chaos in his apartment kitchen in Rochester, so we decided to cook the whole meal a day ahead. (Although in the end it was only about half of the meal, and we’ll finish the rest in Rochester today.)

Cooking Thanksgiving dinner when you have an entire day wide open, and no need for everything to come together at once, is a transformative experience. Each dish could receive undivided attention. It also was a chance for some personal reflection, on a day when I really needed it. First up was my 100%-stubbornly-made-from-scratch green bean casserole. Next, I took a break to enjoy the unusually warm weather with a run while Sara made the apple pie.

Once I was back in the kitchen, it was time for my mushroom gravy, and I have to say, it is quite possibly the best mushroom gravy I have ever made. It’s amazing how good a gravy can be when you’re able to give it your undivided attention. I gently cooked about 6 oz of thin slices of mushroom — heavily seasoned with Trader Joe’s “Green Goddess” seasoning blend (mostly garlic and onion powders with dried spinach [!] and parsley, and lemon peel) — in a half a stick of butter until they were very soft and just starting to caramelize a bit on the edges, then I added 1/4 cup of dry white wine — a Sauvignon Blanc from New Zealand, my personal favorite — and let that cook off. Next up came 4 tbsp flour with a dash of McCormick “Poultry Seasoning” (which I think is nutmeg, sage, marjoram, thyme, maybe oregano?), followed by the gradual addition of 4 cups of vegetable broth, and of course later a dollop of Heinz chili sauce. It wasn’t anything radically different from what I always make, but sitting there stirring it gently and giving it my undivided attention for 20 or so minutes, really made a difference.

Yes, I said “sitting there.” By this point late in the afternoon, I was sitting on a stool at the stove, because my plantar fasciitis was acting up from a day on my feet. It’s something I’ve been struggling extensively with all year, after a day this past spring, when my anxiety over the return of my mom’s cancer, and our ambivalence over having urged my parents to sell their house — a constant source of stress in recent years — and move into an apartment, filled me with an impulse to organize my stacks of storage bins in our basement, and I spent an entire day standing in sock feet, shuttling bins up and down from the basement to our dining room. My left foot was destroyed after that day. It took months to get back to pain-free running, and I now need to wear heavy-duty Dr. Scholl’s insoles in all of my shoes, including an old pair of running shoes that have now become my indoor “slippers” that I need to have on my feet pretty much any time I’m not lying in bed.

It’s been a strange, difficult year, stacked on top of a string of strange, difficult years. My mom was initially diagnosed with stage 3 lung cancer at the beginning of 2019, and after a couple of months of brutally taxing proton beam treatments at the Mayo Clinic and lingering side effects (the treatments essentially fried her esophagus), she was mostly back to her old self by the end of the year. But then covid hit, and we only saw them in person twice after March 2020, even though they just lived 70 miles away. By the time we were all vaccinated in 2021, regular visits returned, but so did my mom’s cancer. Another brief round of proton beam treatments, plus a completely unrelated skin cancer on her nose, which required a skin graft from her forehead, and all of us learned just how weird and complicated the recovery process for something like that can be. She made it through that too, stronger and more determined than anyone — most of all herself — believed she could be. But 2022 began with more cancer, more treatments, and then eventually, no more treatments.

August and September were particularly difficult. She started to use a walker around the apartment, and after a couple of late-night falls, and her right lung filling with fluid (a symptom of the metastasized cancer), she spent her last 6 weeks in the hospital — most of those in Lake City, an hour away from home, because Mayo seems to need to shuttle off its long-term hospitalized patients to far-flung outposts rather than keeping them in Rochester, followed by 4 — in retrospect, mercifully brief — days in hospice in a mediocre nursing home (chosen because it was available and her insurance-approved hospital time had run out) a couple of miles from their apartment.

Rochester, Minnesota is an interesting place to observe the best and worst of the American medical system. In the Mayo Clinic it has world-class medical technology, and the best experts you will find anywhere. For almost any type of medical treatment you may need, there is scarcely any place in the world where better care is available. And yet, if you are a U.S. citizen trapped in our byzantine insurance and medical billing system, it can be an absolute nightmare. Fortunately for my mom, her working years came at a time when someone in a fairly low-level clerical office job could still make a career, retire after 30 years at a reasonably young age, and live out their days with a guaranteed pension and comprehensive health insurance coverage. Cancer didn’t bankrupt her family. Still, in the end, the best medical treatment in the world was only able to give her a couple of extra years. Eventually a day comes where the treatments end, the breathing ends, and those concerns float away with the wind.

But it’s difficult, as one left behind, to spend more than a few scattered moments reflecting on what was, and what was lost. There are arrangements to be made, bills to be paid, documents to get notarized, phone calls, letters, emails, files to organize, the pointless busy work of a society where every moment we’re drawing breath, and fair bit of time on either side of that, is a business opportunity for someone.

So where am I going with all of these ramblings? Do I have a point? Does any of it? Life is a series of moments, and the meaning is what we find in them for ourselves. Sometimes I just want to take a “time out” and try to set a few of these moments into something more permanent.

And what’s more permanent than a blog post?

Ways the WordPress website shoots itself in the foot

Even though I genuinely love WordPress, and have literally built the last decade of my career around it, there are plenty of things that bother me.

Two things that really bother me: page builder plugins/themes, and mediocre hosting providers.

Why page builder plugins/themes? Because they do not do things “the WordPress way.” Yes, they were originally designed to address woeful limitations in the default WordPress editing interface, but 1) they are typically so loaded up with their own interface conventions that they don’t “feel” like WordPress at all, 2) they’re often so convoluted that they don’t really make WordPress easier to use, they just make it easier for people who don’t know how to code to still get paid to build websites, and 3) they are rapidly being made redundant by the built-in Block Editor (Gutenberg) that has now been part of WordPress core for four years, and is actually starting to get pretty good.

Why mediocre hosting providers? Because they’re mediocre. But seriously, “low-rent” commodity hosting providers are the absolute worst way to host a WordPress website. Their tools and performance are inadequate. If you know sysadmin stuff, you’re better off with a VPN from the likes of Linode. And if you don’t, then you really should spend a bit extra for a premium, WordPress-optimized managed hosting service like WP Engine.

Why then is it, when you go to the WordPress Themes page, the first non-stock theme you are presented with is, of all things, Hello Elementor, built around the dreadful Elementor page builder? Why are they promoting this? I’m not saying page builders shouldn’t exist. I’m just saying people shouldn’t use them. And I definitely do not think that WordPress should be heavily promoting one of them as a preferred way for new users to get a WordPress site up and running! Why still is it the first third-party theme on the page?

I do see Astra, a very well-designed, Block Editor-friendly third-party theme — one I have even used on a client site! — is the second third-party theme featured. But it absolutely deserves to come long before anyone even thinks of Elementor.

As for hosting, this is another place where I think WordPress is making a major stumble, mainly because this is a third-level page in the site hierarchy, but it is very prominently linked from a page for people who are just getting started and looking for a place to host their new (first!) WordPress site. But this page has not been updated in years, and its recommendations desperately need revisions.

I have worked with all three of the “recommended” providers — BlueHost, Dreamhost and SiteGround — only because clients came to me who were already using them. I emphatically do not recommend any of the three, although Dreamhost is… acceptable. But in this modern era when there are some really excellent, WordPress-focused, managed hosting companies like WP Engine, how is it that WordPress is still officially recommending these three dinosaurs of the early 2000s?

Artifacts of an error

A little over a week ago I did something really stupid. Today I took the final step in making amends for that error, which was ultimately the consequence of a questionable decision I made many years ago, to create an ad hoc WordPress multisite setup. That lowercase “m” is significant, and I hinted at it in the post I linked to above.

This was not a proper WordPress Multisite setup. I think that feature probably already existed at the time, although it may not have. This was my own concoction, created by adding a PHP switch to the wp-config.php file, telling it to use a different database and uploads directory depending on the domain name in the HTTP request. It allowed me to manage a number of my own and Sara’s websites with a single WordPress installation, but it was dangerous.

None of the sites “knew” about each other. That wasn’t really a problem, except when it came to managing themes and plugins. I always had to be careful to remember that just because my site wasn’t using a particular theme or plugin, didn’t mean one of Sara’s sites wasn’t… or even one of my own other sites in the setup.

I forgot about that little detail when I did my stupid thing a couple weeks ago. I deleted all of the themes my blog wasn’t using, forgetting that Sara was using many of them. In a panic to quickly restore the themes, I made matters worse by accidentally restoring the entire server from a 6-day-old backup, erasing all of the work Sara and I had done on our respective sites over the preceding week.

My “final step” in making amends was to at least remove my own sites from that setup, so it is now just running Sara’s sites. If you’re reading this, it means you’re seeing my blog in its new home. (Coincidentally, this is also facilitating my gradual transition away from Digital Ocean in favor of Linode for my hosting needs.) I also moved my John Coltrane and Adelia Haight McCormick sites, which were part of the same cockamamie arrangement.

One last thing that I didn’t think I’d be able to recover: I wrote two fairly substantial blog posts in that week, and I was pretty sure those were gone forever. But last night I discovered that the Feedly app on my iPhone still had them cached! I quickly snapped a series of screenshots so they wouldn’t be lost forever.

I had originally intended to retype them here, back dating them to their original post dates, to make it seem like they’d never been lost. But somehow it seems more fitting to just post those phone screenshots instead.

One of the posts hinged on a composite Mac screenshot I had taken from Safari, demonstrating its absurd Experimental Features menu, and that’s an image I still had on my Mac, so I’m including it below as well.

Enjoy.

Also worth noting here… this is my first post on this blog using the Block Editor, a.k.a. Gutenberg. I’ve finally accepted its inevitability. I’ll probably update the site to a new theme in 2023 as well… this one is a custom hack of Twenty Eleven, for cryin’ out loud!

Why are major WordPress plugins not bothering to fix their numerous PHP 8.1 deprecation notices?

I’m an early adopter for a lot of things, but new versions of PHP are generally not one of them. PHP 8.1 wasn’t really on my radar until I set up a new server running Ubuntu Linux 22.04, where PHP 8.1 is the default version.

Yeah, I’m a commercial WordPress plugin developer too, but my business is small. It’s easy to understand me not being 100% on top of this.

What I do not understand is how huge WordPress plugins like Jetpack, WooCommerce and Wordfence can get away with not being on top of it.

The general response these developers are giving when questioned on this is, “they’re only deprecation notices, everything should still be working.” Which is true.

But.

Are you a developer? Do you ever need to turn debugging on? Have you seen what happens when you have multiple plugins active, each of which generates 5-10 PHP deprecation notices on every page when debugging is turned on?

Aside from making the site, and especially the WordPress backend, borderline-to-entirely unusable (which, honestly, is a bigger problem than what I’m about to say), it also makes normal debugging impossible. It’s hard to find real issues when you have to wade through more than a screen’s worth of irrelevant deprecation notices. And the sheer volume of the notices breaks page layouts to a point where it’s impossible even to know what is or isn’t broken.

I actually blame PHP for this. I don’t know what they were thinking with some of these changes that are triggering all of the deprecation notices. I know “real” programming languages aren’t as loosely typed and lenient with sloppy coding as PHP is, but… well, it’s kind of too late to put that genie back in the bottle. I haven’t bothered to investigate exactly what the rationale is for no longer allowing null input to string handling functions. What I do know is that there’s a ton of code out there, written by competent, experienced developers, that is now triggering these warnings, because until now it was always fine to equate null and an empty string.

Anyway, principled arguments aside, I have a more practical frustration to deal with right now… I’m finding it hard to do my work, because other people haven’t done theirs.