Archive: September, 2022

Hurricane Ian was more than expected

posted by Jeff | Friday, September 30, 2022, 5:43 PM | comments: 0

Hurricanes are a fact of life in Florida. The risks are fairly well understood, and for the most part, if you aren't buying coastal property, or property in a flood-prone area, you know what you're getting into. Another dimension to that comes in here in the most central, inland part of the state. The storms can seriously impact Orlando, but most of the time the result is plant debris and maybe some missing roof shingles. Charley is the only notable exception in the last few decades, and I remember flying in after and seeing the blue tarps on all of the roofs. But mostly, this is where people evacuate to, not evacuate from.

The storms have three destructive components, specifically storm surge, wind and rain. Obviously we don't have storm surge here. Wind is usually scary, but not a huge risk for anything built after 2002, when the building code was updated with more wind resistant requirements (ten years after Andrew). The rain, however, has a way of finding its way into your house in ways that are only apparent during a big storm. The wind can literally drive it up through the concrete block, or find problems with the stucco, or the moisture barriers. If it doesn't get in that way, it can flood around you and just start flowing in.

A lot of areas around us were seriously flooded, some of which don't typically see that happen. Everything close to us is, for the most part, carefully engineered because of all the new construction. There's a pond across the street that our house is six feet above, and a lake two blocks from us, as well as much of the surrounding terrain, is 10 feet lower. We're in a reasonably safe spot when it comes to flooding.

But the bigger thing is that we just don't expect storms to be that impactful in this area. There's a reason the theme parks are here and not on the coast. But while Disney reopened this morning, Universal did not because of the high water in their lagoons. That's how unusual this was. Some places got a year's worth of rain in one day. A few of my friends had some minor flooding, but fortunately nothing to the extent of making their homes uninhabitable. Some folks fared far worse, especially in Osceola County.

For us, things started getting real on Wednesday morning. The night before, I finally got the door weather stripping I ordered that day, to replace the one I ordered last Friday that got lost. For at least a year, I've noticed light coming in the crack of our front door because the stripping was deformed and not sealing. So around 1 p.m., I'm on a ladder replacing the stuff with the door open, as the wind is already picking up. Talk about last minute. But the new seal was super tight, and I was proud of myself since it seems like every other home maintenance thing I attempt is harder than it should be. Despite my enthusiasm for rum, there was no drinking. I also turned off the TV after an hour because the local idiots didn't provide anything of value, and the national sources didn't really have anything to show yet from the coast.

We never lost Internet connectivity, and didn't have to test the ability of the often unreliable battery to power the house. When the wind started to get serious in the evening, we did our best to drown it out with home improvement shows on Discovery+. When I tried to go to sleep in our bedroom, it was pointless. The covers for the bathroom vents were banging around, while the rain hitting the window was relentless, on top of the rumble and shaking of the house in general. I drifted in and out on the couch with headphones on, and I woke up every time I reached the end of a playlist. Then it got light enough to see the trees blowing around in the backyard, and I was up again.

At the end of the day, the only thing that we really lost was sleep. We had a little water come in through the bathroom vents, but nothing unmanageable. Our bigger concern was for my in-laws, who live in Punta Gorda, where the storm came ashore. They were a few miles north in Venice, watching a friend's home, but the only improvement in that position was not being in storm surge zone. Their house ended up being fine, but a lot of the area, especially the expensive parts, were under water. By now everyone has seen what's left of Fort Myers Beach, and it's not good. Much of the Sanibel Causeway is gone, cutting off the devastated island, and even a half-mile of the road before the tolls, leading to the hotel where we got married, is gone.

If I learned anything from therapy, it's that it's OK to be empathetic toward loss and suffering, without suffering yourself, and that's where I try to be about it all. (Sidebar: For all the things we can't change or control, we're already selective about it... see the average American concern over the war in Ukraine, famine in Africa or poverty in Afghanistan.) I'll hug my family and again be thankful for the birth lottery that put me where I am. Let's just hope that the disturbance off the coast of Africa doesn't become anything serious.


Lighting designer hobbyist

posted by Jeff | Monday, September 26, 2022, 12:41 AM | comments: 0

I was a nerd for a lot of reasons in high school, but let me roll you back to my introduction of MTV. In the middle of grade nine I moved from inner city Cleveland to the suburbs, where cable TV was a thing. (No really, they didn't have it in Cleveland in 1988.) I spent so much time watching it, since they actually played music videos in those days. But there were two sets of videos that really pulled me in partly for the music, but mostly the live concert lighting. Def Leppard's "Pour Some Sugar On Me" blew my mind, with the lasers and the moving lights. If that weren't enough, Pink Floyd did a series of videos from their Delicate Sound of Thunder live album. This was remarkable because they had all of these automated lights placed around a round screen, and they could do patterns on the screen as well as point them all at various places on the stage. Then they had random moving lights out over the crowd. It was all completely amazing to me. All I knew was that these moving lights were called Vari-Lites, because they had a logo on them. They were kind of boxy looking.

A year or two later, at the Ohio State Fair, I was sitting in a grandstand show to see Mike + The Mechanics play, and I parked my ass right behind the lighting guy. There I saw a console with Vari-Lite's name on it, and during the show I tried to decipher what he was doing, but it was mostly pushing a "go" button over and over.

Teenage me felt like I had found my calling. I was going to be a concert lighting designer. Sure, there were probably like a dozen people doing it at the time, but that seemed like a pretty rewarding thing to do with your life. When I got to college and started minoring in theater, I was surprised at how analog and primitive the lighting in the theater was. This was decades before LED's, and you changed colors by putting gels on the front of the lights. The back wall of the theater was packed with analog dimmers. The lighting board we had didn't even have any kind of memory. It had two rows of faders, and for each cue, you set all of the faders on the non-live row, and then pushed the button to swap them, then did it again. Just before my senior year of college, I did the design for my community theater's show back home, and they at least had a system that stored all of the cues in memory, so I was like the guy at that show, pushing "go" over and over through the show.

At some point I learned that Vari-Lite was the only game in town for moving lights in the late 80's, and you could only rent the equipment, along with an operator and technician. I think I learned this from someone at High-End Systems, which was exhibiting at IAAPA (the amusement industry tradeshow) in 2000. They were a big deal because they were making lights with a mirror that moved, instead of the entire head, which obviously moved a lot faster. And if that weren't enough, they were breaking into architectural lighting, which is why they were at that show. Their equipment was on Cedar Point's Millennium Force roller coaster that year. What was kind of neat is that the non-moving mechanism on their architectural fixtures was the same one in their mirror-based Cyberlights. They were so cool!

But going back to high school, I was designing shows in my head for all kinds of stuff. I remember that Depeche Mode's "Clean" in particular had a very specific show in my head, and I can't tell you how disappointed that I was when the one they toured with frankly was boring. The Best of The Art of Noise had all kinds of shows in my head. When INXS's Live Baby Live album came out, I never saw any associated video, so I made up stuff in my head for that. For a long time, anything I heard came with lights.

As time went on, life got in the way of my lighting interest. And even though I went to fewer shows as I got older, the ones I went to were pretty uninteresting in terms of lighting. But I do remember seeing The Naked and Famous in Orlando in 2014, a small venue show, that had surprisingly interesting lighting, despite not having a lot of fixtures to work with.

In the time since, I noticed that the technology had evolved quite a bit. DJ's were bringing in some impressive stuff not just for the dance floor, but they had these color washes they would put around the room. Architectural lighting was appearing almost by default. And then we got super involved at Dr. Phillips Center, not just for the traveling shows, but the venue itself. To this day, I've only seen some of their toys from afar, and haven't been able to actually play with any of them.

But with all of this ubiquity came the observation that it was a lot cheaper than it used to be. There's a flood of no-name stuff flooding in from China of dubious quality, if you're adventurous. A few US companies like ADJ and Chauvet (the latter is based in Miami) have their stuff manufactured in China, but there's a lot more QA involved. The lights are mostly LED-based now, so no lamps to replace. DMX is still the control protocol, and you can get a USB to DMX interface for $25. The more affordable moving lights still use color wheels, but at some point (in the thousands of dollars each) they start to use color LED's that you can infinitely mix to any color, plus UV. It is absolutely remarkable to see what's out there.

My friend Ken nerds hard with lasers, and he's been doing shows for years. I respect that. But me and my teenage obsession? I last sat behind a console in 1994 for that community theater show. So I started to look at what's out there. There are a lot of interesting moving washes with multiple cells for around a grand, but they don't put out those sharp spots. You also can't really get a fixture with RGBW light sources without forking over a few grand, so you do have to roll with color wheels. Beyond that, there are other compromises to consider, but my criteria eventually landed on a reasonably bright light, 75W or more, at least one prism to flare out the patterns, rotating gobos, and motorized focus. The thing in that range that wouldn't kill me financially for years was the Chauvet DJ Intimidator Spot 260, so I finally bought two.

After having a pair of these for a day, I'm super impressed. I've been learning how to use MA dot2 software along with it, which seems pretty powerful (even if it is discontinued, it's free). I came up with a nice slow movement to use at Halloween with the fog machines going. It's also kind of fun just to turn on sound mode and let them do their thing with tunes playing. They seem like a really solid product.

And yeah, I might see what I can do with two lights and "Clean" playing in the background.


Hurricane probability is fairly high this time

posted by Jeff | Saturday, September 24, 2022, 12:30 AM | comments: 0

Funny how a week or two ago there were these stories all over the news about how the hurricane season was so quiet despite expectations for the opposite. There was literally nothing tracking. Now there are five systems in the Atlantic basin. The only one of any concern was named Ian this evening. At the moment, it doesn't look like there's any question about whether or not it will impact Florida, it's more of a where and how much. The center of the cone drags across the southern gulf coast then visits us. The European agency, however, thinks it will turn more to the right and pass over the everglades. That would be ideal, because it would make it merely inconvenient for us. If it goes a little to the left, it puts us in the path of the front-right part of the storm, which is the worst part. Hurricanes are huge, so I expect we'll see something regardless.

Irma in 2017 is our only significant experience with tropical storms. We've had some remnants drop a lot of rain, but Irma was definitely the most serious. When I say serious, I mean it wasn't that big of a deal beyond a sleepless night, because new construction is pretty solid post-Andrew. What I learned about forecasting was that The Weather Channel was fucking terrible and local TV wasn't much better. The most useful information came from the National Hurricane Center, especially the text of the every-six-hour forecast discussion, and the wind speed probability numbers. The latter changes constantly, but it's the most honest assessment about what you're likely to see. Like right now, five days out, we're 50/50 for 39 mph wind, but only 20% for 58 mph. A day from now those will likely go up, It will either peak in that time and decline, or go to 100% for one of the three wind levels in the 12 hour column.

At the moment, Ian looks just like Irma if the consensus of all the models is right, but there's still so much variability that we don't really know. The Western Caribbean water is so freaking warm right now, so the longer it takes to turn north toward Cuba, the worse it will be.

I'd be lying if I said I wasn't excited by a little sustained high wind, provided people don't get hurt and property isn't damaged. It gives me a lot of perspective about where we rank in the universe. This house did fine in Irma, even though it had no flooring or garage doors yet. No leaks anywhere, and the drywall was, uh, dry. My only concern now is finding out just how well the solar panels are installed, not just because of how they're secured, but they're our backup (with the battery) if the power goes out. They're also not insured because Progressive won't write a policy on them. Not very many carriers will, apparently.

It could fizzle out, but that they increased it to a category 3 at landfall tonight makes that unlikely. Nothing we can do but roll with it?


One year as a performing arts donor

posted by Jeff | Thursday, September 22, 2022, 11:52 PM | comments: 0

We had our first annual donor appreciation event at the Dr. Phillips Center for the Performing Arts tonight. We actually jumped in about a year ago, which was kind of cool timing because it was waking up after Covid, and the new Steinmetz Hall had its grand opening early this year. It was neat to have a front seat to all of that.

While the event tonight was intended to celebrate the wider donor, partner and sponsor community, it was really dedicated to Jim Pugh, who spent about two decades trying to get the place built, serving as its chair long before there was ever a building. Pugh is a Central Florida native, born in Winter Haven, and he built an enormous real estate development business that seems to have left him very well off. But he used that entrepreneurial expertise to get not just a "good enough" arts center built, but arguably one of the best in the world. As Orlando has grown, and isn't slowing down, it was clear to him that they should build something that would be great and last for generations. Indeed, the three theaters are among the best of their class, and complimented by the school of the arts, event spaces and a new cabaret style venue that will open soon.

While the Walt Disney Theater is home to the touring Broadway shows and the spot we spend the most time, stunningly beautiful and well designed itself, it was the opening of Steinmetz Hall this year in the second phase that made you realize how ambitious the project really was. While they realized that they wouldn't be able to build the whole thing at once, figuring out how to get all of the big mechanical systems in the first phase, Steinmetz was going to be the place where any orchestra could feel at home. And it's still versatile enough to do everything from ballet to more typical amplified entertainment to banquets because of the floor that rotates in sections into whatever configuration they need, while the back slides on railroad tracks to open traditional fly space. It's just awesome. Hearing Carmina Burana performed there was borderline life changing.

So why donate to this cause? Everyone has different reasons to engage in philanthropy, whether it's giving money, stuff or time. My initial engagement started largely by accident, when the office I sometimes went to for work across the street (we were primarily remote) was invited to tour the incomplete first phase. I've always been a theater nerd to some degree, minoring in it for a year, lighting shows for my community theater in my home town, and seeing shows now and then. But this was something different, because it was remarkable how few compromises it appeared to have. Every venue I got to spend time in was, at best, suboptimal, like the theater at Ashland University, allegedly built as it is because it looked cool from the air. But this... in my limited knowledge seemed perfect. (I know now there are definitely some quirks.) And then seeing the schedule, I knew I wanted to see as much stuff as possible. Diana soon inquired about volunteering, and when they learned she had actual experience working in theaters, back and front of house, she was recruited and eventually promoted to a part-time house manager. So in some ways, DPC has been in our life for almost as long as we've lived here.

But for me at least, there was also a certain grounding that I felt came with this cause, being a part of the community where we live. Most non-profits I've ever donated to needed money for sustainment, or research, or special projects. This one needed capital to finish the building, and will always need money to fund outreach programs and endowments. You look at this $600 million building, and it's tempting to view it as a place for well-off people to buy Hamilton tickets. But then a bunch of kids get to see Hamilton for free, entire schools get to see orchestra performances, scholarships are given for the arts school, and the "arts for every life" thing becomes more than a tagline. There is something going on in that building at least five nights a week, most of the year.

Admittedly, I find the social interactions with donors a little uncomfortable, because I have little in common with most of those that I've met (relative to age and income), but I always enjoy talking with the staff, especially the production people (because I can nerd hard on the theater tech). It also gets me a little closer with the cool place that Diana works. Our donation only accounted for 0.0016% of the place getting built, so maybe 2 automated stage lights, or a short row of seats, or maybe the carpet in one of the back hallways. But promoting the arts is important when people connect so deeply with human performance. It often takes a backseat to professional sports. But if I have to choose between people crying watching Come From Away or because their local basketball franchise sucks, I think you know which one I would choose. I don't think I'll ever be a Jim Pugh, but I'm happy to contribute in whatever small way I can. A little pride in your community is a solid thing to put some energy into.


Finishing projects with ADHD

posted by Jeff | Monday, September 19, 2022, 9:08 PM | comments: 0

As part of the reframing of my life following the ASD and ADHD diagnoses last year, I have gradually decided to give myself a little grace when I look at the difficulty I had in school and in college. I often attributed my grades to slacker tendencies (thank you, Gen-X stereotype), but now I better understand that it wasn't a defective personality that hindered my ability to follow through and do the work.

The math was never simple, because why could I blow the curve in my broadcast law class, much to the dismay of my classmates, but "D" my way through a psychology class I only went to three or four times? I now understand that to be hyperfocus, a kind of hidden super power of ADHD and ASD, where one can engage deeply in something and barely notice the world moving around them. That seems counterintuitive, especially in the context of ADHD, which makes it difficult to focus on anything, and I don't entirely understand it myself. I found myself trying to explain it to a neurotypical colleague recently, and the words don't come easy. In some ways, it's easier to describe what it isn't, like obsession, addiction, or other negative things that are ongoing. Hyperfocus is very much an in-the-zone thing that leads to a specific outcome. It has an ending.

There seems to be a tipping point or trigger that leads to hyperfocus, which makes me wonder if it's something that you can summon. My work on my open source forum this year is definitely something that I've engaged in with these productive bouts. It wasn't always that way though, because writing code started as a means to an end, to get something on the screen on the Internets. I've never been able to retain basic electronics knowledge either, because as a kid I would play with one of those kits by building circuits with no interest in how they worked, I just wanted the light to blink. I could apply this to a hundred other things, like trying to learn the guitar or basic woodworking.

During the last holiday weekend, I had three projects that I wanted to complete. The first was to finish the coding problem I was trying to solve. The second was shoot a little B-roll of the newest Lego set so I could post it on our YouTube channel. Finally, I wanted to install some plugs inside of a cabinet drawer in the kitchen for charging (there was already power there). I barely got the coding problem done, but didn't get anywhere with the other two. Even now, the power project is only about half done, while the camera is sitting next to the Lego.

This pattern is so predictable. Like my education days, I'm still learning to accept the situation not as a personality problem, but more a factual observation about how I'm wired. I still come back to that curiosity on how I might apply hyperfocus intentionally to constructive things that I'm less interested in doing. It would also be ideal to apply it to things that I am interested in, like unfinished projects.


An annual vaccination?

posted by Jeff | Saturday, September 17, 2022, 11:37 PM | comments: 0

I got the new bivalent Covid vaccine yesterday morning. While the efficacy data is still not very thorough, the safety wasn't a concern, so I figured after 11 months since my last booster it certainly couldn't hurt. Somehow I've managed to not have Covid after two and a half years, or if I did, I was totally asymptomatic. While I was only marginally concerned that I might be at risk for some adjacent thing, like the hypothyroidism (which a study did determine was serious last year relative to Covid outcomes), I think I've always been more concerned about the persistent long-term problems. More than anything though, I'm just happy to be a good neighbor and reduce the chance of being a transmission vector.

I stuck with the Moderna version, and here in the US, the bivalent flavors are targeting the original along with the BA.5 omicron variant. Like the three previous times I had the shot, including the original series and booster, I did get a fever about 12 hours in, which lasted about 6 hours. I suppose it wasn't that big of a deal, except that I felt kind of beat up by the lack of sleep. The funny thing is that I had the same side effect with the flu vaccine the last time I had it, which is probably 15 years ago. Apparently when I get a vaccine, I know it's working. Fortunately this one didn't kick my ass until after work.

The question now is whether or not this will be an annual thing. All eyes are on this winter. There's a range of things that could happen. On one end of the spectrum, the virus could burn itself out as a combination of natural immunity and vaccination takes hold, although a lot of experts thought that statistically might happen in the omicron wave. It didn't because at the other end, the thing could mutate yet again and evade immunity. Fortunately outcomes can still be better provided that immunization happens on a significant scale.

And that's the rub this time. People aren't lining up for shots the way they did the first time around. A fairly low percentage of people got the original booster, which is why the wave early this year was so big. The initial response to the new bivalent booster has been really weak. It's hard to believe that more than 400 people in the US are still dying from this everyday, for no obvious reason other than not getting vaccinated.

I still strongly believe, and the science and statistics support this, that Covid vaccinations are easily one of the greatest human achievements in my lifetime. I wish more people would appreciate that for what it is, which is pretty much a medical miracle. I will never understand why it has ever been political, other than an urge to lean toward willful stupidity.


Forum performance observations

posted by Jeff | Thursday, September 15, 2022, 11:48 PM | comments: 0

I've been letting the new forum version simmer on CoasterBuzz for a bit now prior to releasing it to the hosted version (which powers PointBuzz). Now that it's in both places, I did have to do a big fix on how notifications worked, specifically to queue the "new reply" notifications since there can be many for any given topic. I got that fix in, and now I'm watching it. There are some interesting things that I'm seeing.

Before that, and update on the outage that I had. I was able to open up a support ticket, and the guy handling the case was able to reproduce the problem that I had, where one of the domain names becomes unbound to the SSL certificate, so the gateway throws 502's. That's reassuring, because again it means that the outage wasn't self-inflicted. He's had to get the product team involved, because it sounds like there may be a bug in the infrastructure. Neat!

The first thing that I noticed was that I very suddenly started seeing waves of errors, maybe a hundred at a time, of SQL timeouts caused by running out of connections from the connection pool. That seemed weird until I realized that the errors were in fact being logged in the database, but also that these waves came inside the scope of about two seconds. I did have a logging bug that would cause the whole app to crash if it got into a loop trying to record the database failure in the failing database (duh), but after I fixed that, I was still seeing the waves. I quickly realized that most of the failures were from some kind of search bot from China, hitting a hundred URL's all inside a half-second. That's definitely naughty behavior, but it should be able to handle it. So the first thing I did was block the entire subnet from China, and I could see hundreds of requests being blocked.

But still, the connection pools should be big enough to handle all of that. What I learned was that the database did not even break a sweat, so the problem wasn't there. Instead, it looks like the SQL client library manages 100 connections in the pool by default. It stands to reason that if you hit it with a hundred requests at a time, at least some of them will fail. I changed the pool to 200 maximum connections, and so far so good. It's hard to spot in the wild when there's a problem, because I can usually see there are only 5 to 10 connections at a time. It would help if I had it running across two ore more nodes, but the rest of my apps can't run that way because of mostly local caching. I have to revisit those.

The hosted thing does run across two nodes, and it's not recording any errors at all. I'm really surprised at how well it's getting on. It has been for about two years, but with the new version doing all of this real-time websockets stuff, I wasn't sure what to expect. I still get periodic Redis cache failures, but I did refactor the code a little to give up sooner if it can't reach the cache, and that's working so well for what amounts to transient failures.

Meanwhile, I updated the documentation quite a bit, and the sample project is also using the newer bits on one branch. My biggest task now is to monitor and test some from-scratch installations to see if everything is generally working.

I'd really like to have a few paying customers for this thing, and I have some shower ideas that I need to try out.


How did everything get so... serious?

posted by Jeff | Thursday, September 15, 2022, 11:21 PM | comments: 0

I'm not exactly sure why, but I've had two straight nights of really good sleep. I also can't explain why sleep has become so challenging in the last few years. I think it's mostly my inability to give my brain a rest. Naturally that causes me to wonder why I can't turn my brain off. But in the clarity and sharpness that follows great sleep, I woke up, got in the shower, where I think a lot, and wonder how everything got to be so serious.

It's really everything. It's work, parenting, money, health, trying to set up a better future, human rights and democracy, the environment... it all feels heavy and urgent and serious. It doesn't feel that way everyday, but it feels that way more often than not. I was so excited about the way that bupropion changed my quality of life, but now I feel like there's this constant anxiety following me around. It feels awesome to be not depressed, but I could really go for more fun and less gravity.

Truthfully, I understand and can describe what causes some of this, but while I'm an open book about wider issues and human challenges, I can't put everything on the Internet. One contributing factor though is that I think keeping busy with things that I'm deeply interested in and enjoy helps me stay out of my head. This is that time of year though that I always get stuck, when there aren't really vacations and we're two months after the last and two months before the next holiday. I also think that another symptom of midlife is that we really start to forget how to see the world in the most flexible terms, to see endless possibilities. I like to think that I'm still curious and my imagination is dynamic, but it's hard to be objective about that sort of thing.

There's definitely a part of me that wonders if life was ever less serious. I can't remember a time that I was ever really care-free beyond little spurts of time, and mostly on vacations. It feels like there has always been something important to be accountable to, or an outcome to achieve, or a need to fit and belong. I can't even define what it looks like to be truly free of all that. Is it to have a pile of money in the bank? Guaranteed healthcare? A grown and independent child? Distance from relationships that don't serve you?

The good news is that those care-free moments do exist, and I know what they look like. The challenging part is figuring out how to make them out of smaller things. Like hearing a song that sparks joy or watching a sunset. I also have to remember that the weighty things probably aren't as serious as I make them out to be. Perspective is hard.


Time passage perception

posted by Jeff | Wednesday, September 14, 2022, 11:18 PM | comments: 0

It is widely believed in the scientific community that time seems to move faster as you get older because your brain perceives familiar things differently from new things. As you get older, naturally you experience fewer new things. What surprises me most about this is how the time travel varies in waves.

That might be why that first year of the pandemic, pre-vaccine, seemed to go pretty fast. The routine was so repetitive, work during the day from home, kid is already home, weekend comes and you have your drinks and find some movies to watch, and if you stuck with it, your evening walks. There was not a lot of travel or events to break things up. But once the vaccinations started rolling and we better understood the risks, time slowed down quite a bit. Our little family returned to the theater, to concerts, theme parks, cruises, and regular meals out. These activities break up the daily routine because they include things you haven't seen before.

This year has been mostly like that. We started the year doing all of these events with the new theater opening, and none of the tours were repeats that we had already seen. I've been to three concerts this year, one of which was in Cleveland and arguably one of the best I've ever been to. I've been to the major theme parks here, obviously, but also made it back to Cedar Point for a few days. We did a cruise on a completely new cruise ship for the maiden voyage, which is something I will always treasure. Our friends from Norway stayed with us for a few days.

But since that cruise, two months ago, the routine has set in and time seems to be flying by. We're between theater seasons, we don't have any travel booked in the near future because of school, and we haven't been going to the parks, not even for the Food & Wine Festival, as much as we typically have, I guess mostly because of the daily rain and humidity. I find this very troubling and unsettling, like I'm not making the most of life.

It's the third quarter quiet, and I get into this lull every year. I don't take any real time off and we don't do stuff as much. Part of it is definitely school, because it's never easy, and it's really not easy at the start of the year. We can't really take him out to travel. As we get to late September, I know I need to break up the monotony, but I'm never sure how to do that in a way that's also inclusive of my little family. Actually, I take that back. One year we did a staycation at Coronado Springs, taking Simon to school while we did daytime stuff at the pool, the bar and the parks. Probably wasn't his favorite thing, but it sure provided a solid break for us.

The holidays aren't far away, and we'll get a little travel in then. But I need to figure out how to slow down time in the September to October range.


Accountability to my health

posted by Jeff | Tuesday, September 13, 2022, 1:46 PM | comments: 0

I'm feeling kind of bad about myself today. I had my follow-up with my doctor after labs last week, and to no surprise, my triglycerides are still high. They're incredibly erratic, which is something that I don't understand, but they were just on the edge of good in July, and that was after a cruise full of alcohol and delicious carbs. More than anything though, I know that my biggest problem is that I just don't move around enough. My second biggest problem is I love potatoes and rice and pasta, and eat too much of all of it.

The results aren't surprising, but they certainly come with additional self-loathing when your doctor is obviously frustrated because she can't medicate my way out of this. And I'm so tired of people on the Internets who continue to make this sort of thing just a problem solved by will, and if you don't have that, you're a shitty person. (And by the way, fuck those people, especially if they're selling some "fitness" shit and believe they're some kind of advocates for whatever.) If I strip it all down though, the suboptimal feelings are rooted in the fact that it's something that I can't fake or buy my way out of, and while I fundamentally understand the solution, I resist it because I don't want to be held accountable for yet another thing when I feel like I'm being crushed by a mix of obligation and shortness of time. That's some serious midlife shit, right?

I've been looking for little victories lately. I mean, my last blog post was about getting my air conditioner drain unclogged. That's digging pretty deep for validation. Bigger things that take a long time don't come as easy to me, maybe because of ADHD, but at least it explains why I've never been able to make a movie or start a legitimate business. Can I go into that doctor's office in 12 weeks and show her that I did the work?

On the food side, I eat a lot of convenience food, which is to say burritos and noodle/rice bowls when I'm out, or that salty-ass stuff from Schwan's at home because it's easy enough to toss something into the oven. I'm not really a big drinker, mostly indulging my rum enthusiasm on Friday nights, and rarely during the week (though all bets are off on vacation). There seems to be consensus though that any alcohol is a huge driver of high triglycerides. I'm a picky eater, which is another thing I can chalk up to my recent-ish ASD diagnosis, but it gets me into trouble. The last time I worked my way out of that, in divorce days, was to adopt a lot of faux-chicken products that were low in salt. What's strange is what I already don't eat. I haven't had red meat in 18 years. I already gave up soda at home at the start of the pandemic, which I really thought would have enormous consequences on my tri's. I still have one out maybe once a week, but I'm not sucking down 16 ounces a day. I generally don't eat fried food more than once a week. I'm not regularly eating baked goods or candy. The only lever I have left there is to back off on the tater tots and Asian fusion.

The exercise is more obvious. I don't. It's particularly bad this time of year though, because honestly July to mid-September, I don't want to be outside. It's humid as hell in the morning and raining in the evening, which makes it worse. Fortunately we're at the tail end of that, but getting out of bed to move is a struggle. I'm not sure why it was so easy for me when I moved here. I have a stand-up desk, but raise it at best once a week. I just loathe exercise for the sake of exercise. I've never been able to do it.

So I'm going to sulk over here in the corner and cry into my burrito. Then I'll probably try to change my behavior.


I finally defeated my air conditioner

posted by Jeff | Sunday, September 11, 2022, 6:17 PM | comments: 0

For a few months now, I've been battling the upstairs air conditioner. It started because the dipshit landscapers buried my condensation drains in mulch. Not long after that, I finally bought a shop vac, because I wanted to suck all of the crap out of those two drains. The downstairs unit drained instantly, and I had a nice tank of minor sludge. But the upstairs unit I got nothing. The drain was still backing up and causing the float switch to shut off the unit. I could pop off the cap on the pipe and see the water there. As the air has been considerably humid, it was topping off a lot. I've tried a number of times to vac out the thing, but nothing came loose.

Mostly it has been happening at night, when the temperature was cool enough, but still not ideal. Today it was cutting off in the middle of the day, and I was frustrated. I went to Lowe's, and naively bought a snake thinking I could get it around the right-angle pipe, which of course I could not. When I added water on the assumption that it was dry, it didn't allow much, so I assumed the blockage was closer to the unit than it was outside. I was mentally preparing to cut the pipe as it angled into the floor, but decided I'd try a little drain cleaner. I had been resisting that, because the pipe was experiencing negative pressure, pulling suction through the pipe into the blower when it was on. I don't need that toxic shit's fumes blowing around the house. But I was at my wit's end. I decided at worst I could just leave the cap off and let it pull air from inside the house instead of from the pipe.

I poured at least 20 ounces into the thing, and it backed up. I tried to pull vacuum from the outside, still nothing. Indoor humidity was 62%, so I could see the downstairs drain evacuating a steady stream, not a drip. The upstairs should have been doing the same. Frustrated, I gave up for the day because the US Open final was on.

Not long before dinner, I noticed both blowers were running, because audibly it sounds different. I went up to look, and there was no backup at all. Weird. I wasn't optimistic, but I went outside to find a pile of sludge at the drain that looked like wet sawdust and smelled like vomit. The block was broken! I asked Diana to pour water through, and I could see it flowing outside, with chunks. I hooked up the vacuum and it stuttered and shook as more "material" came out.

I win. Suck it, air conditioner.


The bizarre symbolism of the queen and the monarchy

posted by Jeff | Friday, September 9, 2022, 9:21 PM | comments: 0

The death of Queen Elizabeth is no doubt a difficult time for her family, and probably a great many Britons, most of whom don't know citizenship without the queen. But in observing the responses to her death, there's a very wide spectrum of opinions and feelings about the queen specifically and the monarchy in general.

The individual woman was clearly loved by a great many, if only because she was such a symbol of stability. To reign for 70 years, she appeared as a figurehead after the second world war, through the entirety of the cold war, the dissolution of the Soviet Union, the constant Middle East conflict, terrorist attacks throughout the world and including England, the impact of civil rights and pacifism movements as they spread in the 60's and 70's, and perhaps most importantly, the decline and end of British colonialism. Through it all, there was only one queen.

While she inherited her position, she was also symbolic in terms of female empowerment. At the time of her coronation, women were second-class citizens in most of the world, and it's only better today in some parts of the world. You have to wonder if having a queen had anything to do with the fact that they had three female prime ministers in her time. There are a lot of gender stereotypes at play, but certainly a queen was something for girls to look up to. And from most accounts, she was kind and had a sense of humor, all the while taking the formality of the position seriously.

Regardless of the character of the woman, the monarchy itself is certainly problematic. The monarchy is very much tied to the long history of British colonialism. If the United States' original sin is racism, England is haunted by racism and colonialism throughout the empire that reached every corner of the globe. The empire was cruel and oppressive, and led to historic nightmares as it receded. The British withdrawal from India is among the worst examples of this.

You also have the weirdness that the royal family is born into insane privilege. They didn't earn their place, they just got lucky. The aristocracy, while not as powerful as they were, retained their position in part by being cozy with the royals. There are castles and celebrations and crowns that are all the domain of the monarchy. And worse yet, as England has become more and more diverse, in part because of its history of colonialism, every royal will be white for our lifetime.

Why is the monarchy accountable to the problems of colonialism and inherited wealth? Mostly because the transition to a representative democracy was insanely slow, and ironically, women in parts of the United Kingdom still weren't able to vote until early in the queen's reign. Worse yet, the tax payers are still paying for the lifestyle of the royal family, which is likely absurd to younger people in particular. When the economy is suboptimal, or we're working through a global pandemic, it's not a good look.

I get the affection for the queen, but I also get the disdain for the monarchy.


Serious forum bug, and downtime that isn't my fault

posted by Jeff | Friday, September 9, 2022, 12:01 AM | comments: 0

Last night I finally finished integrating the latest forum code to the forum product, and at first, it seemed like it was all good. It had been running fine on CoasterBuzz, which is different because that's a single tenant. The hosted product is intended to run a bunch of forums at the same time, so the try-out forum and the PointBuzz Forums are literally the same site, just skinned differently with different data because of the domain name. I worked very hard a few years ago to light up this scenario, where I could mostly just drop in the existing forums to a project with extra plumbing to facilitate the multitenancy, and that's been working ever since. Until it didn't.

One of the biggest changes in the new version is notifications, and using them in place of email subscriptions. It used to be that you could subscribe to a topic, and when it was updated, you would get an email saying as much. Of course, no one has used that in years, because email. I replaced that with in-app notifications, and they were working pretty well. But in the old days, I wasn't going to make the user wait until everyone who subscribed was emailed, so I spawned a new thread to do that. I knew this was a terrible idea years ago when I wrote it, because I couldn't unit test it right, and I even had the compiler stop bothering me about it.

#pragma warning disable 1998
	public async Task NotifySubscribers(Topic topic, User postingUser, string topicLink, Func<User, Topic, string> unsubscribeLinkGenerator)
	{
		new Thread(async () => {
			var users = await _subscribedTopicsRepository.GetSubscribedUsersThatHaveViewed(topic.TopicID);
			foreach (var user in users)
			{
				if (user.UserID != postingUser.UserID)
				{
					var unsubScribeLink = unsubscribeLinkGenerator(user, topic);
					await _subscribedTopicEmailComposer.ComposeAndQueue(topic, user, topicLink, unsubScribeLink);
				}
			}
			await _subscribedTopicsRepository.MarkSubscribedTopicUnviewed(topic.TopicID);
		}).Start();
	}
#pragma warning restore 1998

I mean, there were all of the signs this was a bad idea. I had to add the warning overrides when I made all of the other stuff inside run asynchronously, and even before that, I couldn't run unit tests. This mostly worked fine, because the thread it spawned seemed to always do its job and not die or get garbage collected before it was done. But after I changed that code so it did notifications instead of email, and then put it in a multitenant app, that spawned thread had no idea what tenant it was working with, so it got crushed hard. The worst thing is that I spent a lot of time building a test environment, and it's all automated and deploys every time I change code. But I didn't do some basic testing around the new features in that environment.

As you might suspect, I spent some time this evening writing code to just queue the topic's ID number and the tenant, and let a processor read off the queue and do the notifications. It should have always been that, but I was lazy.

So that was the first problem to solve, because the mass of exceptions every time a new post was made and all those people had to be notified, it brought the app now. It recovered pretty quick, but not ideal. At the same time, by sheer coincidence, most of the audience started getting gateway errors. I thought maybe I had not fixed the problem, and for three hours I tried to diagnose what was going on. When I started looking at the log streams, I noticed that someone could still reach it, because there was traffic. Then I tried other tenants, like the try-out site, and it was working fine. So why the heck wasn't the gateway taking in users for the PointBuzz forum?

On a hunch, I removed the domain name from the app, then added it back in. Within a minute or two, people could reach the site again. There aren't any obvious reasons for this, and I'm pretty sure it's not my fault. I opened a support ticket for it, but we'll see if I get any traction or explanation.

I knew things were going too well, but the problem I made wasn't that hard to find once I tested it locally.


That morning travel excitement feeling

posted by Jeff | Wednesday, September 7, 2022, 11:11 PM | comments: 0

I've described myself as a morning person who hates getting up in the morning. I tend to get my best sleep in the morning because I stay up late or until my brain gives me a break. But once I can shake off the sleepiness, I kind of like being up and about, even before the sun rises. But for the most part, that's not a normal part of the routine. In fact, it seems like that scenario comes up the most when I'm traveling somewhere. That's an exciting feeling.

I remember it at weird times, too. The other day I had a doctor appointment early, and since I was out, I stopped to get a breakfast hockey puck from McDonald's, a kind of gross but oddly pleasurable thing to do when there isn't time to eat at home. I just parked under a tree and enjoyed the greasy thing. For a few moments, it felt like a break in the routine, and it reminded me of setting up to road trip or go to the airport. Isn't it weird how something so unimportant could instill those kinds of feelings?

Life seems so routine lately. It's not a grind, but the work week typically goes by pretty fast, because there's plenty to do. I try to get out for lunch at least once or twice during the week. Before you know it, it's another weekend, and another month has passed. But that little feeling of excitement, I want to have more of that. I don't think it needs to be from travel, it just has to be variation from the routine.


Accountability, it's all the rage!

posted by Jeff | Saturday, September 3, 2022, 4:24 PM | comments: 0

Simon is struggling a little in school, because the school is actually holding him accountable for learning stuff. I wrote earlier this year about how the other school didn't really do that, and was grading more on the ability to show up than to learn. It was disappointing. The hardest part about this for him is that he hasn't had to work with a balance between accountability and accommodation, and so he's easily overwhelmed over things that he's not that interested in doing (read, "homework"). But here we are, and there have been consequences for the choices that he has made. I understand that he's frustrated, but there's a difference between "can't" and "won't," and he has to reconcile that. He has to be held accountable.

I think most functional adults understand this, but for some reason in politics, we're suddenly seeing, from the party that touts "law and order," backlash to being held accountable. Trump's desire to hold on to government documents is only the tip of the iceberg. You can't be victimized when you did something wrong and there are mountains of evidence that you did it. His whole "movement" seems to be about that. He can make things up and cry foul over imaginary wrongdoing, with no evidence, but that gets to be even more sad when you can actually prove something.

It's not just him. Fox News and others are being sued for defamation by companies in libel suits over the voting fraud allegations that certainly were proven false. Politicians and lawyers who played along with the big lie are being asked to testify in front of grand juries. Some members of the circus are even losing elections (the biggest relief of all). Seditionists are going to jail and entering guilty pleas.

This is important to the survival of democracy. It's one thing to differ on policy, but it's quite another to attempt to cling to power using lies and deception. That's not serving the electorate, obviously. Holding people accountable under the law is even more important if we're ever to reach a point where we can truly demonstrate that there are not two systems of justice in our country. For old, rich, white men to claim that they're being victimized for breaking the law, while young people of color get busted for having a dime bag of weed, is wholly absurd. That's not me making a subjective observation, either. You can illustrate the absurdity with data.

If my 12-year-old can learn about accountability, it's the least we can expect from grown-ass men.


My love for Indian food

posted by Jeff | Saturday, September 3, 2022, 12:40 AM | comments: 0

I've always been a picky eater, which I now understand might have been at least partly the autism, but it doesn't mean that I haven't made progress toward dietary changes. I stopped eating red meat around 2005 because my cholesterol was super high and I was a fast food burger addict. Around the same time, I started to try some soy/vegetable chicken substitutes, and to this day I'm OK with those sometimes. As Chipotle became more popular, I realized that a burrito without beans was pretty good. Eventually I fell in love with Indian food, but it was a long haul getting there.

My sophomore year of college, I was a resident assistant, and one of my fellow RA's in the building was Ajay, a guy from New Delhi. I don't remember exactly how he landed at Ashland University in Ohio, but I found him fascinating, and I realized that I knew so little about India. At some point, he decided to make some kind of curry in the hall director's apartment in our building. This was the same hall director that soured me on religion because he insisted Ajay was going to hell because he wasn't Christian, but that's an old story. All I could tell you is that the smell of that curry was magical, and unlike anything I had ever smelled before. It was a kind of richness that I still associate with the richness of color used in Indian culture.

Oddly enough, I wouldn't even think about Indian food for many years after that. At some point when Stephanie was in grad school, she wanted to meet some friends at an Indian place on the east side of Cleveland called Saffron Patch. I wasn't really interested in going and it was totally out of my comfort zone, but I went along. The smell in the restaurant was immediately familiar, and I had some kind of chicken dish, with some reluctance. I remember enjoying it, but then I largely forgot about it.

It wasn't until Diana and I made one of our early trips to Walt Disney World, I think in 2009 while she was pregnant, that I started to engage again. I had a chicken yellow curry dish at Raglan Road in Downtown Disney, and it just blew my mind. At the same time, Indian food was regularly on the menu in the cafes at Microsoft in Redmond, so I was regularly exposed to all of that flavor. I was hooked.

When we moved to Orlando, Diana was able to get the "cluck cluck curry" recipe from Raglan Road, and she's made it many times. Indian lunch buffets became a weekly thing when I was working at SeaWorld corporate, and it was never hard to talk someone into coming along. I also went solo. A lot. When I worked downtown, there were a couple of places I could go. By this time, I also started to appreciate the differences between Thai curry (coconut milk) and the Indian stuff (way more spices and thicker sauces from tomato, yogurt, etc.), and while I'm a fan of both, the Indian varieties are always far richer and more delicious. And they don't screw around with marinating the chicken either, so it's super good.

I was off today, and Diana and I took the opportunity to go to a place, coincidentally, called Saffron here in Orlando. I used to go there quite a bit when I worked at SeaWorld, but with the pandemic and all, I hadn't been there in years. I like it because they're not afraid of spice, and you can tell them "Indian spicy" and they will deliver. Easily one of the best meals I've had in a long time.

There's a new place that opened a few months ago that's closer to us, but it's a little pricey for dinner, so I'll have to try lunch. Meanwhile, I'm going to try and make my own from a chicken tikka masala recipe that I found.


I might be a little obsessed with Wet Leg

posted by Jeff | Friday, September 2, 2022, 10:52 PM | comments: 0

In the last few years, I've spent a lot of time ranting about how the rock album has largely seemed to disappear from the music scene. Then, last year, Wolf Alice release Blue Weekend and I lost my fucking mind over it. This year, as it turns out, has to me been the triumphant return of the rock-n-roll album. I mean, Tears For Fears released what is arguably their best album, decades after making a couple of the best albums of the 80's and 90's. But across all the genres, SOFI TUKKER put out an electronic/dance album that is amazing, The Regrettes went more pop but put out a cohesive work, and shit, where did Maggie Rogers come from? Oh, and I'm still listening to the albums from Wolf Alice, Billie Eilish, Grouplove and Garbage.

But I have to admit that Wet Leg has captured my obsession. When "Chaise Longue" came out, I thought, yeah, that's a fun novelty. But then I heard "Too Late Now," and I realized there was something more there. I bought the album, and I've been obsessively listening to it. I don't know what "post punk" is supposed to mean, but I do know that what they're playing is better than the homogenous emo bullshit and forgettable pop that tends to dominate American radio these days. And then there have been countless YouTube cuts of them playing full concerts and the crowds understandably go apeshit over them. It's just really fun rock music that I feel like we rarely see anymore. And sure, part of it is that Rhian, the lead singer, seems like the nerdy girl in college that I wanted to hang out with, and her bandmate Hester has cool, classic tattoos. None of it is pretentious or precious, it's just super fun.

This leaves me in a place where I know they're playing in Orlando, but in a venue that is quite literally a strip mall and is sold out. I'm bitter about that.

Now everything is going wrongI think I changed my mind againI'm not sure if this is a songI don't even know what I'm sayingEverything is going wrongI think I changed my mind againI'm not sure if this is the kinda lifeThat I saw myself livingI don't need no dating appTo tell me if I look like crapTo tell me if I'm thin or fatTo tell me should I shave my ratI don't need no radioNo MTV, no BBCI just need a bubble bathTo set me on a higher path


My journey so far with web components

posted by Jeff | Friday, September 2, 2022, 12:08 AM | comments: 0

As I get closer to the release of POP Forums v19 (and there sure are a ton of things baked in there!), I'm starting to think back about my first experience using web components. For years I've talked about trying to modernize the front-end of the app, choosing instead to focus on scalability, but there isn't much room left to squeeze more performance out of it in practical terms, or at least not for what I need. What I kept coming back to was the fact that forums are mostly walls of text, and with tens of thousands of indexed threads on Google, I wasn't going to risk two decades of investment to break it with exotic and unnecessary appification of the, uh, app. Still, a big old file of spaghetti Javascript wasn't sustainable either, even if I did in the last release get away from the old jQuery dependency.

Where I landed was the use of web components, in a limited scope, for specific things that acted as little islands around the page. I quite literally wrote down the following requirements for myself:

  • Avoid a massive build with a never-ending chain of npm packages. That's a house of cards.
  • Try not to add any additional libraries. As it is, the two I'm primarily using, Bootstrap and TinyMCE, get weird when you start using them as modules.
  • Use TypeScript. Oddly enough, I've never written code with TS myself, even though I'm no stranger to it in code reviews.
  • Make sure the dev time experience is fast.
  • Come up with some clever way to react to state changes, if possible, without libraries.

Reactive components and state

For the most part, I hit all of those goals, with mixed results. My first step was to solve the reactive state problem. The most obvious case for this was when a new notification came in via SignalR (web sockets), and I had to update the count number in the UI. I prototyped some stuff and submitted something to StackExchange's Code Review, and while I got only one answer, it was the validation that I was looking for. It evolved a bit once I started using it, but the short story is that components would inherit from a base class, register themselves with a state class deriving from another base, and updating the component UI if a "watched" property on the state class changed. So for private message counts, I have a state class like so:

export class UserState extends StateBase {
  ...
  @WatchProperty
  newPmCount: number;
  ...

When another class changes the value of that newPmCount, the base class notifies any elements that registered to listen to that property. So the whole class that represents the new private message count badge looks like this:

export class PMCount extends ElementBase {
constructor() {
    super();
}

getDependentReference(): [StateBase, string] {
    return [PopForums.userState, "newPmCount"];
}

updateUI(data: number): void {
    if (data === 0)
        this.innerHTML = "";
    else
        this.innerHTML = `${data}`;
}

The ElementBase is an abstract class, and you have to implement the getDependentReference and updateUI members. The first wants to know what instance of a StateBase derived class and property name that it should listen to, while the second takes the new data values from the watched property and does something to the UI. You can look at the source to see what's involved with StateBase, ElementBase and WatchProperty, but it's all mostly straight forward.

With that out of the way, I started to build components. Here's the deal though... there is not a big chain of nested components here. Most of them do not use a shadow DOM and depend on the CSS of the rest of the app. While I could have gone the route of componentizing all the things, I wouldn't have gained much because there's almost no reuse. One thing I did experiment with is including templates, for a forum topic row (the thing with the topic title, last post date, etc.) for example, in the regular markup. In retrospect, this doesn't make a lot of sense, because there's no programmatic checking to make sure the template is valid, but it seemed like a good idea since in those cases they were emulating markup that was being generated on the server side. The templates are just as close to the server-side code as they are the front-end code.

Client-side localization and date formatting

I wanted to get the server out of the business of formatting dates and updating them ("2 minutes ago"), but I always struggled with how I would get the language appropriate text to the browser, like "less than a minute ago" or "Today 2:32pm." The forum is localized in six languages. First I wrote a localization manager that called back to the server and got an array of things it might need to render. This is mercifully cached by the browser, bit it's only 682 bytes for the English version when compressed. I think the Chinese was the largest payload. What's it's loaded, components that need it, like the time formatter, can get the localized strings and do their thing. I don't know if this is the "right" way to do it, but I'm super happy with it. Dates all over the page update every minute when they're displaying recent times.

Tooling

Visual Studio seemed to work fine for writing the code here, but I could never get the debugging to work. It's not a big deal to use the debugger in the browser, but that was weird. Not being tied to Visual Studio also meant that I could use VS Code at the same time, if I wanted to, and I often did because it's faster.

The hotness of Visual Studio is the hot reload when you change stuff, but the trick here is that I wanted to move the code into the Razor Class Library (RCL) where all of the views lived. The web app would then consume that library. Earlier in the year when I started this, I could observe hot reload when you saved most any C# file, but I couldn't trigger browser refreshes after transpiling the TypeScript in the RCL. Eventually this started working when I used the tsconfig.json to make it single-file transpile to the project's wwwroot folder. Once that was in place, reload started working on every save.

I decided the simplest way to use this script was to transpile down to one file on save, which is what I did in tsconfig.json. It comes down in 24k once compressed, and only once because of browser caching. No module loaders or webpack to mess with, just another script reference.

Since I'm not using modules, I needed a way to reference Bootstrap and TinyMCE in a few places, and to do that I just stubbed out the parts I needed with a bunch of declare definitions, to satisfy the compiler. I know this is also not ideal, but it works well enough.

Results

The results are easier to maintain, but I'm sure anyone who spends all day in Javascript would not care for what I produced. I changed the way I formatted code and used inconsistent syntaxes (think anonymous functions, there are at least two ways to write those) from one thing to the next. The placement of code is inconsistent across the components, state and service classes, which makes it confusing to figure out where the thing you need to change is. The real-time chat implementation and the topic state are good examples of this inconsistency. I could improve this by using a linter, which isn't out of the question. But for better or worse, the new functionality is much better than it would have otherwise been. I'm proud of the selective post quoting (highlight the quote, push the button, it appears in the text box). Building the real-time chat, especially trying to position it right in the window and not scroll erratically, was challenging.

It's not perfect, but I learned a ton, and I didn't have to buy-in to any new dependencies. I still use Vue.js for the admin part of the forums, but even that takes on the low commitment vibe with a straight-up script reference and one script file against one markup page. The version history shows 30 significant updates, some of which are quite old. Not having image uploads all of this time was particularly embarrassing.