2023 Retrospective

It’s getting to be that time of year; namely, the end of the year. What the heck happened in 2023? One of the (many) terrible things about getting old is that your life mostly stays the same, and it becomes harder and harder to pick out significant events that elevate you from your daily doldrums. That being said, when looking back, enough things happened to make 2023 somewhat memorable.

Things didn’t start off too well in the work department, as the old co-worker who hired me as an underling was fired in January. This was somewhat annoying, as one of the main reasons I took the job was to work with them again. That and to learn Elixir. It didn’t bode well that the company CEO would do such a thing, but I had only been working there for a few months, and didn’t really want to start job hunting again. I decided that I’d do the minimum and stay until things got untenable.

The family took the first trip of the year to Ft. Walton Beach, Flordia, during spring break. It was just “OK” — most of the beaches we went to were kinda dirty and small. My favorite, which was neither of those, was John Beasley Park. Every morning we walked the dog to an incredibly tiny spot of beach, which was kind of a fun, short-lived tradition. The kids had fun herding hermit crabs; fortunately we didn’t try to bring any back with us.

After coming back to Columbus, I didn’t have to wait too long until the workplace premonitions were fulfilled. The CEO decided that Elixir developers were too expensive, and that he’d have better luck with Node/JavaScript devs. To that end, he fired the backend web team (including me), in preparation for another rewrite of the webapp platform (the first rewrite left unfinished). Hopefully it works out for him; I have not been following the company’s fortunes, as it’s not my problem anymore!

Thus started two months of unemployment, which was both annoying and glorious. Annoying, because job hunting is the worst. Glorious, because working is also the worst. I spent quite a lot of time doing my own programming projects, including a series of grid-based games for my Ganbaru Games website. The newest Zelda video game, Tears of the Kingdom, was also released about two weeks into my sabbatical, which I played the heck out of. I also read quite a few books related to the history of personal computing, such as iWoz, Revolution in the Valley, and Dealers of Lightning.

I ended up getting an offer for a new job on my 42nd birthday, and started the last week of June. I’ve been working for, doing web-related things for their online loan application portal. My co-workers are great, but sometimes I can’t help wondering if I’m too old for webdev — I have a hard time getting excited about the prodigious amounts of code needed for today’s “best practices.”

Chan and I celebrated our 15th wedding anniversary in August, so that seemed like a fairly significant milestone. Hard to believe it’s been 15 years, but then again our oldest is a teen now, so that makes it pretty real. The in-laws took the kids for an overnight, so we could pretend we were childless for an evening.

October centered around marathoning, as mentioned earlier. Whatever disease I caught between the first and second races really messed me up — it took over a month to recover. And then, of course, when I started feeling better, one of the kids gets sick and the whole cycle begins again. I’m still coughing up snot two months later.

We went to visit my dad’s side of the family in North Carolina twice in November. Unfortunately, the first visit was because my grandfather passed away — he was 92. We then returned for Thanksgiving feasting. The last travel of the year was a trip back to Nebraska, to visit my parents and catch up with some high school friends. Even though we all stayed together during the college years, there was a post-graduation disaspora (as you might expect). It had been about 10 years since I’d last seen some of these guys — we’re all old now, with families and stuff. Sadly, there’s never enough time to re-live the glory days of youth, though we did play a little Magic: the Gathering and Mario Kart 64.

In the end, how would I classify 2023? Was it “good” or “bad”? I guess a mixture of both, as one might imagine — more good than bad, fortunately. Life continues, and we try to make the best of it that we can. I expect to do the same in 2024.


2023 Marathons — Chicago & Columbus

Despite my best efforts, I really haven’t been writing much this year, but have to dust off the keyboard to do my annual marathon retrospective. I detailed this year’s training in my previous post, but had a major setback three weeks before Chicago. On my last long run of the season, I tripped over a cut off sign post and landed pretty hard on my right hip. I had jumped off the sidewalk in order to go around homeless guy, and when I tried to jump back on, I just didn’t see the stub of the post — it was rainy, and there was enough grass growing around the post that it must have just not registered as an obstacle in my mind. It was one of those situations where you don’t remember falling, just coming to your senses on the ground and thinking “what the @#$%&! just happened?” My hip was probably at a 6/10 for pain, but I kept going, hoping that keeping the joint/muscle moving would aid recovery. While I was able to finish the run, it was definitely not enjoyable. Once my hip started to feel slightly better, I noticed that one of the toes on my right foot (the one that kicked the signpost) felt “off” — confirmed broken on my return home. I guess the fortunate part of the whole thing was that it happened far enough ahead of my schedule races that I felt confident of recovery, and was able to (mostly) continue with my training taper.

Sign post stub I tripped over
Tripped over this bastard
Broken toe
The end result


First race up was Chicago. I took a day off work and drove up with the family — we hoofed around downtown for two days. The kids had never been, and it had almost been 20 years(!) since I had last visited. We got a cheap-o hotel near Midway, but train access was pretty convenient, so it worked out. Race morning promised great weather. There were so many people in town for the marathon, it was just on a different scale than what I had experienced before. Getting to the starting point and gear check was straightforward. I had so much time to kill that I sipped on some Gatorade while waiting. This turned out to be a problem later, as I felt like I needed to hit a porta-potty once I got into the starting corrals, but it was too late by that point.

Since I’d never run Chicago before, I figured I’d hang out with a pace group for a while and just try to enjoy the course. The first mile was dead on 7:15, but the next three were under 7:00; not sure what the pacer was thinking. I was worried about going too fast, so tried to relax and slow down, but ended up keeping ~7:05/mile pace for most of the race. The 3:10 group never caught back up to me, which was kind of unfortunate; I felt like I wasn’t really able to enjoy the crowds/scenery as much because I was so focused on keeping my own pace. I was very pleased with my nutrition strategy, which involved bringing along 4 Maurtens (2 regular, 2 w/ caffeine) and 2 Honey Stinger Golds. They were easy to get down, and had enough variation that I could look forward to eating the next one. The only hiccup in the race was that I eventually had to stop for a bathroom break at mile 23 — it was just too uncomfortable at that point. The rest of the race was really just hanging on; lots of folks were having to drop out and start walking. At the finish line I had barely enough time to breathe a sigh of relief before having to avoid a dude getting helped into a wheelchair, while simultaneously stepping over piles of puke. It was pretty savage. My finish time was 3:08:43, about a 4 minute improvement to my PR. Although that is fast enough to apply to Boston, it probably isn’t enough to actually get accepted (scroll to the “Qualifying History” section).


Even after a pretty hard race the previous weekend, and getting a fairly nasty respiratory illness that same week, I decided I was going to run Columbus as well. My body felt mostly recovered from Chicago, but I was still coughing up snot. I took some daytime cold medicine that included decongestants, but blew my nose fairly frequently during the race. Since I wasn’t in 100% condition, I told myself not to push too hard, and just enjoy the course. My average heart rate was noticably higher (around 5bpm) than the previous week, which I attributed to still recovering from sickness. The first mile was slow, due to congestion at the starting line. Since the Columbus race is so much smaller than Chicago (3,000 + 6,000 ½ marathon vs. 47,000!), runners in the first corral vary wildly in terms of speed, and I didn’t do enough to move to the front of the group. After the first mile, I was able to settle back in to the ~7:05/mile pace that seems to be comfortable for my current fitness level. The unfortunate thing was that I could feel my legs fatiguing much faster than the previous race. A brisk wind blowing from the north also made the traversal up High Street (around the halfway point) pretty uncomfortable. There were times when I felt I was going incredibly slowly, but just grit my teeth and focused on putting one foot in front of the other. Miles 24 & 25 were the worst, but after passing the #25 marker, I realized that I could still finish around the same time as Chicago (or maybe faster) if I kept a 7:00/mile pace. I felt pretty bad, but somehow dug deep enough to get that speed and finish 36 seconds faster. I have to say, Columbus’ post-race snacks were a lot better — Cheryl’s cookies and real chocolate milk instead of waxy donuts and Muscle Milk (bleh).

Finishing the Columbus Marathon
2023 Chicago Marathon results
2023 Columbus Marathon results

Looking ahead

After back-to-back races, I’m going to take a bit of a (well-deserved) break. Looking forward, however, I think there are a few goals I can work towards:

  1. I’m going to put in the work to make my diet less trashy and try to drop 10 lbs; haven’t really had the motivation to lose weight, but it’s another factor under my control
  2. I might do some speed training and see if I can do sub-1:30 at the Cap City Half Marathon
  3. Since Boston registration is the opposite of Columbus, the earliest I would be able to run is 2025; I might try to enter a race earlier in 2024, to get more of a buffer on my best time (Cincinnati?)


Moar Running

Cold Weather Running

This year I was a big wimp, and mainly ran on a treadmill during the colder winter/spring months. The company I was working for at the beginning of the year offered a small stipend to use for fitness-related expenses, so I renewed my membership to the Worthington location of Snap Fitness. Treadmill running is boring as heck, but I found it preferable to the cold/dark. Sadly, my Lung Plus is collecting dust.

VO₂ Max Test

After the training season last year, I found out that the Exercise Science Lab at OSU offers performance testing. Months later, in February of this year, I was finally able to go in for the test. While I was interested in my VO₂ max, I specifically wanted to know my max heart rate, as I would base my upcoming training off that value. I had done an “at home” max HR test (sequential hill sprints, measure HR at the end of the third one), but it seemed low based on most age-based calculators. The test itself was interesting; I got hooked up using the standard heart rate chest strap and respiratory mask, then ran on a treadmill for a while. They increased the speed until I hit 8.5 mph, and then started cranking the incline. What I didn’t realize was that the test ends whenever you want it to. Basically, when you think you can’t go any more, you tap out. Of course, after the fact, you second-guess yourself, and wonder if you couldn’t have kept going for a bit longer. Regardless, my max HR came in at 160 (which is about 12% lower than my age-based calculation), and VO₂ max was 58.2. This was super helpful for targeting an aerobic heart rate during this year’s training season.

2023 Marathon Training

This year I’m using the 55-70 miles per week plan detailed in Advanced Marathoning. I specifically upped my milage in April/May in order to be able to start this plan safely. For the most part, it has been going OK — I did have to visit a PT in order to resolve some IT band pain, which caused me to downgrade about a week and a half’s worth of training in June. Comparing with my speed/heart rate from runs last year, there doesn’t seem to be a marked improvement, even though I’m running about 33% more. I will say that this volume is pushing the limit of what I’m able to integrate into my life, as I’m averaging 10 miles per day at this point, while trying to be a (present) parent and work a full-time job. The mid-week long runs usually have me questioning my sanity.

All that being said, I have plans to run two races this season. I signed up for Chicago — it’ll be my first out of town race. The plan is to take the family and do some tourist stuff, then run the race and head home that same day. My goal this year is fairly conservative — to be able to stick to last year’s target pace and hit 3:10, which is a Boston-qualifying time for my age. In the event that I fail spectacularly, I have a backup in the Columbus marathon, which will be a week later. I haven’t run marathons that close together before; in 2020 I ran two races two weeks apart, so we’ll see how I feel after a single week’s worth of recovery.


2022 Columbus Marathon Recap

Another year, another marathon retrospective! I started training this year using the lowest milage plan from Advanced Marathoning by Pete Pfitzinger and Scott Douglas. It had slightly more milage overall than the “advanced” plan from Hal Higdon, whose plans I’d followed exclusively up until now. It was pretty enjoyable, and the only deviations I made were due to catching COVID (!) about a month and a half before the race. Really, that was the only hiccup in my training, as you might expect. My kids came down with it from school, and it spread rapidly through the house. I never tested positive, but was down for the count with a high fever and lethargy, so not sure what else it could have been. I missed about a week of training, including one of my scheduled 20 mile runs, unfortunately. Getting back into easy running was concerning, as my heart rate (as reported by the optical sensor on my watch) was 20-30 bpm higher than normal. I ended up staying conservative in my return to training, as well as buying a chest strap HR sensor for more accurate readings. It took two weeks for me to get back to “normal,” but didn’t miss any other long runs, so felt I had a reasonable chance of still being able to race.

I thought I was relatively safe from sickness after that, but two weeks prior to the race, my twins came down with colds. Vigorous hand washing saved me from infection, thankfully. Then, the week before the race, my oldest daughter came back from a school-organized overnight camp with a stomach bug. My wife proceeded to get sick the day before the race, and my youngest daughter the day of. I was up at 4AM on race day cleaning up barf. Amazingly, I was still unscathed, aside from running (ha!) on terrible sleep.

Otherwise, race day was mostly uneventful. Traffic to the starting area was terrible, as usual. I made it out of the parking garage with about a half hour to spare, and thought I’d take my own advice from last year and use a porta-potty, but the lines were so long and slow that I didn’t have time. There were signs advertising “restrooms are in the starting corrals!” But that was a lie. So I just held it for three hours! I didn’t even really have enough time for a proper warm up — I was still fiddling with the fit of my shoes when the starting gun went off.

My race was not very strategic — I mainly went by “feel”, even though I was wearing my HR chest strap. I didn’t do enough training at race pace to have a good sense of how fast I could/should go. I was definitely running faster than most of my training runs, and I was breathing hard, but the pace felt sustainable. Fortunately my target pace (7:15/mi) was conservative enough such that my endurance was sufficient. I tried to pair up with other runners who were also trying to hold a similar pace, and ran for a few miles with another guy around my age, but ended up dropping him even before the halfway point. The rest of the race was a solo effort.

One last-minute change to my plan was bringing along my own gel packets. I watched a video of Floris Gierman’s Chicago Marathon experience, and noted that he brought quite a few gels. I felt like I would definitely need them, as there are only two nutrition stations along the Columbus course, but I didn’t know how to carry them. On my long runs during training, I would usually only bring two gels, which fit neatly into a side pocket on my water flask. Well, I ended up just shoving them in my pockets — I ate one in my car before the start, then put one in each pocket of my shorts, and carried a third. The additional weight in my shorts ended up not being that big of an annoyance, even though I’d never done it before, so I’ll probably adopt that strategy again in the future. In total I consumed five gels; four of my own, and one from a course nutrition station. My one regret was that I didn’t take the last gel packet; I was having a hard time getting them down by that point in the race and didn’t think I could choke it down. The volunteer handing out the flavor I wanted was offering two, and I thought “no way I can eat those!” so just skipped. I think if I would have taken 15 seconds to eat that last gel, I would have done better for the last few miles.

Even after experiencing cramps in the last mile last year, I never really investigated ways to replenish electrolytes during the race. Of course the same thing happened this year. One amusing thing was being encouraged by another runner during the last stretch to the finish. My hamstrings were on the verge of seizing up; “I can’t push it too hard, I’m cramping up!” I told him. “So am I!” he yelled as he passed me, then continued to yell “Ow! Damn!” as he kept on going.

My finish — in the yellow jersey

On the whole, I was pretty satisfied with this year’s race. My official time was 3:12:54, more than 5 minutes faster than last year. Even with catching COVID, I felt a lot stronger, especially just after finishing — last year I was barely able to hobble to my car; this year I was even able to walk the dog with my family later in the day. I still have the goal of a sub-3:00 race though, so there’ll definitely be more running adventures in my future.


Building a custom Apple keyboard

Over time, I’ve slowly become a bit of a keyboard nerd. When I put together my very first PC as a teenager, I ended up buying an IBM Model M keyboard from a friend’s dad. At the time, I didn’t know that it would eventually rise to legendary status among keyboard enthusiasts — I just knew I liked the heft and the satisfying sound of the keys being pressed. That Model M stayed with me for years and years, but fell into disuse. For a decent chunk of my professional life, I used Apple’s modern chiclet-style keyboards; at the time, I liked the short key travel and the extra space separating the keys. Eventually I started working from home more often, and so needed to have two setups for my laptop. At the office, I used quieter keyboards, but at home I dug the Model M back out. I found someone on eBay who sold me a cable that converted the PS/2 output into USB, suitable for use by a modern computer. And I started to really enjoy using the old clunker. When you type on a keyboard all day, it turns out that the type of keyboard makes a big difference (see what I did there?).

When I switched jobs in 2015, I decided that I needed a better keyboard “for the office.” From various parts of the internet, I had heard about the Happy Hacking Keyboard, and was intrigued by the 60% size and Topre keyswitches. I bought one, loved it, and have been using it off and on ever since. With that experience in mind, when I switched jobs last year I thought I would continue the “new job == new keyboard” tradition, and built a custom split keyboard from Keebio, the Quefrency. I wasn’t sure what to expect, having never built my own keyboard before, but the hotswap keyswitch sockets made it incredibly easy to put together. No soldering was required; it was basically about the easiest possible way to get into the DIY keyboard hobby.

Well, I haven’t switched jobs again, but I recently got the itch to build another keyboard. I was trolling the internets, as one does, and saw examples of vintage Apple Extended Keyboards hacked down to 60% size. My interest was immediately piqued. My keyboard collection at this point included boards with buckling spring switches, Topre switches, and Cherry switches. I had been wanting to make a board that used ALPS style switches, but hadn’t been able to find suitable keycaps. Unfortunately, most enthusiasts these days use Cherry-compatible key switches, and therefore most custom keycap sets are for Cherry switches only. ALPS switches have a different stem shape, and are incompatible. I guess I theoretically knew that it was possible to harvest keycaps from older keyboards, but it never quite clicked until I saw examples of repurposed Apple keycaps online. Since didn’t want to destroy a working keyboard, I found a listing on eBay for just a set of Apple Extended Keyboard II keycaps. I’m assuming that they were salvaged from a dead board, so I don’t have “ruining vintage computer equipment” on my conscience.

The various example keyboards I saw were based off a custom PCB called Alps64, which is made by a keyboard enthusiast named hasu. While it doesn’t seem like a full-time, professional operation, hasu does take orders for Alps64 boards. The only slight problem was that hasu lives in Japan, and Japan Post has suspended service to the USA due to COVID, so I had to pony up some extra cash for a botique shipping company. Fortunately, since the Alps64 is a standard 60% size, it can fit any number of existing cases. I got a generic case made out of black anodized aluminum.

With the PCB and layout plate obtained, I had to decide exactly what switches I wanted. I decided that I wanted to buy new switches, rather than salvage them from an existing keyboard. To that end, I bought ALPS-compatible Matias quiet click switches. Since real ALPS aren’t made anymore, these Matias switches (clones, basically) are the next best thing. The quiet click switches are tactile, with a satisfying bump. The clicky switches seemed too loud to me, and I want to be able to use keyboards that aren’t too annoying in an office setting. Matias will sell you a switch tester with free shipping, if you would like to test each type in person.

With all the parts on hand, next came assembly. In contrast to my previous board which used hot-swappable sockets, this keyboard required some soldering. The PCB came with resistors that needed to be soldered, in addition to each switch. One very cool extra that was included with the Alps64 was a small tool that helps bend the leads on the resistors so that they fit perfectly in the board. Connecting all the resistors and switches was more tedious than difficult, as there was no delicate soldering required. Screwing the PCB into the bottom case completed the build.

tool to help bend resistor lead wires
This included tool was super handy. I love it!
resistors getting soldered to alps64 PCB
Soldering all the resistors is still a bit tedious, though.

The only slightly tricky thing I had trouble with was seating the keycaps that required stabilizers. Since I didn’t remove the caps from an existing keyboard, I wasn’t able to observe how they were originally placed. The space bar was especially annoying, I tried placing the stabilizer in various orientations before I found a photo of the correct one. Also, the keycaps required more force than I expected in order to firmly seat them on each switch stem. I had each keycap in place, then realized that I needed to push harder on each one in order to get them really on there.

in the process of installing keycaps
Easy caps are in place.
example of AEKII spacebar stabilizers
The stabilizers for the space bar should look like this.
keycaps installed
Finally got all the caps put on correctly.

Since the Alps64 board is only 60%, it’s missing lots of keys that a full-sized keyboard would have — most notably the escape key. Fortunately there is an incredibly user friendly firmware editor which allows you to create multiple “layers” on your keyboard. For example, in my default layer, all keys are taken at face value, but if I hold the right control key, a second layer is activated, which maps backtick to escape, WASD to arrow keys, 1-9 to function keys, etc. So you can basically customize the layout completely.

the completed keyboard
The completed keyboard.

I really like this keyboard so far. The Matias quiet click switches are very satisfying, and the weight of the aluminum case gives some heft which is missing from my Quefrency and HHKB. The classic Apple font on the keycaps is also delightfully nostalgic. It also is totally fine driving my Linux box — the command key acts like super. The only downside was the cost; I paid over $200 for the various parts, which is not cheap. Fortunately (for me, at least) I was able to expense my company to cover the costs. For that small intersection of people between keyboard nerds and Mac users, I can definitely recommend building off an Alps64.