A very retro Christmas

I'm certainly not a "hardcore" gamer by any stretch of the imagination.  However, like many kids who grew up in the 80s and 90s, I have fond memories of playing Nintendo.  So I still have a soft spot for retro games, which I occasionally play via emulation.  Turns out there's a large community of retro games on YouTube, so I sometimes watch their videos.  I particularly like channels like The Gaming Historian, that trace the history and context of games, franchises, or pieces of hardware.

I've also recently taken to watching the odd retro gaming video on YouTube.  In particular, I'm kind of fascinated by speed-running.  Several months ago I stumbled upon this video of a Dragon Warrior speed run in less than half an hour.  I loved Dragon Warrior as a kid, and I remember spending hours and hours grinding so that I'd be at a high enough level to move on to the next area.  But this run used random number generator (RNG) manipulation to control the "random" actions of the game and basically beat it over lunch.  I find the amount of work and investigation that goes into this type of thing truly impressive.  (Though I can no longer remember what it's like to have the free time that you'd need to do this.)

Anyway, while I'm watching these videos on my tablet or phone, my son will sometimes sidle up and watch them over my shoulder.  So he knows about and is interested in various old-school games.  He even sometimes watches me plays them or takes a turn playing them on my phone.  He's also been getting more interested in games, coding, and computers in general lately.

So this year, we got him a DIY project for Christmas - a retro gaming console.  Or, more specifically, the components to build a retro gaming console.  This consisted of a Raspberry Pi 400 CanaKit and a couple of IR wireless controllers.  I walked him through assembling the hardware, showing him what the components were and what they're for, and took care of flashing the microSD card with a RetroPie image and getting some games onto it.

Overall, this was actually a remarkably easy process.  The CanaKit comes with all the hardware you need, except for controllers, and it's pretty easy to up together.  I don't think I even needed any tools.  The controllers I got were advertised as working with Raspberry Pi and "just worked".  Even installing RetroPie was pretty painless.  The process was fairly well documented and required minimal configuration.

So now we have a nice little retro gaming console.  RetroPie works well and has a fairly easy to use interface (it even has some instructions for controlling it with the gamepad on-screen).  My son hasn't had much problem with it so far.  In fact, we beat Contra together this afternoon.  We used the Konami code to get 30 lives, of course.  I can't imagine playing without it - I'd almost forgotten how brutally difficult early video games could be.

Refactoring LnBlog

Author's note:  Happy new year!  I thought I'd start the year off with another old post that's been sitting in my drafts folder since March 24, 2013.  This time, though, I'm going to provide more inline commentary.  As usual, the interjections will be italicized and in parentheses.

You see, this post is on LnBlog, and specifically what is (or was) wrong with it.  If you don't know, LnBlog is the software that runs this website - I wrote it as a "teach yourself PHP" project starting back around 2005.  I've been improving it, on and off, ever since.  So in this post, I'm going to show you what I thought of it back in 2013 and then discuss what I think now and what has changed.  Hopefully it will be somewhat enlightening.  Enjoy!


The year is (relatively) new and it's time for some reflection. In this case, reflection on past code - namely LnBlog, the software that runs this site.

I've come a long way from LnBlog, which as my first "teach yourself PHP" project. I've now been doing full-time professional PHP development since 2007 and can reasonably claim to have some expertise in it. And looking back, while the LnBlog codebase is surprisingly not horrifying for someone who had a whopping two months of web development experience going into it, it's still a mess. So it's time to start slowly refactoring it. And who knows? Blogging my thought process might be useful or interesting to others.

(Back to now: I actually did blog some of this stuff, but not until 2017 or so.  And I still agree with that initial assessment.  The code had plenty of problems then and it still does.  If I were starting fresh today, I'd probably do almost everything differently.  But on the other hand, I've seen much worse in much newer code.  And in the last three years or so I've been making slow and steady improvements.)

The Issues

There are lot of things about LnBlog that need changing. A few of them are functional, but it's mostly maintenance issues. By that I mean that the code is not amenable to change. It's not well organized, it's too hard to understand, and it's too difficult to make updates. So let's go over a few of the obvious difficulties.

1. The plugin system

I have to face it - the plugin system is an unholy mess. The entire design is poorly thought out. It's built on the premise that a "plugin" will be a single PHP file, which makes things...painful. Any plugin with significant functionality or a decent amount markup starts to get messy very quickly. The "single file" limitation makes adding styles and JavaScript ugly as well.

On the up side, the event-driven aspect works reasonably well. The code for it is a bit nasty, but it works. The main problem is that there aren't really enough extension points. It needs a bit more granularity, I think. Or perhaps it just needs to be better organized.

(Back to now: I still agree with most of this, except perhaps the thing about extension points.  So far, the only place where that's been a real problem is when it comes to inserting markup mid-page.  But yeah, the whole "a plugin is one file" thing was ill-conceived.  The good news is that it's totally fixable - I just need to figure out some design conventions around splitting things out, which hasn't been a priority so far.)

2. The templating system

This one is also an unholy mess. The idea isn't bad - allow any file in a theme to be over-ridden. However, I tried to abstract the template files too much. The files are too big and contain too much logic. Also, the simple template library I'm using is more a hindrance than a help. I'd be better off just ditching it.

I've also been thinking of getting rid of the translation support. Let's face it - I'm the only person using this software. And I'm only fluent in one language. Granted, the translation markers don't cause any harm, but they don't really do anything for me either, and accounting for them in JS is a bit of a pain.

(Back to now: The only thing I still agree with here is that the existing templates are a mess.  But that has nothing to do with the template system - I just did a bad job of implementing the template logic.  I'm working on fixing that - for instance, I added some Jinja-like block functionality to the template library.  I had considered re-writing the templates in Twig or something, but it quickly became obvious that that would be a huge amount of work, that it would be difficult to do in a piece-wise fashion, and it's not clear that the payoff would be worth it.  Likewise with the translation markers - taking them out would be a bunch of work for almost zero payoff and the JS thing isn't really that big a deal.  Besides, if I ever changed my mind again it's WAY more work to put them back in.)

3. The UI sucks

Yeah, my client-side skills have come a long way since I built LnBlog. The UI is very Web 1.0. The JavaScript is poorly written, the style sheets are a mess, the markup is badly done, and it's generally "serviceable" at best.

As I realized the other day, the style sheets and markup are probably the worst part. Trying to update them is difficult at best, which is exactly the opposite of what you want in a theme system. In retrospect, my idea to replace files wholesale rather than overriding seems misguided. They're too fragmented. When it comes to the style sheets and JavaScript, this also hurts performance, because there are a lot of files and everything is loaded in the page head.

(Back to now: This is pretty much still accurate.  I've been slowly improving the UI, but it's still not looking particularly "modern".  That's not such a big deal, but the templates and CSS are still a pain-point.  Really, what I need to do is rework the theme system so that I can easily make lighter-weight themes, i.e. I should be able to just create one override CSS file and call it good.  I have the framework for that in place, but I have yet to actually go through the existing themes and make that work.)

4. Too much compatibility

When I first started writing LnBlog, I had a really crappy shared web hosting account. And by "really crappy", I mean it offered no database server and had safe-mode and the various other half-baked PHP "security measures" enabled by default. So I actually built LnBlog to be maximally compatible with such an environment.

These days, you can get decent hosting pretty cheap. So unless you can't afford to pay anything, there's no need to settle for such crappy hosting. And again, let's be honest here - I don't even know anyone other than me who's using this software. So supporting such crappy, hypothetical configurations is a waste of my time.

In addition, I really put an absolutely ridiculous number of configuration settings into LnBlog. The main config file is extensively documented and comes to over 700 lines. That's completely nuts and a pain to deal with. It contains a lot of settings that are pointless and that hardly anyone would ever want to override. And most of those could be moved into a GUI rather than having to edit a file. There's absolutely no reason for many of those settings.

(Back to now: This is also still true.  I've been looking at redoing the config system, but that's another one of those things that is a big change because it has tendrils all through the code.  I have been moving some stuff out of the main blogconfig.php file, and I've been avoiding adding to it, but there's still a lot there.  For the most part, it's not a huge issue, since most of the things you would want to configure are through the UI, but still....)

5. No real controller structure

I knew nothing of MVC or design patterns when I first wrote LnBlog. As a result, the "glue" code is in the form of old-style procedural pages. They're messy, poorly organized, and hard to maintain. A more modern approach would make things much easier to deal with.

(Back to now: The old "pages" are dead in all but name.  A handful of them still exist, but they're three-liners that just delegate to a controller class.  The bad news is that it's pretty much just two monolithic controller classes with all the old logic dumped into them.  So that sucks.  But they have dependency injection and some unit test coverage, so this is still an improvement.  And I've at least got a little routing groundwork laid so that I could start breaking off pieces of functionality into other classes in the future.)

The Problem

While I'd like to fix all this stuff in one shot, there are three big problems here:

  1. That's a lot of stuff, both in terms of the number of tasks and the amount of code involved.
  2. I no longer have the kind of free time I did when I first wrote this.
  3. I'm actually using this software.

Of course, those are two sides of the same coin.  LnBlog isn't huge, but it isn't tiny either - the codebase is upwards of 20,000 lines.  That wouldn't be a big deal if I were working on it as my full-time job, but this is a side-project and I can devote maybe a couple hours a day to it sometimes.  So major surgery is pretty much out.  And the third factor means that I need to be careful about breaking changes - not only do I not want to break my own website, but I also want to avoid having to do a lot of migration work because writing migration scripts is not my idea of a fun way to spend my free time.

(Back to now: This is always a problem with open-source and side projects.  Nothing has changed here except, perhaps, my development process.  After that year I spent learning about the Personal Software Process, I started using some of those methods for my personal projects.  The main change was that, when making any kind of a big change or feature addition, I actual do a semi-formal process with a requirements and design phase and review phases.  It sounds kind of silly for a personal project, but it's actually extremely useful.  The main benefit is just in having my thoughts documented.  Since I might be going a week or more between coding sessions on any particular feature, it's insanely helpful to have documentation to refer back to.  That way I don't have to remember or waste time figuring things out again.  And by having design- and code-review phases as part of my development process, I have a built-in reminder to go back and check that I actually implemented all those things I documented.  Having the whole thing written out just makes it much easier when you have long gaps in between work sessions.)


General commentary from the present: So as you can see from the above comments, I've fixed or am fixing a lot of the things that bothered me about LnBlog eight years ago.  In the last two or three years I've put a lot of work into this project again.  Part of it is because I actually use it and want it to be better, but part of it is also "sharpening the saw".  I've been using LnBlog as an exercise in building my development skills.  It's not just coding new features, like the flurry of development in the first two years or so that I worked on LnBlog, it's cleaning up my past messes, adding quality assurance (in the form of tests and static analysis), updating the documentation and figuring out how to balance responsible project management with limited resources).  It's an exercise in managing legacy code.

To me, this is a useful and important thing to practice.  As a professional developer, you will have to deal with legacy code.  In my day job, I've had to deal with code that was written by our CEO 10+ years ago when he started the company.  Software is a weird combination of things that live a week and things that live forever, and there's seldom any good way to tell which group the code will be in when you're writing it.  So while it's important to know how to write code correctly the first time, it's also important to know how to deal with the reality of the code you have.  And no, "let's rewrite it" is not dealing with reality.  And when you have a code-base that's 15 years old, that you're actively using, and that you originally wrote, it's a great opportunity to experiment and build your skills in terms of modernizing legacy code.

And that's just what I'm doing.  Slowly but surely, LnBlog is getting better.  I've implemented a bunch of new features, and in the process I've worked on my design and analysis skills, both at a product level and at a technical level.  I've fixed a bunch of bugs, which makes my life easier.  I've implemented additional tests and static analysis, which also makes my life easier by finding bugs faster and giving me more confidence in my code.  I've improved the design of the system, which again makes my life easier because I can now do more with less effort.  Sure, there's still plenty do to, but I've made lots of progress, and things are only getting better.

Christmas cats

Merry slightly belated Christmas to all! This year we managed to have a nice holiday despite the global pandemic. Sadly, that meant we were not able to do the traditional Christmas eve party with the entire family and lots of friends.  Instead, my wife made a fancy dinner of beef Wellington for the immediate family.  Not quite the same, but still nice.

Of course, our big news this year was the new additions to our household: a pair of kittens!  When our son was born, we had three cats.  The last one, who was with us for 20 years, died this past July.  After six months, we decided we were ready for some new friends.  We didn't originally plan to get them right away, but it was nice to have kitties under the tree for Christmas.

The new kittens, Pixel and Sprite, laying in their kitty condo.

These two adorable little guys came to us from Keller's Kats Rescue on Christmas Eve.  They're both about six months old and were fostered together, so they already know each other and get along great.  My wife wanted to make the smaller one Pixel after the cat in Robert Heinlein's The Cat Who Walks Through Walls.  I jokingly suggested that if the small one was a pixel, maybe the bigger one should be a sprite.  She and our son liked that, so Pixel and Sprite it is!

Athlean-X review

In a previous fitness post I talked about how I was using Athlean-X for my training regimen.  In this post, I'm going to go into a little more detail and give some reviews of the programs I've done and the Athlean-X system in general.  Hopefully this will be useful to fellow geeks who decide they'd like to take active control of their health and fitness. 

The Athlean-X Approach

Obviously you can read all about this on their website, but I thought a brief overview might be helpful.  Athlean-X is founded and run by Jeff Cavaliere.  Jeff is a Certified Strength and Conditioning Specialist (CSCS) with a Master's degree in Physical Therapy.  His schtick is that he trains professional athletes.  He used to be a strength coach for the New York Mets and his YouTube channel has a bunch of videos that show him coaching pro football players, pro wrestlers, etc.  So the idea is that his training programs are training you like he would train an athlete.  Except, you know, without the actual one-on-one coaching.

One of the aspects of this that I really like is the idea of training harder rather than longer.  There are multiple ways you can train to evoke a response in your body.  One is the "three hours in the gym" approach that people tend to think of when they look at body builders or people with that type of physique.  The alternative, which the AX programs use, is to dial up the intensity.  So instead of doing a lot of sets with longer rest times in the weight room, you do fewer sets, but with heavier weights, going to failure on every set, and typically resting for one minute or less between sets.  And instead of spending an hour on the elliptical machine, you do High Intensity Interval Training (HIIT), going all-out in short bursts.  This is difficult training, but the big up side is the time savings.  I'm typically able to finish a strength training workout in 45 minutes or less and conditioning workouts are usually around 20 minutes.  And since I'm able to train at home, I don't even lose time traveling to the gym.

Another interesting feature of the AX programs is that they feature regular "challenges".  These are workouts that include a scoring system.  There are a number of different levels - basic, solid, pro, elite, extreme - and you're supposed to score at a certain level (usually solid or pro) before continuing on with the program.  The idea is to two two things:

  1. Make sure that you're ready for the next phase.  The programs are progressive, so if you can't pass the challenge for the first phase, you're going to really struggle with the second phase.
  2. To provide you with objective feedback on your progress.  You can track and compare your scores each time you do a challenge in addition to comparing to the benchmarks for each level.  So it gives you a way to confirm that you're actually improving.

The frequency of the challenges depends on the program, but they're generally short, intense workouts that try to give you motivation to push yourself.  This is good in general, but at least for me, it's important to approach the challenges with the right mindset.  It's easy to psyche yourself out or get too focused on "passing" so that you lose sight of the helpful goal of gauging your progress.  Personally, I find the challenges to be more fun the second time - when I already know I can pass them and I'm more focused on improving on my previous score.

What Your Get For Your Money

So if you're about my age, you probably remember the good old days when workout programs would come in the mail and include a bunch of DVDs or even VHS tapes, along with some instruction booklets and so forth.  Well, nobody does that anymore.  These days things are 100% online and AX is no exception.  When you sign up, you'll get an email pointing you to their portal site where you can log in and access your programs.

The portal itself is fairly nice.  It has an adaptive layout, so you can easily use it on a phone or tablet.  The dashboard shows a link to the next day of your active program, but there's also a calendar that you can use to browse the workouts.  The workouts themselves normally include a demo video that walks you through the routine and shows you how to do the exercises.  Below that is a  nice listing of the exercises.  In addition to the sets and reps, each listing includes a link to a short demo video (ten seconds or so) of that specific exercise as well as buttons to track your weight and reps and to view your history.  For strength exercises, I find this very useful as a guide to choosing how much weight I should use and seeing if I'm making progress.  At the bottom of the page, right below the "mark complete" button, there's also a link to the "six-pack shuffle", which is an optional core workout for after you're done.  It's a short, randomized workout that runs between 4 and 8 minutes and has options to use various pieces of equipment or just body-weight.

Beyond the program itself, you typically get a bunch of extras in your portal.  The one that they like to advertise is the "meal plan", which comes with most of the programs.  It's nice as an example of the type of things you might want to eat, but it doesn't include any recipes!  It just lists the different foods for each meal - no measurements, proportions, or cooking instructions.  To me, that makes it kinda useless as an actual meal plan.  Also, a  meal plan seems to come with pretty much every program, but it's the same plan for all of them.  So to me, this is just a stupid marketing gimmick and I ignore it.

The "programs" portion of the portal also includes a "bonus" section with some extra stuff.  This includes things like articles, videos, and most importantly, some bonus challenge workouts.  These are nice things to check out when you're between programs and want a change of pace or if your schedule is off for some reason and want a few "filler" workouts to get back on track.  I've done a number of them and they're generally challenging and enjoyable.

It's also worth noting that you are able to download offline versions of the programs.  Sadly, they don't include the same content - you just get some PDF files listing the exercises in each workout.  No videos or anything like that.  Still, it's nice to have.  If you've been through a program once, then you already know the technique, so the listing is really the main thing you need anyway.

Program Reviews

Now it's time to get into the program specifics.  I don't claim to be an expert, but I've been doing the Athlean-X programs for about a year and a half now.  For the first year, I did four rounds of AX-1, which I mentioned in a previous post. This included all five of the "TNT plugins".  After that I did a round of AX-2 along with Core4, followed by two rounds of Xero and the Ultimate Abs bonus program.  I'm currently on my second time through AX-2.

I'll get into the details of each program below, but the "TL;DR" is that I've really been liking the Athlean-X programs.  Some are better than others, but I haven't done one that I didn't like and that I didn't feel like I got something out of.

AX-1 and TNT

 AX-1 is the "bootcamp" level AX program.  It's targeted at beginners, but let me be clear: this is not an easy program.  If you've already been training for a while, then it's not too bad - you'll get a good workout, but it won't be too challenging.  But if you don't already do regular strength and conditioning training, then it's a hard program.  And if you're sedentary, then it's probably going to be really hard.

When I started AX-1, I was already in what most people would consider "decent shape".  At that point, I'd been doing light home calisthenics (though nothing organized) for about 6 or 8 months and was down to around 175 pounds.  I also did (and still do) karate practice twice a week, which is a pretty good cardio workout (at least it is the way we practice - apparently that's not the case for every school).  However, my first time through AX-1 was pretty brutal.  For instance, the first time I did the "bumps and jumps" conditioning workout, which is just 20 minutes of burpees and box jumps, I was drenched in sweat and felt like my heart was going to explode.  I was lucky to make it through my shower without passing out.  Of course, it's possible to modify the program or dial down the intensity, but the point is that if you're not already an athlete then this is a hard program.

The program is broken into three four-week phases with a challenge at the end of each phase.  The phases are progressive, so each month the exercises get more difficult and more intense.  The schedule is five days a week with two rest days on the weekend.  You do strength training Monday, Wednesday, and Friday with conditioning on Tuesday and Thursday.  Note that it's a different workout pretty much every day.  There are a handful of repeats, and obviously a lot of the same exercises, but you're not repeating the same workouts every week, or anything like that.  This is true of the AX programs across the board.  They're very good about keeping things fresh and interesting.

In terms of equipment, AX-1 has minimal requirements.  So while you can do it in a gym, you don't have to.  In fact, you can probably get everything you need for less than $200, if you look in the right places.  You need:

  • Adjustable dumbbells.  Powerblocks are nice, but I use the old-fashioned screw-lock type and they work just fine.
    • Note that you'll probably need a set that goes up to at least 50 pounds for each hand.  You're probably not going to be curling or pressing that much any time soon, but the more common 20 pounds-per-hand sets probably won't be enough for a lot of the back and leg exercises.
  • A set of resistance bands.  You'll want a variety of resistance levels.
  • A physio ball.
  • A pull-up bar.  The doorway ones are fine.
  • (Optional) An adjustable bench.
    • If you don't have one, it's possible to lay on the physio ball instead.  However, I found that this gets harder as the weight you're using increases.  I found that once I got up to about 35 pounds or so, trying to do a bench press on the physio ball became really difficult.  It was just too hard to get into and out of position while maintaining control of the weights, so I had to get a bench.
  • (Optional) A yoga mat, or something similar.
    • How necessary this is depends on the flooring where you train.  It's definitely necessary if you have to train someplace where there's carpeting (because the plank-style exercises will give you rug-burn on your elbows otherwise).  It's also helpful for lying ab exercises if you're training on a hard floor, just because it's more comfortable.

While some of the exercises do call for other equipment, pretty much everything else can be improvised.  For instance, the inverted rows that are introduced in the first week.  In the video, Jeff uses a barbell bar across a pair of saw horses, but you can use pretty much anything you can fit underneath that will support your weight.  I use a broomstick across the backs of a couple of chairs.  You can get underneath a table or counter overhang - whatever you've got.  One of the bonus features for AX-1 gives a bunch of examples of how to improvise replacements for gym equipment just using things you have around the house.  Jeff goes out of his way to remove the "but I don't have X" excuses for not doing the exercises.

In addition to the base program, you can buy TNT plugins.  These are targeted muscle group workouts that integrate into AX-1.  They have ones for back, shoulders, chest, biceps, and triceps.  You can have up to two TNT plugins active at once and when you activate one, the AX portal will automatically integrate it into your program.  Each TNT adds one workout per week.  If you do one, it will add it on a rest day.  If you do two, one will be on a rest day and the other will be doubled-up with a conditioning workout, so you still get one rest day a week.

Each TNT includes two workouts - a "home" workout and a "gym" workout.  In both cases, the format is similar to a regular AX-1 workout, but the video is a full-length walk-through where Jeff runs through the entire workout in real time - all the exercises, all the sets.  The main difference between the two versions  is the equipment required.  However, even the gym workouts can mostly be done with the same equipment as the main AX-1 program.  I was able to do all of the "gym" workouts at home - I just had to adjust some of the exercises, for instance substituting dumbbells for barbells and resistance bands for a cable machine.  The recommendation is to switch between the two versions, which gives you a little more variety.

I did all five of the TNTs and in terms of effectiveness I found them to be helpful.  They're not indispensable, but if you're looking for an easy way to bump up the intensity of AX-1 a little, they're a good addition.  The workouts are good and Jeff provides some good information in the videos.  Whether they're worth the extra cost kind of depends on how much you can afford, but if money isn't a big issue for you, then I'd recommend them.  However, AX-1 by itself is pretty intense and very effective, so if you're new to training then you might want to save the TNTs for the second or third time through.

AX-2 - "Athlean Extreme"

This past summer I moved on to AX-2, or "Athlean Extreme" as Jeff refers to it. This is supposed to be the "professional athlete" level training, and Jeff actually does get some professional athletes to help with the demonstration videos.  (No big names or anything, but still professionals.)  The pace of this one is much faster - instead of a different theme and challenge for each month they have one for each week.  And the challenges are, in fact, pretty challenging.

The format is a little different from AX-1.  It varies a bit from month to month, but the strength training workouts generally follow a "bro split" - chest and triceps on Monday, back and biceps on Tuesday, rest on Wednesday, legs on Thursday, shoulders and rotator cuff Friday, and then the challenge on Saturday.  The workouts tend to be more complex than in AX-1 as well, with lots of combinations of movements, supersets, and various more advanced techniques.  However, the equipment requirements are mostly the same (I think there's one workout that actually requires a barbell to do correctly) so it's still relatively easy to do at home.  There are also some conditioning workouts sprinkled in as well, but there's not as much of the HIIT cardio as in AX-1.  Much of the conditioning effect seems to be folded into the challenge days and reduced rest times for the strength workouts.

I do have two complaints about AX-2.  The first is that the "different phase every week" thing is a little much.  It's nice to have variety, and you do learn a lot about different techniques and ways of training (definitely watch the phase explanation videos for this program), but it's very hard to judge progress when you're doing something different every week.  I'm also not crazy about the "challenge every week" thing.  As I said above,  when you're going through a program for the first time the challenges can make things a bit more stressful and less enjoyable.  So while AX-2 is still a good program, it's not my favorite.

Core4 Abs

When I started AX-2, I also started Core4 Abs along with it.  This is kind of an interesting one.  It's a dedicated core training program with each session averaging 15 minutes or less.  Each workout includes exercises to target each of the four main core muscle groups - upper and lower abs, obliques, and lower back/glutes.  The videos include a lot of focus on form and activating the correct muscle groups.  The way it's built in their web portal is quite nice as well.  You can choose from one of four "levels", which adjusts the difficulty by varying the exercise type and/or duration.  You can also choose to use Core4 as your post-workout ab session.  This basically substitutes it for the "six pack shuffle" that's recommended at the end of each workout, which is pretty nice.

Like AX-1, Core4 is divided into three month-long phases, each with a different focus and with a challenge at the end of the month.  The videos have a lot of good information, which I think is one of the main benefits of this program - it doesn't just show you the exercises, it teaches you the proper way to do them and why it matters.  I would recommend it just for that.

My main problem with Core4 was the time commitment.  While the individual workouts are pretty short (though the challenges are a little longer), they do generally run in the 10 to 15 minutes range rather than the 5 to 7 minutes that the six-pack shuffles run.  Plus there's the time to watch the videos (which you really should do), so I found that they often pushed my training times over an hour.  That's not super-long, but for me the short training times is one of the best things about AX, so that's something to take into account.

Xero

After AX-2 I did two rounds of Xero, the AX body-weight program.  I decided to do this because we'd planned to spend some more time visiting family and getting away from from the house in the fall and it's billed as "requiring zero equipment", so I could do it on the road  That's mostly true - there are a couple of workouts that involve inverted rows or pull-ups, but they have you doing them with tables and door frames rather than bars.  Personally, I kind of think that's cheating, but its not a huge deal - I just used my usual equipment anyway.

Let's just say up front - Xero is tough.  When the pandemic hit, AX started advertising Xero pretty hard because the gyms were closed.  By the time I started it, they'd "upgraded" it with two additional mini-programs (which I didn't look at) - "Two Below Xero" and "One Below Xero", which are preparatory programs for the main Xero program.  This was probably necessary, because I can't imagine going from not working out to doing Xero.  Frankly, it sounds like a recipe for failure.  I mean, I did AX-1 and AX-2 first and I still had a hard time with Xero.  In particular, the the last week's conditioning workouts left me feeling like I was about to pass out.

In terms of the actual program, Xero is only a six-week program, but it has a challenge every week.  Like the other programs, there's plenty of variety, but it's not too much.  The schedule is fairly regular, with total-body strength training workouts on Monday and Friday, conditioning on Tuesday and Thursday, and the challenges on Saturday.  It also includes what they call "xero-sum progression", where the strength training workouts are repeated, so you can track the number of reps you're doing easily see your progress.

Personally, I found Xero to be very effective.  I feel like I made more progress from Xero than I did from AX-2.  For me, it had enough variety to keep it fun and interesting, but enough consistency to make progress clear and keep me motivated.  The main caveat is that some of the exercises are very demanding.  In fact, some of them are probably non-starters if you aren't already fairly strong.  For me, the most challenging were the hand-stand pushups (they're done against a wall, but still very hard), the plank power-ups, which require a lot of tricep strength, and the ninja tuck jumps, which actually require some technique practice to get a proper rep out.  The workouts also tend to run longer than other AX programs, especially in the last couple of weeks, when they can run over an hour.  Of course, this is kind of inevitable for calisthenics workouts, since without external weights the only way to overload your muscles is with harder exercises or more reps.  But overall, I really liked Xero and highly recommend it.

Ultimate Abs

Lastly, a few words about Ultimate Abs.  This is a six-week bonus program that got for free as a bonus when I purchased Xero (there was a special deal on at the time - I forget the occasion).  I don't think it's sold individually.  There are several other bonus programs that get included as give-aways, but this is the only one I've done so far.

Ultimate Abs is a bit different from the regular AX programs.  For starters, there are no videos.  The workout page has the same kind of text and short demos as the regular workouts, but no walk-through.  You just have to read the couple of paragraphs of description to know what to do.  You also can't set it as your main workout - you have to get to it from the "bonus" tab under your programs.  And you can't set it as your ab workout like you can with Core4 either.  So the integration isn't there and there's not as much content.

The workouts for this particular program are a bit different as well.  Ultimate Abs is obviously an ab training program, but it focuses mostly on weighted exercises.  There two workouts per week, one long and one short, both of which are repeated for a total of four training days per week.  The workouts are pretty tough, but don't require any more equipment than AX-1 does.  

Overall, the program is decent.  Not as good as Core4, but not bad.  The workouts are tough, but there's not really much information included.  It also requires some scheduling, as it seems like it could be a drop-in replacement for the six-pack shuffle but really isn't.  The "long" days can take upwards of 30 minutes, so doing it right after a strength training day is tough and really stretches out the workout.  I ended up shifting the schedule to do the long days on Sunday and Wednesday, so I was doing them on the scheduled rest days for Xero, which I was doing at the same time.

So overall, Ultimate Abs wasn't bad, but you get what you pay for.  If it's offered with a program you already wanted, then great.  Go ahead an give it a try if you feel like something different.  But it's definitely a second-class citizen compared to Core4, so don't go out of your way to get it.

Changing the display manager in Ubuntu

Just as a quick note to my future self, if you want to change the display manager in Ubuntu, you just need to run the following:

$ dpkg-reconfigure gdm3
$ systemctl restart display-manager.service

The reconfigure will bring up a menu that allows you to choose from the installed display managers.  There's a nice summary with pictures here.

If anyone cares, the context here is that I run Ubuntu 20.04 with the Trinity Desktop Environment on my home destkop/server.  The problem is that pretty much every time I run an upgrade on that box it resets the display manager from TDM back to the default GDM. 

This is actually a really big problem because GDM doesn't work on this box.  Aside from the disk drives, most of the hardware in this box is about 10 years old.  So the video card is sufficiently archaic that GNOME just can't deal with.  When I try to log into GNOME or even just use GDM, I end up with massive display corruption and the desktop is basically unusable.  

One of these days, I should really replace that computer.  Or maybe rebuild it.  Or possibly just relegate it to purely headless server duty and get a different box to use as a desktop.  One day....