While new versions of Fedora have been pretty darned stable for a few years now, I usually wait a while after a release to upgrade. This year waiting ended up turning into just leaving it alone. But with February half-way done, we’re actually starting to get kind of close to the Fedora 34 release date. So I figured President’s Day was as good a day as any to do the upgrade.
Years ago, I became interested in a music player called Tomahawk. The latest package I had was a Fedora 31 package. This was causing the upgrade to fail because it needed an older library to stick around. Since I haven’t used Tomahawk since a month or so after writing that article (about 5 years ago), I just did a dnf remove tomahawk. That also got rid of some dependencies that were probably just sticking around for that package.
The more complicated issue was summarized by dnf as: package python3-pytest-relaxed-1.1.5-10.fc33.noarch requires (python3.9dist(pytest) < 5 with python3.9dist(pytest) >= 3), but none of the providers can be installed. For that one I tried it with –allowerasing. That allowed the upgrade to go on.
After that it was 6GB of packages to update (thankfully I’m not on a metered connection) and then a reboot. If nothing goes awry, this’ll be the only post related to upgrading my main computer to Fedora 33. The only holdout now is my oldest’s laptop, but I think I’ll do that one today, too.
Brave didn’t last very long for me on Windows. I just don’t do enough on there to make use of their ad blocking and ad replacing tech. On the other hand, I’ve been using more and more of Vivaldi’s features. I just started using their Web panels – this allows you to have a web page on the left that loads up in a small section – great for pages that you would like to reference here and there without cluttering up your tabs. I’m using it on my Windows computer to keep some Web panels with notes on what I’d like to do in some games – like Civ VI, Darkest Dungeon, and Cities Skylines.
Meanwhile, on Kuribo, one of my netbooks, I’ve moved to using Qutebrowser. This is the same netbook where I’m using Qtile as the Window Manager. Qtile is working very well for this since it maximizes all windows and allows me to be keyboard based. Qutebrowser (like QTile is also programmed in Python) is also keyboard-based with lots of vim keybindings. I’ve only just started using it, but with how annoying it it to use the mouse on this netbook, it’s great using a keyboard based web browser.
Over its long tenure as a band, Five Iron Frenzy has had some really silly songs. Songs like “Arnold, Willis, and Mr. Drummond”, “Oh, Canada”, “Blue Comb ‘78”, “The Untimely Death of Brad”, “Where is Micah?”, and many others. But they’ve also always been a really political band. On their first album, Upbeats and Beatdowns, they had the song “Anthem” which spoke about politicians wrapping themselves in themes of nationalism. “Milestone” also dealt with racism and prejudice. “Beautiful America” tackled both politics and another constant theme across FIF’s albums – rampant capitalism. Over the rest of the discography there was:
Banner Year – mistreatment of Native Americans
Most Likely to Succeed – doing anything to become rich
Get your Riot Gear – about police abuse
Giants – rampant capitalism
The Day We Killed – mistreatment of Native Americans
American Kryptonite – rampant capitalism
Zen and the Art of Xenophobia – racism, nativism
Someone Else’s Problem – looking the other way at how capitalism means exploitation
Until recently, I didn’t know this was a historical trend in Ska music. At the time I discovered Five Iron Frenzy, I didn’t listen to secular music. The Supertones and The Insyderz were more concerned with themes of Christianity. When I did start listening to all music, I didn’t see much political in any of the No Doubt songs that made it to the radio. It wasn’t until years later that I heard all of The Mighty Mighty Bosstones’ Let’s Face It album which has a song against racism and two songs against drug use.
All of that preamble is to say that Until This Shakes Apart is a deeply political album. I’m not sure Reese, Dennis, and Scott could have written anything else in the shadow of the Trump presidency. Overall, the first impression I got from listening to the album was that it was definitely a darker album with lyrics that would sometimes make me a bit sad that we were still dealing with these issues in our country. As I continued to listen, I’ve definitely come away feeling that some of these songs will end up being in my top 10 Five Iron Frenzy songs. I was a Kickstarter backer on this album and so I’ve been listening to it for nearly a week now. Here are my thoughts and impressions on the individual tracks:
In Through the Out Door – A song about xenophobia. Contains a great reference to Gil Scott Heron’s “The Revolution Will Not be Televised”. More towards the rock with horns sound that Five Iron Frenzy (and many other 90s ska bands – like the Rx Bandits) has mostly moved towards.
Lonesome for Her Heroes – A song about a lack of regard for the environment and rampant capitalism, including gentrification. After the previous song being such a strong rock with horns song – this one is a return to a classic ska sound. I don’t know enough about the history of ska to place its era, but it definitely has a different sound than the Third Wave Ska of the 90s. It seems to mix a bit with an older style.
So We Sing – This was the song to advertise the Kickstarter. It’s a real banger that I’d love to hear live when we start being able to go to concerts again. Lyrically, it’s somewhat of a spiritual successor to “See the Flames Begin to Crawl”. Love the reference to Peter Pan/Captain Kirk at the end of the chorus. Back to rock with horns.
Bullfight for an Empty Ring – another political one that tackles lots of issues, but mostly the hypocrisy of Christians who are aligned with the political right in America. Ska-punk with a bit more emphasis on the punk part.
Renegades – this time about the politics of gun control as well as once again excoriating Christians who support the party of guns all over the place. Once again a journey to a more traditional ska sound, but with some interesting effects on the track.
Tyrannis – A song against the continued existence of those who build monuments to the losers of the American Civil War. Very strong, fast-paced rock with horns.
Auld Lanxiety – A spiritual successor to songs like “At Least I’m Not like all those Other Old Guys” and “Battle Dancing Unicorns with Glitter”. It’s about getting older and nostalgia. Unlike those songs, the theme is a little less in your face. I really like this song a lot with its music falling halfway between ska and rock with horns. It’s got great backup vocals that work so well.
Homelessly Devoted to You – the first purely fun song on the album. It reminds me a bit of “Vendetta!” from Reese’s side band, Roper. Another good mix of ska and pop music sensibilities.
One Heart Hypnosis – About being obsessed with social media and getting likes (hearts). Reminds me a bit of “Beautiful America” from Upbeats and Beatdowns. Once again contains a mix of ska and pop/rock music.
While Supplies Last – This one has to have been written during the COVID lockdown as it mentions hoarding of Lysol and diapers. Another song about the hypocrisy of the Religious Right and the fact that they aren’t actually acting as Jesus would. Strongly ska – almost throwback to 1st or 2nd wave. (I don’t know enough to be able to nail it down – but there’s definitely a stronger reggae sound to it.) That said, it does go a bit more into hardcore territory near the end (A la “Fistful of Sand” in Out Newest Album Ever!)
Wildcat – a song about blue collar workers. Definitely back to rock with horns.
Like Something I Missed – I can’t tell just from the lyrics if this is meant to be a couple that’s gone beyond being able to come back together or are just at a very low point in their relationship, but I *love* the chorus with “I need a low dose of you believing in me/ I need a sheet cake made of victory”. It’s sung with such emotion and it’s definitely how I feel sometimes, whether that’s at work or with various relationships. Once again rock with horns. Musically it reminds me of what they were doing on The End is Near, particularly “It was Beautiful”.
Huerfano – A spiritual sequel to “Suckerpunch” from Our Newest Album Ever!. It’s about being bullied and the chorus is a call to come together with others and be hopeful. Sonically – rock with horns.
Listening to it again as I wrote this, I have to say that my favorite song is “So We Sing” followed by “Homelessly Devoted To You” and “Auld Lanxiety”. I like a lot of the other songs, like “Like Something I Missed”, “Bullfight for an Empty Ring” and “Lonesome for her Heroes”. But this is probably not an album I’d listen to a lot in order because it’s just so depressing to remember where we were at in 2020. The older I get (and I think Roper’s around 10 years older) – the more frustrated I get at how long it takes to move society in the more progressive direction. We’re still fighting forces that would take rights away from women or folks who don’t look like them. We’re still so far from finding a post-scarcity society like Star Trek. Almost everything I hate about social media has to do with putting short term profits over the health of the world. Shoot, even the police situation is still a mess.
So, it’s a good album. No, it’s a great album. If it’s not their best, it’s in the top three. I’m glad Reese turned these thoughts into music. Like the political songs he (and the others in FIF) wrote before, they’re important. And they may use the power of music to move folks to action. But some days I need the music to be an escape. So I’ll listen to my favorites and save the whole album listen for when I’ve got the stamina for it. May the next album find us all in a better place.
It’s been a pretty busy 2 weeks. I’ve basically either been finishing up end of year blog posts or programming. Let’s jump in!
Extra Life Donation Tracker
I have the 5.3 release of my Extra Life Donation Tracker. I had a few minor refactoring goals for that release, but also a few user-facing enhancements. I added in the ability to grab the user’s avatar as well as their team’s avatar. They can now use that as an input in either XSplit or OBS. During these two weeks I also fixed a user-reported bug on crashes if a donor had emoji in their name. Oh emoji, you’re the bane of my programming existence!
On the more developer side, I decided to get rid of the devel branch. Others online had told me it was a bad idea to have 2 long-running branches. It’s been less of an issue since there really isn’t anyone else developing with me. But, it was really there as a stopgap before Github’s CI system came out. I started to realize there wasn’t really any point to it. When I would work on a new branch, I would run a bunch of Pytest against it and the CI system would create a Windows executable I could use for testing. So having a separate devel branch no longer made sense.
I finished the English Civil War chapter and learned a bit more about encryption and Python. You can see my solutions and what I learned on my Github repo.
NASA Background downloader
I’m sure there are tons of scripts in every language to accomplish the same thing, but I customized mine to the way I work. Essentially, each day I go to NASA’s image of the day. I download the image and analyze whether it’s square, long, or tall. Based on that, I put it in the proper backgrounds directory. As you can see, I like to use it on my main desktop:
I’m not quite ready to share the code yet as I’m still working out some of the kinks, but I hope it will soon help me to clear up some of the clutter in my news reader.
RTS Unity Game
Progress continues on the GameDev.TV online multiplayer RTS class I’m taking. Here’s a video with my latest progress:
As I said in my end of year programming blog post, I’ve learned a lot, but when it comes time to create my own online multiplayer game, I’m definitely going to have to come back and revisit this class. Luckily, a lot of the concepts are very repetitious. That helps both with learning and also with figuring out what to do. I’ve also learned how to do IPC in C# (or at least one way of doing it).
Scratch Jr with Stella
I really prefer vanilla Scratch to Scratch Jr. I really hate working on tablets. That was solidified today when I was trying to create a new character in Scratch Jr and the cursor kept being offset from my finger. That said, the book we’re using, The Official Scratch Jr. Book, is really well written. Next time Stella and I will be making actual games. That should be a lot of fun.
I last wrote about the software I’m using while programming back in March. I think at the time I was thinking of writing quarterly updates, but my preferences didn’t change with that much regularity. I decided to make it one of my annual posts instead. So here is the software I used in 2020 to program.
For my Python projects I transitioned fully to PyCharm Community Edition. I documented my reasons for moving towards Pycharm in this post with a followup here. As I was writing this, I learned of a Real Python guide to Pycharm that taught me a few things I didn’t know about how to make better use of PyCharm. PyCharm has made Python programming a real joy. For any libraries I have imported (or standard libraries), it provides excellent code completion as well as context for function or method arguments that saves me time vs looking it up in documentation. The git integration is also great and I’ve recently started exploring usage of the lower git window which may make GitQlient obsolete for my Python projects. I haven’t made the best use of the debugger yet, but I’m slowly learning how to take advantage of it in my larger projects. If you’re a Python programmer I can’t imagine a better IDE. I did have access to Pycharm Professional for a while in 2020, but I wasn’t doing any Flask or Django work, so I didn’t really notice anything useful over the community edition.
I use Mu when I’m working with Circuit Python for my Adafruit boards. Mu would probably be really awesome if I hadn’t started using Pycharm. It’s about equivalent to Kate as I’m using it in Fedora 32 (more on that in another section below). It will provide word completion for words that I’ve already typed, but has no understanding of the libraries installed on the board. Also, (and I have no idea if there’s a reason it’s implemented this way) I’d love it if the programming was a little more Arduino-like. That is so say, programming on my computer and then transferring it to the device whenever I asked it to. Instead, the default is to edit the code on the device and reload the device when I hit save. This means to save my files and put them under git control, I have to keep remembering to copy the file off the circuit board and onto my system.
This may seem that I’m really hating on Mu. Don’t view it that way. I’m merely wishing there was something with the power of Pycharm that could do what Mu does. Because Mu does provide some valuable services when programming in Circuit Python. It provides easy access to the board’s REPL without having to do any work to figure out how to connect to the REPL in the Linux console. It also provides the ability to graph outputs from within Mu. I used it quite a bit this year on my Circuit Python projects and expect to use it quite a bit in the coming year.
If you’ve read through this blog post in order, you know that I really love using PyCharm. So when I got back into C# programming with Unity this year, I figured I’d give Rider a shot. I blogged about my experience setting up Rider and Unity on Fedora (using flatpak). I didn’t end up getting much use out of it because Unity decided not to open my project once I added in the inputs plugin. In the end it doesn’t matter because, from what I can tell, Rider does not have a community edition. That is fine. I’m sure *most* folks programming on Unity are either real studios like Ghost Town Games (makers of Overcooked) or bedroom coders, since that’s a thing again thanks to the indie scene. JetBrains deserves to get money for their product. Since I’m not developing for money – just for fun – it doesn’t make sense to spend professional IDE money, especially when there are free IDEs that work just fine with Unity. IDEs like Microsoft Visual Studio.
MS Visual Studio
I continued to use MS Visual Studio on Windows when doing Unity C# programming. In the latest class I’m taking the professor is using Visual Studio Code, but the shortcuts seem to be the same, so I didn’t see a need to install VSC when plain old Visual Studio was working just fine. I’m just barely taking advantage of any of the Visual Studio features – definitely not using any of their git features. But it works perfectly fine. If I were doing my Unity programming on Linux, I’d probably use VSC since it’s cross-platform.
I didn’t do too much Arduino programming in 2020, but when I did – the classic Arduino code editor was just fine.
I really, really want to use Arduino Pro. It has a much nicer looking interface and is version control aware. That said, it’s still in alpha or beta and never quite worked for me in 2020. I always ended up going back to the classic editor.
In 2020 I mostly used Kate for learning Ruby. It’s also a lot faster and less complicated for my short Python programs than Pycharm. In fact, for short scripts, Pycharm’s project-focused workflow actually gets in the way. So I have used it a bit for short Python scripts as well as for the practice problems in various Python books. It’s always great for a shell script, too. However, I usually end up writing those in a vi clone. They almost never seem complicated enough to spin up a GUI program for.
Last March I mentioned that the Kate developers were working on making Kate more of a Visual Studio Code competitor. They were working on implementing a good LSP Client (if I understand correctly, this is what allows Pycharm to make suggestions based on the packages I’ve imported) as well as better git integration. As I write this, I still haven’t upgraded my main desktop to Fedora 33 and the LSP software needed to make this work with Kate and Python hasn’t been ported to Fedora 32. So I can’t speak to how well this works. I suspect it could only make things even nicer when working with these shorter Python scripts. As for other languages I’m thinking of learning, like Go and Rust, as far as I know they aren’t supported especially well in KDevelop. So if Kate ends up with better LSP tech, I may end up using it for those languages.
In 2020 I went all in on my conversion to becoming a vim native. I haven’t used Emacs in ages and vi or vim was always conveniently there on any server I sshed into. I started reading the O’Reilly Vi/Vim book that I got in a Humble Bundle so that I could get a little more proficient at the command line. I also set up powerline so that it could be a little more immediately clear to me which mode I was in.
When I was doing a lot of research into Vim, I discovered Neovim, which was developing at a faster pace (and more openly) than Vim. So I installed it to check it out. I should probably alias vim to nvim because I keep forgetting to use Neovim. I should also probably install a syntax highlighter like Semshi and maybe an LSP plugin. Right now, for *my* use case, I don’t really get any benefits over vanilla vim.
Chrome for MS Make Code
I’m including this only for completionist reasons. When MS Make Code is done in the browser and works best with Chrome (or a Chromium-based browser). So I used it when working on MS Make Code projects with the kids.
I touched this once or twice in 2020. I’m sorry to say I haven’t quite figured out what I’d want to do with github in the CLI that I wouldn’t want to go to the website for. If anyone comments with some use cases, things may change in 2021.
GitQlient continued to be useful to me for visualizing what’s going on with my most complex projects. Those have many branches, tags, etc. That said, at the moment, my most complex projects on Linux are Python projects. So I may start using Pycharm’s git features a lot more and GitQlient may fall to the wayside for a while.
On Windows I have fully moved over to Git Kraken for my git needs. There is really only one thing that’s a pain compared to SourceTree – starting up my repo. Unity doesn’t want to go into a folder that already has files. Git Kraken seems to have similar issues when I try to create a repo into a Unity folder. Outside of that, everything works great.
I continued to use Gitea to host code locally when I wanted to be able have a Github-like interface, but didn’t want the code to be public. For now, I continue not to see a need or reason to self-host a public Gitea instance instead of just using Github. Any contributors will already have a Github account and it’s just simpler this way. That said, Gitea continues to improve and add great features.
Continuous Integration/Continuous Deployment
As I did last year, I am still using Drone for CI/CD of my private code. It allows me to do automated checks with a clean environment upon check-in of my code. And for one bit of code, allows me to publish to PyPi.
I make heavy use of Github Actions on my big, public projects. It allows me to not only run unit tests, lint, and code coverage, but also to create binaries for Windows and push my code to PyPi. I don’t have any compiled code projects on Github yet, except for Unity. Apparently this exists. I think that would be interesting for cross-compiling for various build targets. I think it’d be interesting to see how well Github actions would work with Rust or Go.
Because the pandemic left me at home for a couple months, this year I played about double the amount of games from my previous record. You can watch the video below or read the text below that to find out what I thought of the games I played this year and which game I named as my 2020 Game of the Year.
Gwent (73 hours 24 minutes): Other than playing the beta a few years ago, the last time I played a CCG was Magic the Gathering back in the mid-1990s. I had no idea I would end up so addicted to this game for the first half of 2020. Eventually what took me away from the game is the fact that to maximize your experience with the game, you have to play every day. And I just have so many other games I want to play, books I want to read, the kids and wife to hang out with. I couldn’t give that much to a game. I do still have it on my rotation, so I get to it now and again. When I play, I find it quite fun, so I think Gwent will be with me for a while.
Darkest Dungeon (36 hours 20 minutes): I continued to have faith in Rogue-alikes and Rogue-lites to provide lots of entertainment for me. So I decided to grab Darkest Dungeon during a GOG sale. Darkest Dungeon is one of the most punishing in the rogue* bunch of games I play. FTL is just as hard, but Darkest Dungeon has the permadeath of customized and leveled up characters as in X-Com, making the deaths sting a little extra hard. Of course, the harder the game, the more rewarding when you succeed at a tough dungeon or boss.
Spelunky 2 (35 hours 15 minutes): The original Spelunky is one of those games that slowly grew on me over its existence. When Dan first introduced me to it, I mostly just found it chaotic and not much fun. But, by the time Spelunky 2 was announced, I was in quite a bit of anticipation for the release. Once it finally came out, it was a blast to learn the new mechanics and to play with the kids, who’d been honing their platforming skills on the original for a few months at that point. It’s interesting that lots of people have complained that Spelunky 2 is too hard when I’ve been able to consistently make it out of the caves (and even to Olmec) while I rarely made it past the grass levels in the original Spelunky.
Stardew Valley (28 hours 12 minutes): This year I continued working on finishing the community center. ConcernedApe also released an update that added fish ponds, giving me something else to work on while waiting for the fall to catch my last fish. Then, during the quarantine the kids (and eventually wife) started playing Animal Crossing. My eldest’s favorite thing to do was to beautify the island and that made me inspired to make my farm look a little nicer. So that became my new goal while waiting to finish the game.
Overcooked 2 (26 hours 30 minutes): This was one of those Humble Bundles that turned out to be a huge success. There are many times that I think a game in Humble Bundle will appeal to the kids, but it ends up flopping. This one, however, was a constant request from the kids until we finished the main game. They still ask to play some of the expansion packs now and again, but those can be pretty tough. The kids do awesomely for being 8, 4, and 4, but there’s only so much we can do. For me, most of the time it’s a huge blast unless one or more of the kids decide to grief the rest of us. Then it becomes intolerable.
The Baconing (26 hours 13 minutes): Somehow, most likely through Humble Bundle, I ended up with the third game in a trilogy in my Steam library. After all this time accumulating games, I decided I would need to be disciplined about playing new games the way I was with my reading or I’d never play any of these games. So I started going through Steam alphabetically and ended up here. I must say, it was a great game to come across early in this experiment. It’s a combination of a point and click adventure game and an action RPG with the humor of a Monkey Island game.
Civilization VI (23 hours 28 minutes): As usual, I played a lot of multiplayer Civ VI with Dan and Dave. There’s always something that draws me back into single player Civ VI. I’ve always loved it since the first Civ, but with the vast array of games I have thanks to Humble Bundles (and my kids now being old enough to ask me to play with them), I often forget about Civ. This year, with the new expansion pack coming out, I decided to try and win as Catherine the Great. After looking at her bonuses, I decided that I was going to try to win religiously or by tourism. Both are, in my opinion, among the harder win conditions. If nothing else, they tend to be later stage wins and you can end up getting beaten by someone who gets to a science victory or diplomatic victory first. I actually came close a few times, but Aminatore was my constant foe – pushing everyone around to me to Judaism and costing me victory that I might have had with just a few more turns. (Also talk about Cleopatra game)
Sonic Racing (17 hours 14 minutes): The majority of the time I’ve played Sonic & Sega All-Stars Racing with the kid occurred in 2020. For a chunk of time, it was their favorite thing to do every single day. We unlocked all of the characters and, eventually, all the tracks and music. We even moved on to the battle modes. While I think that Mario Kart tends to have better power-ups and a more chaotic and fun Grand Prix mode, I haven’t really enjoyed battle mode since the Nintendo 64. I think Sonic & Sega All-Stars racing has a more dynamic set of battle modes that made for more varied gameplay.
Super Mario 3D World (15 hours 58 minutes): I was looking for a Mario game we could all play and which I hadn’t already played, so I ended up playing Super Mario 3D World with the kids. I think this game is the perfect synthesis of the 2D games like New Super Mario Bros and the 3D games in the vein of Super Mario 64 and Mairo Sunshine. The 3D games tend to have an open area and almost infinite possibilities for traversal. This can be freeing, but it can also make it a lot harder to know exactly what to do. SM3DW, on the other hand, retains the general left-to-right progress of the 2D Mario games while just having a sections where the players go into or out of the screen. I think it provides a much clearer path for more casual gamers. I think I also prefer the golden tanuki to other Mario games where they just do the level for you if you keep failing.
Worms: Reloaded (14 hours 45 minutes): I used this game to introduce the kids to the Worms franchise and it led to quite a number of chaotic sessions. This game and the others Worms games we played in 2020 function as a great example of how the twins were better able to strategize as they went from 4 to 5 years old and more capable of understanding the consequences of their actions. At the same time, there are still moments when even Scarlett doesn’t quite look forward enough.
Cities: Skylines (14 hours 19 minutes): Before I say anything else, I want to point out just how incredibly beautiful this game is. Of course, living through the computer games’ young years to now, there’s been a constant improvement where each game has looked better than the last. I remember thinking that Sim City 4 looked “so real”. But this game, when you zoom all the way in, just looks like a real, working city. So, getting to this year’s game – it’s no surprise to me that the same publisher and developer who make Cities in Motion would make a city sim with more realistic transportation lines and a seemingly more realistic model for citizen flow throughout the city. Coupled with some expansion packs (DLC in modern parlance) I got as part of a Humble Bundle, this game truly allows you to make cities that are realistic on the level I *wished* Sim City 4 and the Travel Expansion pack had done (without needing fan mods). If there’s one thing I still am not truly taking advantage of in Cities: Skylines, it’s the ability to make more realistic or creative cities. Sim City 1 trained me to think of city blocks and my lamentations of real life cities that don’t have perpendicular blocks ( a la NYC or many downtown areas) have given me a mental block to work through. By contrast, this city looks both more realistic to the real world AND fantastical and beautiful. This year, in addition to making use of the new DLC, Scarlett also got very involved and became my unofficial Jr. City planner.
Worms WMD (10 hours 10 minutes): In my mind, this is the epitome of what a 2D worms game should be. The developers have created a great item set as well as the ability to craft more weapons. The random assortment of vehicles and guns throughout the levels also add a high level of chaos. Many of the other 2D worms games are the same game with a new coat of paint, but this one really elevates the gameplay.
Spelunky (9 hours 10 minutes): This continues to be the Rogue-lite that teases me the most. I almost always seem just about to get to the last level, but since I’ve been playing with only one life for the past 3 levels, it’s only a matter of time before a slip-up kills me. Overall the kids are getting better and are more helpful to me as long as they’re not trying to use their ghost status to kill the shopkeeper.
The Witcher 2 (8 hours 33 minutes): Early in COVID I decided I was going to make use of extra time to allow for longer sessions in The Witcher 2. Oftentimes, like other RPGs, it isn’t easy to just save whenever you want. If you’re in the middle of a key battle or some other sequences, the game may not allow for interruption. I did alright for a while, but then the kids used up all my game time with Spelunky 2, Super Mario 3D World, Worms, and asking to watch me play Darkest Dungeon.
Mario Kart 8 (5 hours 10 minutes): I have a pretty long history with the Mario Kart series. My brother and I had the original on Super Nintendo and I’ve had all the games since (at least on the non-handheld consoles). It was even the reason the wife and I bought a Gamecube when we were dating in college. So eventually I decided to get Mario Kart 8 for the Wii U to play with the kids. It turned out to be a huge blast. We went through every level to unlock everything. And now that the twins were between 4 and 5 years old they were actually able to stay on the track. Not only that, they were also able to get into 4th and 5th place. More recently on the Switch they’ve even been able to get 1st-3rd place.
Vertical Drop Heroes HD (5 hours 38 minutes): While I still enjoy playing this game, most of my game time this year came from the twins really wanting me to play with them. They love playing it on their own and they like that they can get further when I play with them. I’m quite impressed that at their age/gameplay level they are starting to make meaningful contributions when they play with me.
Scribblenauts Unlimited (3 hours 45 minutes): I remember hearing about this game (well, the original game) back when I still used to listen to the Giant Bombcast. I always thought the idea was pretty neat, and having done a fair bit of programming (and even video game programming), I can truly appreciate how miraculous this game is and how much code must have gone into the parser. The kids enjoyed it a lot and I expect them to perhaps request it again once they see the wrap-up video.
Worms: Forts Under Siege (2 hours 54 minutes): This 3D worms game was certainly unique – especially with its focus on building up a base. However, while 2D worms is incredibly intuitive (like its predecessors/early siblings Scorched Earth and Gorilla Game), the 3D game makes it a lot harder to aim, to know what to do, and to hit anyone. In fact, with the world so large compared to the 2D games we mostly ended up staying at our bases until the timer ran out and started hitting us with various random effects.
Rocket League (2 hours 17 minutes): Rocket League was one of the first video games the twins ever played – somewhere around 3 years old. Mostly they just enjoyed making the cars drive around. Now that they were good enough to play Mario Kart, I figured they could handle some Rocket League. Overall, it was a fun time, which everyone enjoyed. That said, whoever is on my team has a major advantage (not that I’m any good at Rocket League, but I’m way better than any of the kids), so eventually people start complaining about not being able to win.
TF2 (2 hours 13 minutes): The biggest thing that keeps me from playing more TF2 is that most rounds take quite a lot of time so I need to have blocked out at least an hour or so if I want to play. Compare that to Spelunky where, if I’m having a GOOD run, it takes me maybe 10-15 minutes.
Stellaris (2 hours 13 minutes): Due to an upgrade in Stellaris, my previous save was incompatible and I had to start a new empire. This is probably a good thing as it had been a long time since I last played Stellaris and probably wouldn’t remember what had been going on. I’d like to think that if I’d been playing a little more consistently throughout that there would have been an opportunity to upgrade my save file. This game continues to be complex on a level that makes Civilization seem like a kid’s game. Stellaris is a game I think I would probably dive deeply into if it was the only game I was playing.
Super Smash Bros. Ultimate (2 hours): Sam loved playing Smash for the Wii so we got him Smash on the Switch. I played enough to unlock a few characters and then mostly played with the kids whenever they’ve asked me to join them.
Mario Kart 8 Deluxe (2 hours): As I mentioned above, Mario Kart is a series that my wife and I enjoy playing against each other. So we’ve played a few rounds on the Switch. The difference in playing with her – we can trash talk without hurting each others’ feelings. The kids aren’t quite ready for that yet.
Beckett (1 hour 50 minutes): Another Humble Bundle game; another game I got to alphabetically. A detective story that takes place in what seems to be a British dystopia full of visual metaphor. The game is a very odd duck. Part of me appreciates the artistry that went into it as a video game art piece. And it definitely seems to be Saying. Something. I’m happy that the internet and marketplaces like Steam and GOG allow this stuff to exist. That said, I’ve been mostly underwhelmed by the game. I’d hoped to finish it in 2020, but I’ve still got a hopefully small chunk left.
FTL (1 hour 45 minutes): I think, of all the Rogue-lites and Rogue-alikes I play, I feel the pain of defeat hardest in FTL when I seem to have accrued a nice, large crew and a decent set of offensive and defensive hardware for my ship. I think maybe it’s because unlike, say, Spelunky, it’s very unlikely for me to die early in the game by mistake. I always end up at least a couple star systems in before my mistake catches up to me – whether that’s not enough fuel or not enough bullets or letting too many guys board.
Worms Clan Wars (1 hour 40 minutes): A pretty decent entry in the Worms franchise, it’d probably be my favorite if I hadn’t played Worms WMD.
Overcooked (1 hour 35 minutes): I got this game when it was on sale because we’d had so much fun with Overcooked 2. It really puts into stark relief the upgrades, gameplay changes, and visual changes they made between the two entries. We haven’t played it nearly as much as Overcooked 2. In fact, we still haven’t finished story mode.
Road Not Traveled (1 hour 30 minutes): Unlike many of the other Rogue-a-likes and Rogue-lites that I play, I think my enjoyment of this one really suffered from a large gap since the last time I played. I think it may be because this one is a little more story-based than others. Or it may be because the gameplay is a little more complex than Spelunky or Vertical Drop Heroes HD, but I didn’t quite have the pleasure playing it that I expected I would when I last left off after my second play session.
Super Mario Strikers (1 hour 3 minutes): I decided to revisit this game with the kids to introduce them to the idea of sports video games. I think it was a success, although I hadn’t played the game in literally over a decade, so it took me a while to remember the controls so that I could explain it to the kids. Maybe in 2021 I’ll introduce them to the Mario baseball game.
Sonic Generations (38 minutes): When this game first came out, I’d wanted it to relive some of my early Sega Genesis nostalgia. I wasn’t really wild about the 3D Sonic games as those came out for systems I never had, but it still looked pretty awesome. But then there was a Humble Bundle that included it. I think it’s the same one where I got Sonic Racing. I’ve done a heckuva lot more Sonic Racing with the kids and only played Sonic Generations once. I will probably get back to it … someday.
Rogue Legacy (37 minutes): Continuing the Rogue-lite/Rogue-like trend of the past few years, I continue to enjoy playing this game. I especially love the humor involved. I’ve reached the point where I’ve started to gain power ups and familiarity with the game that led me to get further into the castle in 2020 than in prior years.
Yooka-Laylee (30 minutes): I was a huge fan of Donkey Kong Country and I believe a good chunk of former Rare programmers made Yooka-Laylee. I wasn’t a fan of Banjo-Kazooie, or really most of the 3D games that came out in the wake of Mario 64, but I wanted to see if this game would appeal to the kids. The sequel certainly seems more of a descendent of Donkey Kong Country. Instead what I got was a game that was pretty neat and had lots of jokes that went over the kids’ heads. I look forward to putting this on my rotation in the future.
Grim Fandango (17 minutes): Scarlett requested for me to return to the land of the dead for this game. Of course, I had to go to a walkthrough because this is an Old School point and click adventure game where the solution is often incredibly unintuitive. I do want to keep going, as the characters are pretty neat and the story is pretty funny. But we’ll have to see when I put this back into my rotation.
Battlepaths (6 minutes): I got this game as part of a Humble Bundle. I started playing during this year’s COVID time at home as I went through my Steam library in alphabetical order. I did not like this game at all. Nothing about it appealed to me and I haven’t played it since the few minutes I played to try it out.
Total: 370 Hours 50 minutes
2020 Game of the Year
Even though Spelunky 2 was my third-most played game in 2020, it was the one that had the most replayability and the most fun. Not only was it a ton of fun to play alone, but it was also a blast to play with the kids. Towards the end of the year, the online multiplayer was released and I got to have a fun, if somewhat frustrating for the lack of communication, session with Dan. It took all the best of Spelunky and amped it up and I can see myself continuing to play it for many, many years to come.
2020 Runner Up
Darkest Dungon almost made my Game of the Year for 2020. I really enjoyed the battles, the character set, and the challenge of it all. Yet, just like X-COM, it really wore me down on when I could spent over an hour getting through a dungeon to lose everyone at the last minute. It did (as most challenging games, puzzles, etc) mean that when I won, it felt awesome. But near the end of 2020 I moved it down to my secondary rotation of games, meaning it’ll come up less often. I still enjoy it, but it just didn’t have what it took to unseat Spelunky 2.
2020 Surprise Loss
I went into 2020 so hyped for Gwent as you either read or saw above. But, in a different way than Darkest Dungeon, it ended up wearing me down. I just couldn’t make my entire gaming life about Gwent and that meant I would have trouble rising above my current status or even earning all the trinkets and in-game money that I wanted to earn. I said above that I’d return to the game and I think it’s possible I will. We’ll have to see what happens.
Back in 2019, when I did my programming retrospective I made a few predictions. How did those go?
Work on my Extra Life Donation Tracker? Yup! See below!
Write more C++ thanks to Arduino? Not so much.
C# thanks to Unity? Yes, but not in the way I thought. I only did minor work on my game, but I did start a new GameDev.tv class.
Learning Ruby? Well, I wouldn’t necessarily say I learned Ruby. I did finish the book Ruby Wizardry and I took copious notes. But until I do some practice – maybe via some code katas, I don’t think I’ll have solidified it in my mind.
3D Game Dev? Nope, not really.
Rust and Go? Not even close. Although I did make sure to get some books on the languages.
So, what happened? On the programming front, I wanted to continue my journey to truly master Python after having used it at a surface level for the past 15ish years. I dedicated myself to doing the Python Morsels challenges (more on that below) and working through various Python development exercises. Outside of programming, the time I had off from COVID was used to play with my kids and they wanted to play lots of video games. So we took advantage of having way more time than usual to do that. So a lot of my goals slipped. We’ll get to 2021 predictions at the end, so let’s take a look at 2020!
Using git commits as a metric, it was a busier programming year than last year. I went from 769 commits for the year to 1231 commits.
As you can see before, on Github my contributions were:
7% pull requests
Let’s take a look at the various projects I worked on in 2020:
I can’t believe it took me this long to come up with this script to gather the data for my end of year music post.I’ve been using the last.fm API to post my top artists each week for a few years now. And each year it would take me a couple hours to gather and format all the data for the end of year last.fm posts. But this year I wanted to make some graphs and I’d learned how to use the matplotlib library earlier in the year, so I knew I’d generate the graphs programmatically. But as soon as I thought about it, I realized I could also generate all the statistical text for the post automatically and formatted the way I needed it. It’s a pretty simple script, but it does exactly what Python excels at – Automating the Boring Stuff.
Extra Life Donation Tracker
My current programming magnum opus continued to be refined. I made 23 releases (boy, that surprised me – I hadn’t realized how many releases I made in one year!) I went from version 3.2 to v5.2.3. One thing that’s pretty awesome from the point of view of someone putting stuff out there, is that a few of those releases were due to bug fixes reported from users. So I continue to have users! Other releases contained various improvements like:
changing the file structure to allow for PyPi releases
the ability to check automatically if there’s an update available
a help menu that takes users to the documentation
the ability for the user to change the font for the tracker window
the ability to validate user and team IDs
color-coded output to help the user know if something has gone wrong
I’ve got some changes planned for this year to continue to make the code more Pythonic (based on things I’ve learned in 2020) and hopefully easier to test via Unit Tests. I got Brian Okken’s book on Pytest so I hope to use that to improve my unit tests in my various projects. I also want to do some user-facing improvements like providing images from the Extra Life site.
I made one tiny change to this code that I copied from Linux Format Magazine nearly a decade ago (and then improved upon slightly) so that it would run on Python 3.
This program came a long way last year. What could I do to improve upon it in 2020? Well, during some of my Python education this year, I learned why the numbers were always slightly off on the program. It turns out that when you’re doing complex math, you don’t really want to use the built-in numbers because the rounding errors just build up like crazy. Instead, you want to use the Decimal package. This ensures a certain level of precision is maintained. Once I did that, all the errors went away. Then I decided to use what I’d learned about argparse last year to remove a lot of code that was a pain to maintain and have Python’s argparse generate the user help output for me – improving maintainability!
I fully developed this code in 2020. Originally I intended to fork this guy’s code and add in the improvements I needed .But when I looked at how he had things setup, I would have wanted to make some radical changes so I decided to just start from scratch. Other than another project I’ll mention below, it’s the only project in which I’ve had pull requests come in from others; very exciting for me! The code still needs some work before it’s very useful to others, but it works perfectly for my purpose – checking whether the garage door was left open. I’ve set up a Home Assistant integration to send me an alert if it’s open after sunset.
I started this work after I found out that there was a rest API for Podman. I figured I could make really good use of the API to automate some of my container work. A couple months later it was announced that the podman group had released their own Python API. So this project is mothballed, but I did learn a lot about creating an API translation layer.
This code grew out of my desire to use Pimoroni’s Enviropi pHat (or bonnet) on a Raspberry Pi Zero W in my master bath to measure humidity, temperature, and light levels. I’d been using an Arduino MKR WIFI 1010 and environment shield for this work, but it was slightly flaky and it’s a lot harder to debug a flaky Arduino since you can’t just ssh into it or check its logs. My code uses Pimoroni’s code as the base and then I made a few adaptations to make it work for me. Namely, it sends the data via MQTT to my server and it keeps the display off unless I purposely turn it on.
This year, as I’ll talk about below (or you’ve seen on the blog in previous posts), I did the Raspberry Pi Foundation’s Scratch and Python projects with the kids. It was a fun way to introduce them to the idea of programming – so the kids could understand that they had the power to control the computer to make their own fun games or do fun things with the computer. This was a project to use Python’s implementation of the turtle (see this wikipedia page about turtle graphics) to draw snowflakes. As was typical when doing the Raspberry Pi Foundation projects, we started off by copying their code for the base. Then we branched off into the direction Sam wanted to go.
This was a project born during the COVID break. A friend had the need for a website to help him out with a weekly task that was robbing him of tons of hours when it could easily be automated. I wanted to learn flask and not just create a dummy site. I find that, with some of these technologies – like Flask or Django – the online tutorials tend to be trivial to understand and very hard to apply to a real web app when you want to make one. So, after completing a flask video tutorial, I started to work on this code. I was able to get a rough website working as well as an SQLite database. But when it came time to write the admin backend, the fact that Flask requires the user to build everything started to get tiresome. I think I may redo this in Django now that I have a better idea of the requirements. I don’t think my flask knowledge was completely wasted. I just think it’s a better framework when you don’t need an admin backend.
My original code for this project to manage btrfs snapshots was a huge mess I created through my lack of knowledge of core Python concepts. This year I decided to clean up the code, make it work with Python 3, and use newer concepts I’d learned to make it more Pythonic and less for a spaghetti code mess. It’s now in a more maintainable format and includes the ability to push snapshots to my server. The first version of this project was my crowning achievement before my Extra Life Donation program and so it’s nice to have it once again be something I can be proud of. There is still some work to be done, so I hope to find some time for that in 2020.
I’m a big stats and graphs junkie. (See my 2020 music post as an example) Back when I used to use Adobe Lightroom, I had a user-created plugin to generate stats and graphs on various EXIF data from my photos. I missed that, so I decided to make a little Python program to do that. It was through this project that I learned how to use the matplotlib module. I can already sense a pretty full slate for 2021, but maybe I’ll explore turning this into a plugin for Digikam.
I’d created this script in order to provide math problems for the wife. With my oldest starting multiplication, I added that to the script.
As I mentioned, I wrote a script to sign me up for swimming so that I don’t have to risk dropping my phone in the pool.
Eric’s Comet Competition
I worked on this before the pandemic, so I completely forgot that I’d done any work at all on this game. I needed to look up some math in order to get the angles working for going from one end of the screen to the other end. Hoping that this year I at least add the ability to shoot at the asteroids and destroy them.
With the Kids
2020 was the year of Scratch at our home. The Raspberry Pi Foundation provided a series of lessons each week and I chose one to do with each kid. They really enjoyed them and looked forward to them each week. Scarlett even tweaked some of them after we were done, so we’ll see if she or any of the others ends up developing a curiosity about programming. For me it came from being the only way I could use a computer back when I was a kid. So I’m not 100% sure what it’s going to take for the kids to develop the desire to program.
With the success I was having with the kids and Scratch, I decided to get some Adafruit Circuit Playground Expresses. Those can be programmed in MS Makecode, which uses blocks just like Scratch. So first I created an electronic spinner that Scarlett could use as a sibling chooser when we needed to randomly pick one of the kids for something. Turns out it wasn’t random enough, so I had to make some mods.
I then made a snake charmer in a box with Stella. She had a lot more fun pushing the button and watching the snake pop out than I thought she would.
I got to relive my childhood and do some Circuit Python coding with Sam when we made a Simon Clone for the Circuit Playground Express. It was my first time working with Circuit Python and I found it wasn’t too terribly different from regular CPython. It might be fun to redo this project with a Raspberry Pi Zero to keep track of high scores.
Solo Electronics Projects
I didn’t end up doing anything with the Adafruit Clue that arrived with my first Adabox, although I would like to eventually use it for some of the example projects. I did have a lot of fun with the next Adabox, though. It was a Matrix Portal and large Matrix that I used to make a Halloween spooky pair of eyes to show through the window. Then I took the example code for the Halloween countdown timer and adapted it to make a Christmas countdowns clock that the kids really enjoyed. I had Scarlett create the images that showed between the time intervals. They’ve asked me to use it as a birthday countdown clock in the future. I’d like to see what else I can come up with using that hardware.
The final Adabox for the year included a Magtag. I have used that, along with sample code from Adafruit, to create a weather station. I’d like to adapt it in the future to perhaps have some other features. However, for the moment I have some debugging to do because it doesn’t seem to want to go to sleep as it should.
I didn’t do as much with Arduino as I thought I would. I was expecting to at least work towards finishing my BBQ thermostat project. But I ran into some trouble when trying to control the fan with a BJT so the project was temporarily put on hold.
When I switched to using a Raspberry Pi Zero W for the bathroom project, I took the Arduino I had in there and adapted it to measure temperature and humidity levels from one of the bedrooms. I was able to find that the temperature differences among the rooms were not as large as we thought they were – at least at night.
Early on in 2020 I brought my Raspberry Pi 1 B out of retirement to monitor my garage door. It could let me know if I’d left it open, especially after sunset. At some point the SD card became corrupted (a problem with those older Raspberry Pis) so I switched it out for a Raspberry Pi Zero W. The Raspberry Pi 1 B now monitors the temperature and humidity in the office – the hottest room in my house (by as much as 10 degrees fahrenheit in the summer). As I mentioned a few times before, I also put a Raspberry Pi Zero W in the bathroom to take over for the Arduino. It’s helping to monitor humidity levels and take action based on the measurements.
Improving Programming Skills
As I mentioned in the introduction, 2020 wasn’t the year of becoming a programming polyglot I thought it might be. (I spent nearly a whole weekend at my in-laws pre-pandemic looking at resources for Go and TinyGo – the equivalent of Circuit Python or Micro Python) But it was a great year for improving my Python. Through a variety of books (like Serious Python, Clean Code, and Impractical Python) and exercises (like Python Morsels) I seriously improved my grasp on Pythonic code and finally understood things that had been eluding me, like list comprehension. I did also do some work in other languages.
One of the many programming Humble Bundles came with training packages from various providers. One of the clinchers for me was a training video I haven’t yet done which involved list comprehensions. I decided to jump into Python Morsels first. So far it has been an incredibly positive experience. Each week Trey Hunner sends you a Python homework problem. The base problem is usually easy or just a mild stretch. The biggest value is the work he puts into the bonus sections. These take the solution you just made and stretch them to fit new, harder requirements. Depending on the way your brain works, you might need to overhaul your solution or it may work with merely a few tweaks. Another thing that makes this a top notch site include the built-in Python evaluator that allows you to check your code against the unit tests he writes to see if your code matches. I usually download the unit test rather than constantly using the in-built checker, but it’s awesome that it’s there. Even better than all this are the answers that Trey provides. I’m always excited to read them, even if I was able to solve the base problem and every bonus. He usually reveals an incredibly more Pythonic answer than the one I came up with. As the year went on and I started being closer to his answer, it was a great marker of my progress – I was starting to think more Pythonically. For a good example of the problems and the progress I made, check out this post.
I got this awesome book, by Lee Vaughn, as part of a Humble Bundle. It has definitely been worth reading and I recommend it for anyone who’s gone beyond a beginner level in Python. This year I did chapters 3 and 4. They continued to introduce me to Python modules I didn’t know about and more Pythonic ways to solve problems. It’s slowly getting ever so slightly out of date as Python 3 continues to evolve (for example there isn’t any use of F-strings), but still worth getting and working through the problems.
This year I finished reading through the kid’s Ruby book, Ruby Wizardry, by Eric Weinstein. I thought it was very well written and did a good job introducing the basics of Ruby. I took some notes on how various features work. It seems, in a lot of ways, to be pretty close to Python. That said, I’d need some practice and/or a deeper book before I’d say that I really know Ruby. Still, it was neat to see how the language worked after all the hype I’d heard about it.
C# and Unity
RTS Online Multiplayer class
Sure, after completing my GameDev.tv 2D Unity class, I still haven’t finished either of the two games I wanted to create, but I really wanted to know how to do online multiplayer for Unity. One of the games I’d like to develop – a Ludo/Parcheesi clone would be so that Ican play online with family members. I spent a couple days in 2019 trying to see if there was an easy way to do it. There wasn’t anything I could find that made it too easy. Then I saw this class this year and took it, since I’d already had a great experience with the GameDev.tv professors. After a first section, in which we focused on moving a ball around, we started working on an RTS (think Command and Conquer, Age of Empires, or Warcraft). It’s been pretty fascinating to see how this works. It is a lot more complex and will probably take me another review of the material to truly understand how to do it for my games, but I’m very glad to have taken the class to better understand the issues involved. I am about halfway through the RTS section and will complete the class in 2021.
Advent of Code
This was my first year participating in the Advent of Code challenge. Essentially, each of the first 25 days in December contains a programming challenge followed by a bonus challenge that takes the first problem and adds some wrinkles to make it harder. Each day is harder than the last. Additionally, there’s a cute little story that goes along with the entire challenge and each day’s problem advances the story. The first few are pretty trivial to solve, so some folks took to esoteric languages or methods to solve those first problems. I heard about it via the Python discord server. The Advent of Code servers give a score to the first 100 participants. (First place takes 100 pts, second 99pts, etc) I would never have scored because a) the puzzles come out at midnight EST and b) were often solved within a few minutes. I think my fastest solution was an hour or so. Fortunately, the Python discord server was more generous with points and I was able to make the leaderboard.
For the first dozen or so days I made really good progress at solving the puzzles, even if it took me hours. Eventually, I came across a few I just couldn’t solve – neither the primary puzzle nor the bonus. (see my solutions in this Github repo) What made it worth it to push through was that a good challenge makes finding a solution very rewarding. Also, there was a great community on reddit (and the Python discord) sharing various solutions, visualizations, and lots of help. I definitely plan to participate next year. Eventually I ended up placing 136/574. I thought that was a pretty decent score for someone for whom CS principles do not come naturally. That is to say, I love programming and have been doing it since I was 8, but I would often see others’ solutions and realize I’d come up with the most convoluted solution possible in comparison. My biggest tip for saving your sanity is to write unit tests. Since some example input and output is given, the unit tests will make sure your code works before attempting the real input. (even though I still found myself sometimes coming up against corner cases – just like in real life programs I’ve written) I will definitey be reading this tips and tricks page now and once again just before the 2021 Advent of Code. (Took a peek before this blog post was published and I learned something fascinating about how AoC is set up! – Each puzzle comes with input data that is custom-generated for each participant. To solve the puzzle, the participant must write code that uses the input to produce a matching answer. While all the participants have to come up with the same general solution, everyone’s answer is different.)
Time will tell whether I stick with Python (so that the only challenge is the problem itself) or if I use it (particularly the early days) as a way to reinforce other languages I learn in 2021.
Goals and Hopes for 2021
In the electronics realm, I’d like to continue with my BBQ Thermostat project. I’ve moved to using an ESP32-S2 and Circuit Python. We’ll have to see, once Circuit Python support for the board improves, how far that goes. I’d also like to continue developing projects that are fun to do with the kids.
We’ll have to see next year how things stack up compared to what I wanted for this year.
Stay tuned on this blog for more End of Year posts on the software I’m using for programming, video games, and cooking.
Recently I came across this video where a programmer solves the same problem in 6 different programming languages:
What’s incredibly beautiful are the Haskell and APL solutions. Whereas every other language requires multiple lines, Haskell solves the problem in just one line. And APL is just a few symbols.
Here’s the same guy solving a problem from the Leetcode challenge in a few languages. Once again, it’s pretty neat how the elegance of the solution varies across languages:
I also came across some beautiful examples of code, particularly Haskell as coders shared their solutions to this year’s Advent of Code. I was shocked as I had never realized just how different the solutions could be across languages.
Of course, the problem is that if you really wanted to make the best use of this, your programmer core would need to consist of experts in many different programing languages. Any Turing Complete programming language can solve any other’s problems, so it’s somewhat of a waste of resources to employ such a diverse programmer pool, but it’s still neat to think of a world where each problem is solved by the perfect language for that problem type.
This year continued last year’s trend of Sequels, Sanderson, and Science Fiction Magazines. Every series I mentioned last year was a series I continued reading this year – The Expanse, The Asylum Tales, Red Rising, The Dresden Files, The Mogoliad, Wild Cards, and the Illumination Paradox. (The only exception was Red Rising – I’m done with that series after the first trilogy.) I also continued to read sequels in The Wheel of Time, The Powder Mage series, The Just City, and Temeriere. As I did last year, I also read lots of books on electronics and programming as I started to beef up that chunk of my hobbies. As you’ll see if you read my 2020 programming post, this was a good year for me in programming. I also continued trying to catch up with Clarkesworld Magazine.
New or changed trends this year included reading less cookbooks. I have lots of cookbooks to read – about a dozen or so. But during the pandemic I prioritized using the time to play video games (which I usually don’t have as much time to dedicate to it as I’d like in a normal year) and programming (which benefited from longer uninterrupted chunks of time). Also, for the first half of COVID, it was hard to get ingredients on demand. I also started re-reading old books as the weather started getting worse for reading outside. I usually go for a walk and read for a bit after lunch at work (reading while walking being a skill I’ve had since I was a kid). So I started going through my old paperback library to read for a walk indoors in an abandoned hallway at work. At first I chose books I hadn’t read since high school, so while I remembered some of the plot points, I’d forgotten enough that I could once again be entertained (Over the Wine-Dark Sea, Don’t Stand Too Close to a Naked Man, and Snow Crash). Then I decided I’d go through the Discworld books again since I hadn’t read the earliest ones since about 2006-2007ish. I’ve definitely forgotten TONS of details in the first two books.
You can search this blog with the titles of any of the books I read to read my reviews, but I’d like to mention a few highlights before moving on to my favorite book and some Goodreads stats. First of all, I’ll mention once again that the reason I love doing these blog posts looking back at the year is that I tend to forget about the things that happened early in the year. I’d forgotten I’d read many of these books in 2020. Throne of Jade was a real delight – I enjoyed reading a book in which a Napoleanic-Era British soldier ends up in China. I thought The Mongoliad Book 3 had a very satisfying ending for a very long series while still leaving things open to continue forward in the rest of the Foreworld series.
Rave Master was very odd. It wasn’t quite playing with manga tropes and conventions like Azumanga Daioh (at least the anime version – I never read the manga) but it does seem to have a certain self-awareness to it without being parody. It’s a very weird space to occupy and I alternated between being fascinated and revolted by it. I wanted to read it before FairyTale as it’s the same manga-ka, but as he first flexed his writing/drawing muscles with this title. There’s definitely a stronger sense of uncertainty in his notes to the reader than other manga I’ve read (Love Hina and Death Note), in which it seems the norm for the manga-ka to have an air of humility.
The Jungle Book was a fascinating read for someone who’d only grown up on the Disney cartoon. It was both better and worse than I expected it to be on race and the superiority with which the British saw themselves in the world. Little Women started off rocky, but ended up winning me over in the second half, perhaps proving why it has staying power over a hundred years after its publication. Bait was my second romance (actually second supernatural romance) and, mostly, continued to prove that the genre doesn’t deserve all the flack it gets. It wasn’t a masterpiece or anything, but it certainly had a plot beyond titillation. Finally, Bound was a beautiful retelling of Cinderella, a story which has been told in nearly every culture and which some researchers believe actually has its origins in China.
There may be a bit of recency bias in this answer, but Rhythm of War was my favorite book of 2020. Brandon Sanderson continues to weave a master narrative in that series and I think, paradoxically, what makes it the best book I read in 2020 was the way in which I actually struggled a bit in the beginning with its slow pace. Yet, like a good roller coaster, once the book started going, it was a wild ride.
Honorable mentions go to:
Ancillary Sword – now that Anne Leckie had set the scene for her Imperial Radch world, she was able to just play in it and I love the Who Dunnit plot of this book as well as the continued evolution of our main character.
Throne of Jade – for the reasons I mentioned above and for taking the premise of dragons as the fantasy equivalent of Artificial Intelligence powered-tanks and making it even richer than the first book.
The Princess in Black for showing that kids’ books don’t have to suck and can actually be incredibly funny and rewarding for the grownups reading them. (Without even having to resort to adult humor going over the kids’ heads)
My ebook collection (full of e-magazines and e-books alike) is now at 2029 entries (up from 1454). Of those 1634 are unread (up from 1112). The collection consists of 1807 authors (from 1419) – the number is potentially a bit higher as I haven’t yet fixed all the authors in the Science Fiction and Fantasy magazines. That said, many of them often appear over and over in various issues.
Some Goodreads stats:
18,189 pages read (1753 less pages than last year)
Shortest book: Jumpstarting the Onion Omega2 at 65 pages
Longest book: Rhythm of War at 1,232 pages (approximately 400 pages more than last year)
Average book length in pages: 279
Most popular book: Little Women with 2,683,517 others having shelved it on Goodreads
Least popular: Jumpstarting the Onion Omega2 with only 2 having shelved it.
My average rating in 2020: 3.8 (same as last year)
My 2020 books, in order of completion:
Clarkesworld Magazine #133
A Man on the Moon – Andrew Chaikin
Sat Fat Acid Heat – Samin Nosrat
Starswept – Mary Fan
Clarkesworld Magazine #134
Over the Wine Dark Sea – H.N. Turtletaub
Serious Python – Julien Danjou
Soleil – Jaqueline Garlick
Stronger than a Bronze Dragon – Mary Fan
Summer Knight – Jim Butcher
Tiamat’s Wrath – James S.A. Corey
Rave Master Vol 1 – Hiro Mashima
The Philosopher Kings – Jo Walton
Rave Master Vol 2 – Hiro Mashima
Clarkesworld Magazine #136
Clarkesworld Magazine #137
The Bobs Burgers Burger Book – Lauren Bouchard
Rave Master Vol 3 – Hiro Mashima
The Princess in Black – Shannon Hale
Clarkesworld Magazine #138
Rave Master Vol 4 – Hiro Mashima
The Princess in Black and the Hungry Bunny Horde – Shannon Hale
Clarkesworld Magazine #135
Rave Master Vol 5 – Hiro Mashima
Throne of Jade – Naomi Novak
The Cuban Table – Ana Sofia Pelaez
Wild Cards III: Jokers Wild
Rave Master Vol 6 – Hiro Mashima
Bound – Jo Napoli
Slaughterhouse Five – Kurt Vonnegut
Rave Master Vol 7- Hiro Mashima
Rave Master Vol 8 – Hiro Mashima
Clarkesworld Magazine #139
Ancillary Sword – Ann Leckie
Rave Master Vol 9 – Hiro Mashima
Clarkesworld Magazine #140
Clarkesworld Magazine #141
The Crimson Campaign – Brian McClellan
Clarkesworld Magazine #142
Jumpstarting the Raspberry Pi Zero W
Getting Started with Soldering
Jumpstarting the Onion Omega2
Investigators – John Patrick Green
Clarkesworld Magazine #143
Don’t Stand Too Close to a Naked Man – Tim Allen
The Mongoliad Book 3
Hippopatamister – John Patrick Green
The Gospel Reloaded – Seay Garrett
The Jungle Book – Rudyard Kipling
Ruby Wizardry – Eric Weinstein
Indian(ish) – Priya Krishna
Thrilling Adventure Yarns
Little Women – Louisa May Alcott
Bait – Annie Nicholas
Dawnshard – Brandon Sanderson
A Knight of the Seven Kingdoms – George R.R. Martin
Thanks to COVID I missed out on the concert where I was going to see Paul and Storm and Jonathan Coulton. Compared to last year, I also barely bought any music.
This year I switched from using Ampache to listen to my music at work, to using Funkwhale. The more responsive interface has led to me playing a lot more albums as well as doing “artist radio” mode which plays all of an artists’ songs at random. This may have concentrated the scrobbles rather than having them be as random as in the past. That said, I did make good use of Funkwhale’s “Less Listened” radio to keep things fresh. At home I’ve been using Cantata’s “similar artists” dynamic playlists a lot which may also have contributed to a concentration of artists this year.
I mostly listened to my own library, but I did turn to Spotify a little this year. Mostly I used it for the Hamilton soundtrack, some Game Chops albums I didn’t have, and to rediscover MxPx after hearing Mike Herrera interview Reese Roper for the new Five Iron Frenzy kickstarter.
New albums in my collection this year included:
Helynt – Mario and Chill
Billie Eilish – When We Fall Asleep
Billie Eilish – don’t smile at me
Surrija – Surrija (which I kickstarted and reviewed)
Vampire Weekend – Father of the Bride
Some singles by The OneUps
Worms Under Siege video game soundtrack
Bee Gees – The Ultimate BeeGees
No Devotion – Permanence
Trio Matamoros – Serie Imortales
Stellaria EP (kickstarted)
I Fight Dragons started a new album adventure. They haven’t released the album yet, but they have released a lot of old EPs and demos
DJ Zog – Power 96 5 o’ Clock Traffic Jam
Run the Jewels – RTJ4
Bad Rabbits – Mimi
Bad Rabbits – Stickupkids
Last year I was listening to a lot of music while training for running races. But in 2020 I was mostly distance training at a much slower pace, so I listened to podcasts instead.
The confounding factor this time around was the fact that the last.fm Android app was updated so that it scrobbled from every sound-playing app, so I ended up with podcast scrobbles and some YouTube scrobbles, as we’ll see below.
This year I’ve included some graphs to help illustrate the data. I can’t believe that I’ve been using the last.fm API for a few years now and it never occurred to me to use it for this end of the year wrap-up where it has literally saved me hours on collecting and formatting the data. See my Python script so you can do it, too. You just need to sign up for an API key.
Without further ado, my 2020 Music Stats:
Top Artists for 2020
The graph is pretty typical of what goes on in my last.fm trends (and when we get to overall artists you’ll see a great example of a long-tail graph): a few outliers near the top and then clusters that are quite far off from those over-achievers.
1. Five Iron Frenzy (764) – perennially present, but they had a new Kickstarter this year (and I actually heard about it in time to participate this time) which set me on a nostalgia trip listening to the old stuff. 2. Billie Eilish (428) – Billie’s completely new to the library this year, as you saw above. I got her pair of albums for Danielle. Based on the covers, I didn’t think there was much I’d care to listen to here. But, I actually found quite a few of the songs addictive, particularly on don’t smile at me. 3. Relient K (381) – Not much to say here. I don’t particularly remember listening to a lot of Relient K on purpose. 4. Anberlin (354) – One week I decided to go through all of their albums again. 5. The PDX Broadsides (349) – These are mostly from random listens although there was one day at work where I just set it to “The PDX Broadsides radio”. 6. I Fight Dragons (345) – As I mentioned above, there’s a new album in the works. Not only did this trigger me to listen to some old songs, but they’ve also been releasing tons of new tracks that I’ve been checking out. 7. Vampire Weekend (307) – This is almost entirely on the back of Father of the Bride. I really enjoyed that album a lot and listened to it pretty continuously after buying it. 8. Bee Gees (293) – I think I’ve mentioned elsewhere on the blog that listening to the Bee Gees reminds me of my childhood as my mom often had Bee Gees records playing while she did chores. Once I got their greatest hits album (as a present), I listened to it pretty continuously for a while. 9. Childish Gambino (283) – Nothing huge to say here – just came up on random a lot. 10. HELYNT (268) – In addition to buying Mario and Chill, which I really enjoyed, when I was listening to Game Chops Spotify playlists, HELYNT came up quite a bit. 11. The Beatles (254) – They always find their way onto my top lists because I have all their albums. 12. Dj CUTMAN (247) – After listening to the Game Chops playlists, I regained an appreciation for DJ CUTMAN and played a bunch of his albums again. They’re also great at work when I need to REALLY focus and need music without lyrics. 13. Jim Guthrie (246) – Most of these came from my Cantata “Similar to Jonathan Coulton” dynamic playlist. 14. Lana Del Rey (206) – Mostly something I can listen to with the wife 15. Jonathan Coulton (205) – Nothing new here. 16. Bad Rabbits (204) – Some of these are from when I got the new album Mimi, but a lot of their songs can also be a nice boost in the morning to get me going. 17. Chance the Rapper (198) – occasionally, I throw on the second mixtape and just listen all the way through 18. Surrija (190) – As I mentioned above, I was part of the kickstarter for her latest album. 19. Ramin Djawadi (180) – listening to some Game of Thrones and some Westworld. 20. Louis Jordan (169) – I’m surprised I listened to this much Louis Jordan, but I do really like his music.
Top Albums of 2020
No real surprises here if you look above with the exception of Thelonious Monk, Frank Ocean, Janelle Monáe, and No Devotion. Mostly it’s because I tend to listen to my music at random – either purely random or random by artist. So that’s going to favor artist accumulations vs individual albums. Frank Ocean’s Blonde is mostly one of convenience. I don’t like it nearly as much as Channel Orange, but in Ampache it was a lot easier to get to, and so I listened to it more before moving on to Funkwhale.
1. Bee Gees – The Ultimate Bee Gees (293) 2. HELYNT – Mario & Chill (241) 3. Vampire Weekend – Father of the Bride (238) 4. Billie Eilish – WHEN WE ALL FALL ASLEEP, WHERE DO WE GO? (235) 5. Billie Eilish – dont smile at me (193) 6. Surrija – Surrija (187) 7. Louis Jordan – The Best Of Louis Jordan (169) 8. Ramin Djawadi – Game Of Thrones (Music From The HBO Series) (169) 9. Five Iron Frenzy – The End Is Here (160) 10. Thelonious Monk – Plays Duke Ellington [Keepnews Collection] (Remastered) (160) 11. Frank Ocean – Blonde [Explicit] (126) 12. Chance the Rapper – Coloring Book (98) 13. Five Iron Frenzy – All The Hype That Money Can Buy (94) 14. Janelle Monáe – Dirty Computer (94) 15. Five Iron Frenzy – Quantity Is Job 1 [Ep] (90) 16. Run the Jewels – RTJ3 (90) 17. Marketplace – Marketplace (89) 18. Five Iron Frenzy – Upbeats & Beatdowns (87) 19. No Devotion – Permanence (87) 20. Five Iron Frenzy – Live–Proof that the Youth are Revolting (86)
Top Songs of 2020
A couple oddities here due to the new last.fm scrobbler. I definitely did not listen to Freek’N You 78 times. I listened a couple times to try and find the song because I’m doing what I hope is the FINAL idv3 tag update of my music ever, using Picard MusicBrainz to add in album art, proper artist tags, etc. The badly tagged files don’t come from the bad old days of Napster and music sharing. They also come from bad or lazy tagging of albums I’ve purchased and ripped myself. The phone scrobbler went a little wild on Freek’N You while I had the Youtube page open. The same goes for the McDonalds ad, or maybe that’s from podcasts.
My comments on a few of the tracks below:
1. Jodeci – Freek’N You (78) 2. McDonalds – Advertisement (74) 3. Five Iron Frenzy – See The Flames Begin To Crawl (Live) (38) 4. Billie Eilish – my boy (33) – My favorite Eilish song due to the word play in the lyrics. 5. HELYNT – Overworld (33) 6. Billie Eilish – bellyache (28) 7. Vampire Weekend – Harmony Hall (28) – My #1 favorite song. It’s also the reason I bought the album. I heard a Song Exploder episode about it that intrigued me. 8. Billie Eilish – bad guy (27) 9. HELYNT – Odyssey (27) 10. Billie Eilish – party favor (26) – Another great bunch of lyrics here, much cleverer than it sounds on first listen 11. HELYNT – Rainbow Road (26) 12. Surrija – Nothing Love (26) 13. Thelonious Monk – I Got It Bad (And That Ain’t Good) (Album Version) (26) 14. Billie Eilish – idontwannabeyouanymore (25) 15. Billie Eilish – wish you were gay (24) – I don’t know if the chorus is woke or offensive, but it’s certainly a clever expression of a spurned attraction 16. Paul Simon – Kodachrome (24) 17. Billie Eilish – ocean eyes (23) 18. Billie Eilish – watch (23) 19. HELYNT – Dire Dire Docks (23) 20. HELYNT – Game Over (23)
Top All-Time Artists
I let this one go to 100 artists for the graph to illustrate the “long tail” graph. It’s a phenomenon I heard about in the early 2000s that describes the statistics that some things are VERY popular and most things are barely popular. It shows up in a lot of statistical places, see the link above. You can see there’s a HUGE dropoff between my top 10 most listened artists and the next 90. I’d noticed this over the past few years as I did these writeups, but I think a graph really does illustrate it quite well. It’s hard for any other artist to overtake the top 10, which is why it’s always been a big deal when someone has jumped onto the top 15 that I track annually or has overtaken an artist in the top 10.
1. Five Iron Frenzy (3977) (up from #2) – holy moly! In all the time I’ve been keeping track of the top overall artists (I’ve been scrobbling since 2006 and writing these blog posts for at least 5 years), no one has been able to surpass Fantastic Plastic Machine. Finally, Five Iron Frenzy has climbed that mountain and started to pull away. I tend to listen to FIF way more than Fantastic Plastic Machine. So unless I do an FPM marathon, I don’t see it ever rising back to the top spot. 2. Fantastic Plastic Machine (3732) – (dropped from #1) 3. Anberlin (3380) – (no change) – That said, it’s just a couple Anberlin nostalgia-fests away from getting to #2. 4. The Beatles (3096) – (no change) 5. Relient K (2528) – (no change) – but an almost 400 increase in scrobbles) 6. I Fight Dragons (2151) – (no change) – still has a long way to go to overtake Relient K 7. “Weird Al” Yankovic (1857) – (no change) 8. Fall Out Boy (1644) – (no change) – Another example of the stability of the artists at this level. I’ve done a LOT of days where I’ve listened to a good chunk of the discography. Their first three albums have really grown on me. Yet, they still cannot pass Weird Al, who I rarely listen to nowadays. 9. Jonathan Coulton (1556) – (no change) – Last year I prediced it would close the gap with Fall Out Boy and it, indeed has. It goes from a 150 scrobble gap to a 90ish scrobble gap. 10. The PDX Broadsides (1431) – (up from #11) – Last year it emerged onto the top 15. Now it moves up even another spot. I think, potentially, due to having more tracks than JoCo, The PDX Broadsides could challenge him for the #9 spot next year! (especially if their remaining kickstarter bonus is released) 11. Gnarls Barkley (1208) – (drops from #10) Drops two years in a row. Perhaps saved from dropping 2 spots when I gave them a big listen a couple months ago. 12. Chance the Rapper (1157) – (up 2 spots from #14) – Pretty decent jump in a mostly stable lineup of artists. Hurt a little by the fact that I don’t like Coloring Book as much as Acid Rap and I still don’t have the fourth album. 13. Tom Lehrer (1067) – (up 2 spots from #15) – I’m very shocked to see Tom Lehrer jump back to his 2018 spot. I don’t remember doint a lot of listening, but it was just enough. If you look at the numbers here or the graph above you can see that there’s a cluster of artists around this range, so the position is not stable. 14. Lana Del Rey (1041) – (new to the list) – beating out a few other contenders, LDR joins the list. Given how close she is to #13 and within spitting distance of #12, she’s clearly hurt by once again being late on her latest album. (NFR was also very late) 15. Lostprophets (1033) – Yes, it’s problematic because of what the lead singer did. But the songs are still good and I’m listening to my own personal collection, not Spotify, so it’s not like I’m giving him money.
Off the list this year: DC Talk (dropped to #17 from #12 last year). Gwen Stefani (dropped to #16 from #13 last year)
On their heels for next year: Childish Gambino (#18), a return by Andrea Echeverri (#19), or a new appearance by Thousand Foot Krutch (#20).
All-Time Top Songs
A slight violation of the long tail here. I think this is because we’re talking about songs, not artists or albums, leading to a greater clustering when only looking at 15. Mostly the same old crowd, but some places have shifted.
1. Jonathan Coulton – The Princess Who Saved Herself (123) – (no change) 2. Clap Your Hands Say Yeah – Upon This Tidal Wave of Young Blood (122) – (no change) 3. Fantastic Plastic Machine – Steppin’ Out (107) – (no change) 4. Fantastic Plastic Machine – Take Me To The Disco [Malibu Mix] (104) – (no change) 5. Gnarls Barkley – Who Cares (104) – (no change) 6. Gnarls Barkley – Just a Thought (103) – (no change) 7. Anberlin – Audrey, Start The Revolution! (96) – (up one spot from #8) 8. 4minute – Cut it Out (92) – (drops one spot from #7) 9. Gnarls Barkley – The Last Time (92) – (up one spot from #10) 10. Gnarls Barkley – St. Elsewhere (91) – (drops one spot from #9) 11. Five Iron Frenzy – Blue Comb ’78 (88) – (new to the list) – OUT OF NOWHERE, one of my favorite FIF songs joins the list 12. Five Iron Frenzy – Handbook For The Sellout (87) – (new to the list) – OUT OF NOWHERE AGAIN; FIF KILLING IT! An oldie, but a goodie. 13. Gnarls Barkley – Smiley Faces (87) – (no change) 14. Andrea Echeverri – Quedate (86) – (dropped from #11) 15. Gnarls Barkley – Crazy (86) – (dropped from #12)
Off the list this year: Fantastic Plastic Machine – Love Is Psychedelic and Andrea Echeverri – Amortiguador.
Scrobbles at end of 2020: 158,261
Scrobbles IN 2020: 21,579 (about the same as last year)
I don’t know how long this playlist will be valid, but here’s my top 100 Spotify listens in a playlist:
In case that playlist goes away or the embed stops working, my top 20 were:
Tudd, GameChops – K.K. Cruisin’
Mikel, GameChops – Ocarina of Time
Chjolo, GameChops, Smooth McGroove – A Bell is Tolling
DJ Cutman, Noisepop – Late Nite
DeFalco, JMKM, GameChops – Saria’s Song
Jonathan Goff, Hamilton Cast – You’ll Be Back
Chjolo – Dub Splat!
DJ Cutman, GlitchxCity – New Horizon
Mikel, GameChops – Title Screen
Daveed Diggs, Lesli Odom Jr, Okieriete Onaodowan, Hamilton Cast – What’d I Miss
When I started out with this book, I wasn’t sure if I was going to like it. It seemed to lean a bit heavily on the young adult plot with the love triangle aspect and the whole wanting to be Internet famous subplot. But it turned out those were just there to introduce the reader to the world and provide some stakes for our main character.
The book quickly becomes a techno-thriller that can stand up there with the adult techno-thrillers I’ve enjoyed in the past. In fact, the reason for my fast pace on this book was because once it got going I was just unable to meet any of my self-imposed sleep deadlines. Kept telling myself, “just one more chapter”. And the chapter are really short (according to my Kobo, an average of 5 pages per chapter).
If you don’t mind reading YA, once this book gets going – it’s hard to put down. (view spoiler)[I was able to predict who Q was, but otherwise, the rest of the plot had the right surprise per page ratio (hide spoiler)]
I enjoyed this entry to the trilogy more than the first book. I think it might have to do with the fact that most of the world-building took place already. Or maybe it’s because it’s essentially just focused on one mission, giving that mission more narrative room to breathe. I also had fun getting into the weeds with the powers granted by Calamity now that we had the over-arching idea. Sanderson explores ideas of self-control, addiction, power over others, and fear. It ends up being pretty deep for a super-villain/freedom fighter book. I also think Sanderson does a good job of setting up some red herrings, even if the ultimate ending is somewhat easy to predict (then again, it is a YA book).
I think if you were on the fence about the first Reckoners book, worth one more dip to check it out. It just may win you over.
Dropping the rating from 4 stars (original) to 3 stars (second time through).
This is my second time reading through this book. First time was somewhere between 10-15 years ago. Going through it again, I realized just how much Mr. Pratchett improved as he iterated upon Discworld. Or, perhaps, it’s more accurate to say that this book had a different purpose than later Discworld books. This one is, essentially, a parody of where fantasy had evolved in the decades since The Hobbit and Lord of the Rings. Pratchett takes tons fantasy tropes, hero’s journey tropes, fish out of water tropes and obliterates them or subverts them. A lot of what he introduces here continues throughout the 30+ book series, but there are places where I’m sure he would have done things differently had he known he’d carry on beyond a couple books.
The plot itself is mostly nonexistant and I hadn’t remembered just how quickly Rincewind and Twoflower tear through locations on the disc. Perhaps that was also meant to be a commentary on tour buses skipping through town too quick for anyone to enjoy anything, but I think it just has to do with the aforementioned thought that this would be a universe for a couple books – maybe three. Essentially, it’s a series of scenes in which Twoflower’s naivette gets them into trouble and causes Rincewind to stress out before something (usually the luggage) saves them.
Still, while there are many different reading orders for The Discworld, I still think it’s worth reading the original trilogy to see how Pratchett sets things up before he starts slowly evolving things like the City Watch, introducing fantasy tech, and taking us to neat places like Uberwald.
Another masterwork by Brandon Sanderson in his Cosmere. I will say that, at times, some of the story seemed to drag, particularly character growth of the main characters. But not only is this made up by the incredible payoff at the end (I literally kept waking up the night I finished it as my brain obsessed over the epilogue and what it means for this series and the Cosmere as a whole), but the reader needs to consider this is book 4/10 in a planned series. Even with Sanderson having planned Stormlight as two five-book arcs, that would still mean that the climax of the arc would lie in the next book.
The book continues Sanderson’s tone for the series – a serious drama punctuated with humor, particularly whenever Wit is involved. Whereas the first three books in the series could have been read without any knowledge of the further Cosmere, the reader TRULY will be missing a LOT of details if they haven’t read through Mistborn, Warbreaker, White Sands, and Elantris. Key points in various storylines have “easter eggs” that really resonate (no pun intended) WAAAAAAAAAAAAAAY harder than mere easter eggs if the reader knows the references.
This entry answers SO many questions and ties so much together from the Cosmere. It sets up the Stormlight series for a huge climactic confrontation. And, near the end, provides incredble character growth. And, I’ll admit that chapter 108 had me tearing up. If you’re a Cosmere fan you already have this book. And if you aren’t…. you would’t have made it this far (1700 pages when I converted to PDF).
I got this book as part of a Humble Bundle years ago. It was my first occult horror, unless you count Dean Koontz books, which – now that I think about it – seems to share at least some genre space with this book. Quick note for anyone new to my reviews – I use the Goodreads tooltips to inform how many stars I give a book. At the time I’m writing this review, 2 stars is “it was OK”.
I definitely give the author credit for creativity. The occult enemy in this book was an original – not a typical creature from heaven or hell. This kept the narrative fresh and kept me guessing. At first, I thought perhaps this was going to be more akin to a thriller in which nothing supernatural was going on. But like the Robert Rodriguez movie From Dusk Til Dawn, eventually it became clear that our main antagonist did have some kind of powers and wasn’t merely delusional or an amazingly powered con artist. But the mythology this book was proposing ((view spoiler)[that Archer McFall was the second son of God (hide spoiler)]) was so foreign a concept that I wasn’t sure throughout the entire book whether it was meant to be truth or a lie. The eventual reveal was a huge surprise, although there were hints all along.
I liked the various points of view throughout the novel, that kept it fresh and allowed the author to provide lots of points of view with different bits of information missing, especially the Ronnie’s perspective. Overall, it was well put together and really kept me on my toes. So why the lower rating? Mostly the ending left me wanting and left me a little nonplussed about what exactly had happened after all that buildup. The epilogue – the final part with the antagonist – brought it up to 2 stars.
Overall, this wasn’t for me. I’m not fully giving up on the genre, though. And you might like this book if occult horror is up your alley – don’t let it falling flat for me keep you from what might be a great book.