My Programming Projects and Progress in 2020

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:

  • 84% commits
  • 9% issues
  • 7% pull requests

Let’s take a look at the various projects I worked on in 2020:

lastfmeoystats

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.

PyInvaders

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.

Amortization

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! 

Raspi_garage_alert

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. 

Podmanapis

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. 

Enviropi

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. 

TurtleSnowFlake

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. 

Prophecy Practicum

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.

Matrix-nio

As I have mentioned in a previous post, I started learning Python in order to contribute to an open source project. So it was great to contribute to this Matrix protocol API this year. Partway through the contribution, the original author started making some changes that broke my changes, so I stopped. I’ll need to see if I can finish my pull request or whether it should be abandoned.

Snap-In-Time

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.

Photo_stats

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.

Mathgenerator

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.

Pool Signup

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

Scratch

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. 

Our projects included:

MS Make Code

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.

Circuit Python

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

Adafruit

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. 

Arduino 

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. 

Raspberry Pi

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.

Python

Python Morsels

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.

Impractical Python

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. 

Ruby

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

Ok, after all that, what are my goals and hopes for 2021? Well, I currently have an issue in Github that I need to fix for the Extra Life Donation Tracker. Doing that is probably going to rekindle my desire to work on that project. It’s reached the mature stage, so I don’t have too many new features to add. Mostly I want to make some changes to make it more Pythonic and easier to maintain. I’m hoping to do that via the planned 5.3 and 6.0 releases this year. Maybe I’ll get to 7.0 and use flask to make a web GUI – especially combined with learning React or some other Javascript framework. I’d also like to help my friend out and finish the Prophecy Practicum project – probably by converting it to Django. I’ve also been considering redoing my flickr views project, but with PyQT, modern Pythonic programming, and using secrets properly so that I could post it to Github. I’d also like to make progress on Eric’s Comet Cleaners.

In 2020 I went somewhat nuts with programming Humble Bundles. I’ve got at least one book for nearly every major programming language. I’m currently eyeing a frontend web development bundle because I’m still stuck in the old HTML world (even pre-CSS). I haven’t done any Javascript since the days of Geocities and Tripod websites. Realistically, I’d like to have some time for Rust and Go – at least to get the basics down. Stretching (a HUGE stretch) I’d like to look at Kotlin (an improved version of Java that Google recommends for Android app development). I learned Java back in undergrad – Cornell’s equivalents of CS100 and 101 were Java (with a splash of Matlab). I do also have some Java books to see how the language has evolved. And, while we’re just shooting for the moon – I got some books to play around with Machine Learning. Between ML work in Python and computers getting stronger, even a Raspberry Pi can do some machine learning/ image recognition work. It’s something I’d like to play with in the future.Realistically I’m going to get through Brian Okken’s book on Pytest and then MAYBE get to Rust or Go by the end of 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.

I also have plans to continue working with the kids in Scratch and seeing if perhaps Scarlett is ready to try anything else – Javascript, Ruby, or Python. The other kids – I’ll have to wait until they’re old enough to type. I know with Scarlett, the annoyance of programming input when she didn’t know how to read or type was one thing that put her off early on. Also, we’ll have to see how the twins’ personalities match with programming or if I can even keep their interest. Maybe there are just too many distractions nowadays compared to when I was a kid and for TV there was only saturday morning cartoons and the video games were so hard you never played more than a couple hours. 

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.

The Right Programming Language can make a big difference

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.

2020 in Books

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:

  1. Clarkesworld Magazine #133
  2. A Man on the Moon – Andrew Chaikin
  3. Sat Fat Acid Heat – Samin Nosrat
  4. Starswept – Mary Fan
  5. Clarkesworld Magazine #134
  6. Over the Wine Dark Sea – H.N. Turtletaub
  7. Serious Python – Julien Danjou
  8. Soleil – Jaqueline Garlick
  9. Stronger than a Bronze Dragon – Mary Fan
  10. Summer Knight – Jim Butcher
  11. Tiamat’s Wrath – James S.A. Corey
  12. Rave Master Vol 1 – Hiro Mashima
  13. The Philosopher Kings – Jo Walton
  14. Rave Master Vol 2 – Hiro Mashima
  15. Clarkesworld Magazine #136
  16.  Clarkesworld Magazine #137
  17. The Bobs Burgers Burger Book – Lauren Bouchard
  18. Rave Master Vol 3 – Hiro Mashima
  19. The Princess in Black – Shannon Hale
  20. Clarkesworld Magazine #138
  21. Rave Master Vol 4 – Hiro Mashima
  22. The Princess in Black and the Hungry Bunny Horde – Shannon Hale
  23. Clarkesworld Magazine #135
  24. Rave Master Vol 5 – Hiro Mashima
  25. Throne of Jade – Naomi Novak
  26. The Cuban Table – Ana Sofia Pelaez
  27. Wild Cards III: Jokers Wild
  28. Rave Master Vol 6 – Hiro Mashima
  29. Bound – Jo Napoli
  30. Slaughterhouse Five – Kurt Vonnegut
  31. Rave Master Vol  7- Hiro Mashima
  32. Rave Master Vol 8 – Hiro Mashima
  33. Clarkesworld Magazine #139
  34. Ancillary Sword – Ann Leckie
  35. Rave Master Vol 9 – Hiro Mashima
  36. Clarkesworld Magazine #140
  37. Clarkesworld Magazine #141
  38. The Crimson Campaign – Brian McClellan
  39. Clarkesworld Magazine #142
  40. Jumpstarting the Raspberry Pi Zero W
  41. Getting Started with Soldering
  42. Jumpstarting the Onion Omega2
  43. Investigators – John Patrick Green
  44. Clarkesworld Magazine #143
  45. Spiced
  46. Don’t Stand Too Close to a Naked Man – Tim Allen
  47. The Mongoliad Book 3
  48. Hippopatamister – John Patrick Green
  49. The Gospel Reloaded – Seay Garrett
  50. The Jungle Book – Rudyard Kipling
  51. Ruby Wizardry – Eric Weinstein
  52. Indian(ish) – Priya Krishna
  53. Thrilling Adventure Yarns
  54. Little Women – Louisa May Alcott
  55. Bait  – Annie Nicholas
  56. Dawnshard – Brandon Sanderson
  57. A Knight of the Seven Kingdoms – George R.R. Martin
  58. The Brisket Chronicles – Steven Raichlen
  59. Apex Magazine Promo Issues 2020
  60. Snow Crash – Neal Stephenson
  61. The Red Church – Scott Nicholson
  62. Rhythm of War – Brandon Sanderson
  63. The Color of Magic – Terry Pratchett
  64. Firefight – Brandon Sanderson
  65. Twinmaker – Sean Williams

2020 in Music (Last.FM and Spotify listening trends)

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

bar graph of the top artists

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

bar graph of 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

bar graph of top artists overall

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 bar graph of the 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)


Spotify Stats

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:

  1. Tudd, GameChops – K.K. Cruisin’
  2. Mikel, GameChops – Ocarina of Time
  3. Chjolo, GameChops, Smooth McGroove – A Bell is Tolling
  4. DJ Cutman, Noisepop – Late Nite
  5. DeFalco, JMKM, GameChops – Saria’s Song
  6. Jonathan Goff, Hamilton Cast – You’ll Be Back
  7. Chjolo – Dub Splat!
  8. DJ Cutman, GlitchxCity – New Horizon
  9. Mikel, GameChops – Title Screen
  10. Daveed Diggs, Lesli Odom Jr, Okieriete Onaodowan, Hamilton Cast – What’d I Miss
  11. MxPx – Let’s Ride
  12. DJ Cutman, AZODi -Aerith
  13. Chjolo, GameChops – Hip Shop (From “Deltarune”)
  14. Leslie Odom Jr, Lin-Manuel Miranda, Renee Elise Goldsberry (and others) – Non-Stop
  15. Jonathan Groff – What Comes Next?
  16. Chance the Rapper, En Vogue, Ari Lennox, Kierra Sheard – I Got You (Always and Forever)
  17. Coffee Date, GameChops – Beneath the Mask (Persona 5)
  18. Renee Elise Goldsberry, Hamilton Cast – Satisfied
  19. Christopher Jackson, Daveed Diggs, Lin-Manuel Miranda, Okieriete Onaodowan – Cabinet Battle #1
  20. Chance the Rapper, Death Cab for Cutie – Do Your Remember

And that’s a wrap for 2020! If you’re still reading this far into it – thanks for reading! I’m excited for what 2021 may bring with new albums by Five Iron Frenzy and I Fight Dragons, among others.

Review: Twinmaker

Twinmaker (Twinmaker, #1)Twinmaker by Sean Williams
My rating: 4 of 5 stars

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)

View all my reviews

Review: Firefight

Firefight (The Reckoners, #2)Firefight by Brandon Sanderson
My rating: 4 of 5 stars

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.

View all my reviews

Review: The Color of Magic

The Color of Magic (Discworld, #1)The Color of Magic by Terry Pratchett
My rating: 3 of 5 stars

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.

View all my reviews

Review: Rhythm of War

Rhythm of War (The Stormlight Archive, #4)Rhythm of War by Brandon Sanderson
My rating: 5 of 5 stars

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).

View all my reviews

Review: The Red Church

The Red Church (Sheriff Frank Littlefield, #1)The Red Church by Scott Nicholson
My rating: 2 of 5 stars

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)) 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.

View all my reviews

Review: Snow Crash

Snow CrashSnow Crash by Neal Stephenson
My rating: 4 of 5 stars

This is the second time I’ve read this book. This first time was something around 20 years ago and it was definitely a 5-star book to me at the time. I’d never read anything like it. Reading it in 2020 is very interseting. Some of the things have come true and other, like the Metaverse, seem to be on the cusp of actually happening.
Given the way 2020 is going, Stephenson’s neo-liberalistic view of the world with burbclaves (an idea he continues in The Diamond Age) seems realistic and every time I read about for-profit prisons I think back on this book. Yet, for a book “in the future” it’s just so interesting to see the anachronisms – lack of smart phones, in fact stating that very few folks have computers or internet access, the fact that hackers would necessarily be affected due to being able to understand binary. Not so much anymore – there are many hackers like myself who primarily use higher level languages. Even game designers, who used to be the last holdouts of C are using C++ and C# (in Unity) and even Python-like languages (in Godot).

I used to hate Stephenson’s early books (like this one) for the way they abruptly ended. It’s definitely not just me – it’s almost a meme among his fans. But reading this again, it’s actually kind of a perfect ending to this book. The world goes on, mostly unaware and unaffected by the events of Snow Crash. It makes sense for the ending to leave so many loose ends. The world is a messy place, even moreso in the world of Snow Crash. Also, from a meta level, it was originally meant to be a graphic novel – that last line seems like the last line of a comic, movie, or TV show. It also makes sense for Stephenson being a member of The Long Now – a group that looks at time on a much longer scope (see his book Anathem for more on that).

This book, along with The Diamond Age were my entries into cyberpunk and cypherpunk. I still haven’t gone back and read Gibson and the other Godfather and Godmothers of the genre – I’m somewhat afraid they won’t age well. They awakened in me an understanding of how vast SF could be and that it could have something specifically tailored to someone like me. I think it still mostly holds up, especially if you look at it as taking place in an alternate universe (which it has to because characters have parents who were in WWII, it can’t take place in some indefinite future like other SF books). If you’re willing to look past some of the Zeerust, I think it’s definitely worth a read.

View all my reviews

Review: Apex Magazine Promo Issue 2020

Apex Magazine Promo Issue 2020Apex Magazine Promo Issue 2020 by Jason Sizemore
My rating: 4 of 5 stars

A mini issue to get folks ready for the relaunch of Apex Magazine. I truly enjoyed the stories in here and I can’t wait until the next real issue in January. Below is what I thought of each story:

The Legacy of Alexandria: a dystopia with elements of afro-futurism that seems every so prescient with the moment we’re in right now. The biggest bummer of the author now being an editor in Apex is that the magazine won’t be graced with this work for the foreseeable future.

Small hopes and dreams: a metaphor for being stuck in society that definitely makes sense for having been written 2 years ago when we were all waking up to the rural drug crisis.

Slush editor round table: If you’re a writer submitting to magazines, you should definitely read what these slush readers have to say about the slush pile in order to improve your chances of being selected as well as having a better understanding of why rejections don’t always mean your story isn’t any good.

View all my reviews

Review: The Brisket Chronicles: How to Barbecue, Braise, Smoke, and Cure the World’s Most Versatile Cut of Meat

The Brisket Chronicles: How to Barbecue, Braise, Smoke, and Cure the World's Most Versatile Cut of MeatThe Brisket Chronicles: How to Barbecue, Braise, Smoke, and Cure the World’s Most Versatile Cut of Meat by Steven Raichlen
My rating: 3 of 5 stars

When I first heard about this book, I was slightly skeptical. An entire book on brisket? Really? Isn’t it just (maybe) two ways? Dalmation rub and spicy rub. Maybe 4 ways if you count low and slow and Texas Crutch style. But no, Raichlen presents nearly every way to make brisket from around Planet BBQ; from Texas smoked to Jewish braises to sandwiches from all nationalities – it’s all here. The result is a book that takes you from the practical to the impractical (brisket chocolate chip cookies? really?) and gives a little history throughout to explain the history behind various dishes. I put lots of recipes on my list of dishes to try; I’m especially excited to try the German bierfleishe. He’s also got a bunch of recipes to use up leftover brisket including breakfast hashes, ramen, and salads.

Brisket is one of those cuts of meat that requires times to bring out its deliciousness and still remains one of the cheaper cuts (although it has slowly risen in price as more folks have discovered how delicious it could be). You should definitely check out this book to gain some new brisket recipes and discover how versatile it could be.

View all my reviews

Review: A Knight of the Seven Kingdoms

A Knight of the Seven Kingdoms (The Tales of Dunk and Egg, #1-3)A Knight of the Seven Kingdoms by George R.R. Martin
My rating: 4 of 5 stars

I really enjoyed this short story collection about Maester Aemon’s brother when he was a squire for Sir Duncan the Tall. I think, perhaps, because these short stories didn’t have to do the heavy lifting for the main narrative in A Song of Ice and Fire, they get to be lighter and more fun fare. At the same time, it does fill in a bit of backstory for Westeros and provide the ability for GRRM to give us examples of how history repeats itself.

The latter two stories function almost like mysteries in which the reader is trying, along with Dunk, to figure out why things aren’t quite exactly the way they seem. As that’s one of the genres I enjoy, it was fun to see it in a medieval setting.

It was also amusing that Dunk is constantly threatening to hit Egg and yet we never see it happen. I wonder if the joke is that he never does it or that he would deign to do that to a member of the royal family.

Whether or not you enjoyed the books in A Song of Ice an Fire, if you enjoyed most of A Game of Thrones (who could possible enjoy that last season?), you should check out this short story collection.

View all my reviews

Review: Dawnshard

Dawnshard (The Stormlight Archive, #3.5)Dawnshard by Brandon Sanderson
My rating: 5 of 5 stars

Disclaimer: I was a kickstarter on the campaign that provided an early copy of this novella a reward

This was a great book. It is also fascinating in the sense that, as I was reading it I kept thinking that you could about 80% read this book without having read the preceeding 3 books (and 1 novella) in The Stormlight Archive. You wouldn’t understand ANY of the implications of the final chapter or epilogue, but I think you probably could have enjoyed the story anyway.

And what was the story? In The Stormlight Archive Brandon Sanderson has a series of interludes that break up the greater story. These interludes mostly serve to provide a way for Sanderson to fill in backstory to the Planet Roshare, The Greater Cosmere, or would otherwise break the flow of the main novel. We had been previously introduced to Rysn, an apprentice trader. Through her interludes we gained a greater understanding of various cultures on Roshar. During one of her interludes she ended up losing the function of her legs. So, a great part of Rysn’s personal growth during this novella involves both seeing herself as not broken and gaining the confidence to ensure she is treated the way she wishes to be treated. In the introduction Sanderson mentions speaking with folks in the parapalegic community to make sure Rysn was written well. Her thoughts align with some training I’ve had at work about things that people who have full function of their appendages do (sometimes out of trying to be kind) that ends up making things worse for those riding wheelchairs or other conveyences. She is also dealing with imposter syndrome around the gift her master (in the sense of master/apprentice) gives her in the main books. So her character is on a great personal journey while on an actual journey to an island that has importance in the main books.

Then we have Lopen, a supporting character in the main series. Via the magic systems in The Stormlight Archive, he’s able to fly as well as having X-Men Wolverine’s healing factor powers, so he’s on the mission as protection. He’s a self-deprecating who spent a large chunk of the main series missing one arm. (I don’t remember if he was born that way or had lost it later in life) He’s mostly comic relief, although he does provide some contrasts to Rsyn. Before being healed, he also had to deal with some hardships due to only having one arm. So he’s able to bond with Rysn as well as being a bridge with some of the others.

Finally, a character we meet for like 5 seconds in the main series, Cord. She’s the daughter of a secondary character who comes from a civilization with a very rigid set of norms based on birth order. It’s fascinating and has lots of implications in the main series for her father. However, the best thing she provides in this book is a character who can see impending colonization and is trying to head it off. Her civilization guards a very important Cosmere-Level resource that “no one” on Roshar knows about. It appears knowledge has mostly been lost other than whoever first set her civilization to guard it. She fears that as other, more powerful countries find out about it, they may end up obliterating her culture. So many resonances with issues of historical colonialism and modern neo-colonialism.

This is all on top of an actual, physical journey the characters are on. The reward for the journey (on top of all those characters above growing) is a whole bunch of series-level and Cosmere-level knowledge, the implications of we don’t even truly yet know. (view spoiler)

I loved this novella and stayed up long into the night just to finish it. Chances are huge that if you are considering this book, you’re deep into the Cosmere. If you are, it’s a no-brainer. If not, this isn’t the *best* novella to jump into. You’re probably better off with the short stories that take place in the Cosmere – they’re collected in Arcanum Unbounded: The Cosmere Collection, but you can also get them individually here an there. I recommend those as a way of seeing if you like Sanderson and the planet-based magics of The Cosmere. Many of them (except Edgedancer which is also a Stormlight novella) stand alone perfectly without any other knowledge of The Cosmere to enjoy. If you want to read a book in the Cosmere I can very strongly recommend Warbreaker, which got me addicted to Sanderson’s writing and The Cosmere. It’s very standalone and some of its events are important later in Stormlight Archive books. Or, one that lots love although it’s *slightly* a bit more YA in tone The Final Empire.

View all my reviews

Review: Bait

Bait (Angler, #1)Bait by Annie Nicholas
My rating: 3 of 5 stars

If you’ve been following me for a while, you know I’m not a huge romance person. This is my second romance, and coincidentally, also my second paranormal romance. But I’ve got acquired some romance books via giveaways, Humble Bundle, Story Bundle, and Amazon’s Kindle First giveaways. I am trying to read “all” my books rather than constantly spending money on the next new thing. So I ended up getting to Bait.

Despite the cover, I was pleasantly surprised with the story. Were there romance tropes? Of course! Characters falling in love ridiculously quickly, slap-slap-kiss, non-consensual things (although not noncon sex – so depending on how specific your triggers are…maybe OK?), hot bods, etc. But I thought the story was pretty decent, even if it’s a “step backwards” for women compared to, say, Buffy the Vampire Slayer. Essentially, our main character is bait to attract vampires so the hunters can slay them. She’s been working this for a while, but THIS TIME she’s in over her head – both in terms of controlling her sexual attraction and in her job role. I thought Ms Nicholas created a good mythology around the vamps and the battle for power she ended up in the middle of. I also appreciated that, although part of a trilogy, it has a satisfying ending. Also, even though Goodreads has this book listed under Erotica (as well as Romance and other categories), I thought that the sex made sense within the context of the story and wasn’t the entire point of the book. In fact, there’s just two sex scenes in the entire book and they each last just a few paragraphs. In other words, this isn’t sex with a story glued to it. This is a story that happens to have sex.

I think if you like vampires and you like romances, it’s an easy recommendation and a relatively easy read.

View all my reviews