When online courses go wrong

So I'm getting up to speed on go-lang for a project I'm working on.  Since my company provides us with access to PluralSight, I've been going through the courses and projects in their Go pathway.

So far most of the courses have been pretty decent.  However, the projects are a different story.  The first one I did was fine - not particularly enlightening, but OK.  The second one, the Go CLI playbook, to be perfectly frank, is garbage.  At least, the first module is garbage.  I can't really speak to the rest because I can't get past the first module.

Now, in my own defense, it's not like the first module is hard.  In fact, it's completely trivial.  It basically comes down to "run go env > module1.txt ; go env -json > module1.json and then submit the result.  It even comes with a test file you can run locally.  So far so good.

The problem is, it doesn't work on Windows.  Like, doesn't work at all.  For starters, if you're running Powershell, output redirected to a file defaults to UTF-16 encoding, which is standard for Windows, but not for Go apparently.  Second, the go env command generates environment variables in an OS-specific format.  On Windows, that means it generates a file that can be consumed by cmd.exe.  Which is fine, except the project test file blithely assumes that the environment file is going to be in UNIX shell format, so the "set" at the start of each line makes it choke.

Well, that sucks.  Guess I'll just use WSL.  When I run the commands there and run the tests, they pass.  Great!  Let's upload the result and get on with our lives.  Except that doesn't work, because the tests fail when run in PluralSight's validator.  I don't know why.  My best guess is that something in the upload process is mangling the encoding.  I do know that it apparently doesn't run the test file you upload, so you can't hack around whatever the bug is.

The worst part is that you can't progress to the rest of the project until you "pass" that section.  So I'm pretty much just out of luck.  Maybe the rest of the course has some great material.  Or maybe it's equally useless.  Who knows?  Maybe it's just this project - so far the others I've tried have been OK.  Although I did have one other module where all the tests passed locally, but failed on upload.  But in that case, I at least had a legitimate bug in my code.  Why the tests passed locally is a different problem, though....

Powering down an old friend

I made bunch of purchases on Prime Day this year.  Among them was a replacement for my old home server, dubbed "Tallgeese".  Yes, I still use the same Gundam Wing naming theme I've had for like 20 years (if it ain't broke, don't fix it).  In fact, I've been using the name "Tallgeese" specifically to refer to my current non-laptop PC, whatever that happens to be, for a very long time.

Front view of the old TallgeeseBack view of the old Tallgeese

This box has served me well for over a decade.  It holds a special place in my heart because I built it myself from parts and upgraded it over many years.  The oldest part, by far, is the case.  I'm not 100% sure when I got that, but I think it might be the replacement for the broken one I referred to in this post from April 2005.  After that, the motherboard and CPU are quite old - I got those in September 2010.  The rest of the pieces are probably newer, but I don't really remember when they were replaced.

Now that I look at it, the specs on this box aren't actually that bad, even by modern standards.  Granted, they're still sub-par for anything made in the last five years, but it's still got enough horse-power to do useful work.  It's got a 4-core processor, the motherboard is maxed out at 8GB of RAM, and it has just over 4TB of storage.  As a media server, it actually works just fine.

The old Tallgeese CPU and motherboard.  It hasn't been cleaned in a while.

But on the other hand, you can also tell its age just by looking at the hardware.  For instance, that PCI card near the bottom is a sound board - a relic from the bad-old-days when Linux users needed to actually care about what kind of sound cards they bought if they wanted audio to work properly.  You can also see an internal media card reader in front with a crap-ton of slots - another relic from before everybody had settled on SD and microSD.  And you can't miss the two DVD drives - a DVD-ROM drive and a DVD+RW drive.  One of them is broken, but they're so irrelevant by this point that I no longer remember which one.  And we can't forget the serial, parallel, and PS/2 ports.  I don't even remember how long it's been since I used a PS/2 mouse or keyboard.  (For those too young to remember: "PS/2" is for the IBM Personal System/2, not PlayStation 2 - though that's old now, too.  And while I still have a PlayStation 2, I never has an IBM PS/2 - we had a PS/1 instead!)  The pictures also don't show the VGA-to-HDMI dongle I had to use for video to get it to connect to my main monitor, which never really worked well anyway.  When everything was plugged in, the back panel was actually kind of a disaster area.

Of course, just "being old" isn't really enough reason to get rid of a perfectly good box.  Like I said, it still works.  At least for now.  But it's been plagued by occasional stability issues, particularly when I tried to do anything that involved graphics (e.g. playing Battle for Wesnoth, which isn't exactly the most graphically demanding game in the world).  It would occasionally just lock up for no obvious reason.  It's also a big, clunky box that's kinda loud and generates a lot of heat.  And most of the components are old enough that it doesn't even make sense to try and mitigate these short-comings.  It's cheaper and easier to just buy a new box and slap my preferred software on it.

The new TallgeeseMkII, with data drive enclosure and some size context.

So I ended up buying this little guy, which I'm dubbing "TallgeeseMkII" - that was the version with the blue trim in the cartoon.  Since it was Prime Day, I actually ended up getting the model with 16GB of RAM and the 512GB disk for about the same price.  It's got considerably more horse-power than the old box and the case is actually smaller than the external 3.5" drive enclosure I'm using to house the 4TB data drive from the old Tallgeese.  The entire setup will fit comfortably under one shelf of my new desk (which is another post).  For context, I included my Huey Games Droid Assault "cassette" (actually a USB drive, but shaped like an old-school cassette tape) and the wood-block panda painting my brother did for me.  For context, he originally started doing them that size because they were being sold out of repurposed vintage cigarette machines.  So yeah, significant space savings here.

But as I said, the old Tallgeese lives on, at least in the form of its data drive, which was relatively new and still perfectly good.  I also pulled out the OS drive, since that was still good and it's easier to just stick that in a USB enclosure to grab any config or files that I need than it is to get them from backups.  I doubt I'll be using it for much else, though - while it is an SSD, it's only 120GB.  But some of the files from it will live on, so I guess that counts for something.

Finally switching to NextCloud

It's the end of an era. (Cue overly dramatic music.)  I've been using ownCloud as my personal file/caldav/carddav server for years.  This week, I finally decided to switch to NextCloud.  This is my story.

The thing is, I actually remember when NextCloud split from ownCloud.  At the time, I was working on a (now-defunct) product that involved ownCloud.  Basically, my company's core business at the time was data backup, so we had a lot of servers with big disks and were looking for a way to monetize that extra space.  The idea at the time was to do that by integrating a "file sync and share" product into our offerings, and that product was a rebranded ownCloud Enterprise.  Of course, the "file sync and share" space was already pretty crowded, so that product never gained much traction, but it did help me get more into ownCloud and the company even paid to send me to their user conference in Berlin, where I got to meet their team (who, at the time, seemed not-very-impressed with the whole "NextCloud" thing) and see some sites.  So it was actually a great experience, even if the product didn't pan out.

Anyway, despite my affection for ownCloud, my motivation for this change was actually pretty simple and prosaic - I was upgrading my home server (that'll be another post), and I didn't want to downgrade shit.  See, I actually run two ownCloud instances - one on my local network for accessing various media files, and another in my web hosting, for caldav/carddav and files that I want to be highly available.  For my home instance, I was doing a fresh install of the latest Ubuntu MATE on  a brand-new box.  This shouldn't be an issue, except that MATE comes with PHP 8.1, but for some reason, ownCloud only supports PHP 7.4.

Yes, you heard that right - 7.4.  That's the newest version that's officially supported.  The last 7.x release.  The one that's no longer actively supported and has less than six months of security updates left.  That one.  That's what they still expect me to use.

For my previous home box, I believe I'd actually hacked up the source a bit to make it work (since I don't think I depended on anything that didn't work in 8.x), but week I was sick and I just didn't feel like it.  Depending on a version that's about to lose security fixes is crazy anyway.  So I figured I'd "upgrade" to NextCloud, since they actually recommend PHP 8.1.

For my home server, I just did a fresh install, which is fairly straight-forward.  The only annoying part was the Apache configuration, and that was only annoying because I was running NextCloud on a non-standard port and forgot to add a "Listen" directive. 🤦‍♂️ For this instance, there was no real need to do any migration, because the only data I had in there was the (very small) list of users - the rest was just files, which can be trivially re-indexed.

Upgrading the instance on my web hosting was another story.  Since that had my carddav and caldav data, I really did need to migrate that.  I was also already several versions behind on my updates - it was running ownCloud 10.3, whereas 10.8 was current.  However, this turned out to be a blessing in disguise.

You see, NextCloud includes support for migrating from an ownCloud instance.  The thing is, they only support specific migrations.  In my case, the relevant case was that you can migrate from exactly ownCloud 10.5 to NextCloud 20.  Sadly, it took me a couple of tries to realize that the version migration matrix are exact, so there was no path to directly migrate from ownCloud 10.3 to NextCloud.  So I had to use the auto-updater to update ownCloud 10.3 to 10.4, and then manually update ownCloud 10.4 to 10.5 (because the auto-updater wanted to go all the way to 10.8).  Then I could follow the migration process and manually update to NextCloud 20.  From there, I was able to use the NextCloud auto-updater four times to upgrade to the current version.

So the upgrade process was...tedious.  Not really "hard", but definitely tedious.  The directions are pretty clear and simple, it's just a lot of steps to get to a current version of NextCloud.  But at least none of the steps were particularly complicated or prone to error.  As data migrations go, it could be much worse.  And the best part is that it maintained URLs and credentials, so I didn't even have to reconfigure my caldav/carddav clients.

As far as NextCloud itself goes, it seems...pretty much like ownCloud, but nicer.  They've made the UI prettier (both for the web interface and the client app), added a nice dashboard landing page, and made some other cosmetic improvements.  They also seem to have a wider range of installable apps, which is nice.  I haven't had all that long to play with it yet, but so far it seems like a distinct upgrade.

Duet Air is pretty cool

A while back, I posted about a tool called Duet, which allows you to convert an iPad or Android tablet (or even phone) into an external laptop display.  It actually works quite well, and allows you to use either WiFi or USB connections for your tablet monitor.  It also support using the touch screen on the tablet to control your desktop, which is pretty cool.

However, I did eventually discover an issue with it.  It seems that, on my work laptop (but not my personal one), the "energy efficient" setting doesn't properly support all resolutions.  It's a really weird bug, as the other two performance settings ("high power" and "pixel perfect") both work fine, and everything works fine on my personal laptop, but "energy efficient" only works when the resolution is set to maximum on my work laptop.  On the up side, their support people have been very responsive and I can just use a different setting, so it's not a big deal.

Anyway, as part of trying to collect more info on this bug for Duet's testing team, I signed up for a trial of Duet Air to see if I could reproduce the issue through that (spoiler: I could).  Duet Air enables Duet's "remote desktop" feature, which allows you to use not only mobile devices, but other laptops as external displays.

It's actually a pretty slick feature.  You just create an account and sign into all of your devices with it.  Then you can go to the "remote desktop" tab in Duet and choose the device you want to connect to.  The paradigm is that you use the "display" device to select what you connect to.  So, for example, if I want to have four monitors for my work machine, I can open up Duet on my home laptop, select my work laptop, and the home laptop becomes a wireless display.

So far, it's working pretty well.  It's easy to use and set up, performant, and it's a tool I'm already using.  It's also fairly cheap at $25/year.  I think I'll probably continue using it after the trial.

Poor man's home intercom

A few weeks ago, I decided to set up a DIY home intercom system.  This was motivated by the fact that my son has been doing home-school and we set him up a workspace in the basement.  This isn't a problem per se, but my wife usually doesn't go down there with him if he's doing independent work, which means there's often yelling up and down the stairs.  This is, shall we say... somewhat distracting when I'm trying to work.

I did a little searching for intercom systems, thinking I might buy some hardware, but decided that looked like too much work.  We'd have to find a home for it, and then you might not hear it if you were on the other side of the house, unless I put them everywhere, which is an even bigger pain.  Besides, it seemed like there should be an app for that.  And since we pretty much have our phones close to hand most of the time, that would be more convenient than dedicated hardware anyway.

Turns out there is an app for that.  A number of them, actually.  The one I decided to go with was Zello, which is a fairly simple walkie-talkie app.  I went with this one for a few reasons:

  1. The mobile app is free, at least for personal use.  (There's a PC version too, but that's only for paid corporate accounts.)
  2. It's in the Amazon and Google Play app stores.
  3. It's easy to set up.
  4. It's really easy to use.

The setup process for Zello was pretty basic.  For my son, I decided to just put it on an old Kindle Fire that I had laying around.  It can just sit on the desk, plugged in and ready to use whenever we need to talk to him.  My wife and I just put the app on our phones.  From there, you just create an account (which only requires basic information) for each device using the app, and then send a contact request to the other accounts.  Once your request is accepted, that person will appear in your contact list.

Actually talking to other people is even simpler.  You just tap on the person's account from your contact list and then you get a screen with a great big "talk" button in the middle.  When you want to talk to the person, you just press and hold the button and start talking, just like an old-fashioned walkie-talkie.  When you're done, you release the button.  From what I can tell, the connection is not in real-time - it seems like the app records your message and then delivers it, so you are less subject to the vagaries of the network.  But barring networking issues, the delay seems to be pretty short - a few seconds in most cases.

The app also has a few other features, including very basic text messaging.  There's also a "channels" feature, which I haven't used yet.  That's their "group voice chat" feature.  Presumably the idea is to mimic a dedicated frequency for a CB radio.  The primary use-case for the commercial version of Zello seems to be for fleet dispatchers, so the interface seems geared toward a simple replacement for a traditional radio system.

Overall, the app works pretty well.  It was easy to set up and it has definitely saved some frustration in terms of yelling back and forth across the house.  Also, my son seems to like using it.  He even ends is messages with "over and out".  So I count this as a win.