What a dreadful year, right? It’s seems a bit depressing to open up the new year by reviewing 2020, but I plan to keep things positive. A lot of great things happened to me this year despite hiding away in my apartment for the majority of it.
Table of Contents
Accomplishments in 2020
By now, it’s no surprise that 2020 was a train wreck of a year. Hell, it’s the first time since I started grad school that I actually had to take some time away from the site. That said, I still managed to accomplish a few things this year:
- Completed my Computer Science and Engineering Master’s
- Switched Over to Plausible
- Made some money through Amazon & Patreon
- Build up my YouTube channel
- Watched some anime
- Taught a course
- Started research for the first time
- Got a 4.0 for a semester
- Hit several Sample Programs milestones
- Completed Hacktoberfest
- Moved apartments to save some money
- Won a teaching award
- Quarantined a lot
- Earned my master’s
- Got a custom YouTube URL
By far, I’m proudest of the master’s degree. Part of me wishes I had done a BS/MS in undergrad because it would have been a lot easier than this degree. That said, I’m so glad it’s over.
Favorite Creations of 2020
In 2020, I spent most of the year trying to aggregate Python content. That way, I could build hierarchies of articles with networks of links to try to keep folks around longer. As you’ll see below, some of my favorite articles of the year were exactly these collection articles.
- January 2020: 8 Coolest Python Programming Language Features
- While this was sort of a silly list posts, it was my first article of the year to go “viral.” In fact, it got featured on the Python Bytes podcast.
- February 2020: Image Titler 1.5.2 Supports Logo Insertion
- It’s a silly thing, but once I was able to add logos to my featured image, I was feeling great!
- March 2020: 3 Ways to Compare Strings in Python
- My channel was relatively inactive this year, but I did post in March! I love making videos, and I hope I get more time to do so in the future.
- April 2020: Kicking Off the #RenegadePython Social Media Challenge
- While there hasn’t been much engagement, I was really proud of this idea, and I hope it gets some love in the New Year.
- May 2020: Phantasy Star Online: A Beautiful Mess
- Earlier this year, I found a server where I could play an old video game. Needless to say, I had to write about it.
- June 2020: What Is a Dictionary in Python?
- One of my favorite things about writing this year has been creating articles like this on broad concepts where I can link all sorts of related work.
- July 2020: How Long Does It Take a Canonical URL to Work?
- I ran into a problem this year where some of my reposted content was getting ranked first. I decided to investigate to see how long it takes a canonical URL to rank the proper content.
- August 2020: 3 Ways to Comment Code in Python
- This is the only other video I managed to publish this year.
- September 2020: Google Isn’t Even Trying to Rank Decent Computer Science Content
- As I rant regularly about the quality of content on Google, I figured I’d launch my own investigation. Turns out it’s worse than I thought.
- October 2020: Can We Fit Rock Paper Scissors in Python in a Tweet?
- I had a lot of fun toying with code golf earlier this year, and so did some of you folks. This was another one of my “viral” articles.
- November 2020: 10 Answers to Google Autocomplete Questions About Python
- Yet another list post that I had a lot of fun writing. What can I say? Python is just fun to talk about.
- December 2020: I’m Out of Steam
- I only wrote two articles in December, but this one is probably the most important article I wrote all year. Take care of yourselves, y’all.
Next year, I plan to keep the trend going. If possible, I’d love to make more videos, but we’ll see how much time I have.
Projects in 2020
Like every year, I spent some time developing code. This year, I expanded some of the usual projects, like Sample Programs and the Image Titler, while adding a few new ones!
Sample Programs in Every Language
When I kicked off this project in 2018, I was pumping out code every day. These days, I tend to wait until Hacktoberfest to get community support.
However, even with community support, maintaining this repo is a challenge. Fortunately, I always get support from @auroq who maintains Glotter and helps with testing. This year, he helped me lock things down by setting requirements for new projects.
Together, we merged a lot of pull requests. As a result, we were able to hit several milestones including:
- Sample Programs 25 Project Tests Release
- The Sample Programs Website Automatically Generates Featured Images
- The Sample Programs Repo Squashes Commits
- Sample Programs 500 Code Snippet Release
Overall, I’m quite pleased with the progress, and I’m excited to keep development moving in the New Year. If you’re interested in checking out the live project, check it out here.
Back when I was setting up this site, I was working with my wife (girlfriend at the time) to put together featured image templates, so I could generate features images more quickly. Of course, I find repetitive process to be a huge pain in the ass, so I eventually automated it using Python.
Prior to this year, that tool had been completed and fleshed out for the command line. Then, early this year, I decided to add logo insertion in the bottom right corner of the images. By April, I was ready to take the Image Titler to a new level with versioning and batch processing. Hell, I couldn’t even stop myself from adding logo color detection for the bars.
Eventually, I decided it was time to kick off a GUI version of the application, so anyone could use it. From there, the features just kept rolling out. For instance, I put together custom fonts, data preloading, and custom image sizing.
Overall, I’m really happy with where this tool is, and I’m looking forward to getting other folks to use it. If you’re interested in seeing it live, check it out here.
How to Python Code
As many of you probably already know, How to Python is a The Renegade Coder series of article about simple Python problems. Well, earlier this year, I also created a GitHub repo to store the solutions—among other things.
At the time, I was really into Jupyter Notebooks, so I used those to store the code. That said, I think the selling point of the repo is the table of articles with publish dates as well as various links to articles, videos, challenge solutions, and notebooks.
I am not super active with this repo, but I find it helpful for folks who want to interact with me and my content. Also, it helps me back up the claim that my solutions work, and they serve as a nice check for any code that might break.
Once again, I’m a big fan of this repo because it’s so simple. If you want to see the it live, you can check it out here.
PSO2 Color Picker
One of the cooler projects from this year was put together just after Phantasy Star Online 2 finally made its American release in May. Despite having over a decade of development time, this game transported us back to 2012 with a lot of weird gaming quirks. One of those quirks was the color selection tool which didn’t allow people to select the exact color they wanted.
While this issue wasn’t that big of a deal to me, a friend of mine was trying to recreate one of their favorite manga characters, and the existing tool wasn’t cutting it. As a result, he had an idea: what if there was a program that could show the user where to click for the color they wanted? Thus, the PSO2 Color Picker was born.
This was one of those projects where I got to really show off the power of Python to my friend. Within an hour, we were able to go from concept to prototype. More recently, the tool was made into a pip package.
While I haven’t played PSO2 in quite awhile, I was very pleased with how this tool turned out, and I hope folks are getting some use out of it.
Beyond all the projects above, there was a ton of other projects I worked on this year. For example, I developed two sets of software for my master’s project. Likewise, I put together a simple web app for a hackathon. And, I even toyed with a sample programs git visualizer to show the change in programming languages over time.
That said, now that I’m a full time engineering education student, I’m not sure I’ll have any compulsory coding activities. It seems like the future of coding for me will be entirely self-directed which should be a lot of fun. Let’s see what kind of wild side projects I get into in the new year.
Metrics 2017 – 2020
One of my favorite parts of the yearly review is looking at how the site has grown and changed over the years. This year, we saw a major dip in views. Despite that, I’m very happy with how things turned out.
Page Views: Months and Years
For the last few years, I had been keeping track of page views through Jetpack. However, when I realized how slow my site was running because of Jetpack, I decided to get rid of it and rely solely on Google Analytics. In my quest for speed, I ended up dropping Google Analytics for Plausible. As a result, this year’s page views come from various sources. From January to May, page view counts come from Google Analytics. Meanwhile, everything since then comes from Plausible.
While my overall page views have dropped since 2019, I’m actually quite a bit more pleased this year because the views are from a much more diverse set of articles than years past—as we’ll see later.
Top Posts & Pages
Unfortunately, because I switched analytics providers, I don’t really have any easy way to calculate top posts this year. As a result, the 2020 column is only coming from data for the second half of the year via Plausible. To account for this, I just extrapolated the count for the whole year by multiplying by 12/7.
|#1||Home (2,908 views)||How to Check if a File Exists in Python (27,245 views)||How to Check if a File Exists in Python (148,399 views)||How to Check if a List is Empty in Python (19.9k views)|
|#2||Archives (2,093 views)||How to Sum Elements of Two Lists in Python (5,402 views)||How to Check if a List is Empty in Python (65,644 views)||Python Code Snippets for Everyday Problems (14.4k views)|
|#3||About (430 views)||How to Convert Two Lists into a Dictionary in Python (2,697 views)||How to Sum Elements of Two Lists in Python (14,047 views)||How to Invert a Dictionary in Python (9.3k views)|
|#4||World Domination Checklist (282 views)||How to Invert a Dictionary in Python (1,944 views)||How to Invert a Dictionary in Python (13,326 views)||How to Performance Test Python Code (8.6k views)|
|#5||Computer Science Email Tutoring Now Offered (197 views)||Archives (1,525 views)||How to Convert Two Lists Into a Dictionary in Python (10,069 views)||How to Print on the Same Line in Python (8.2k views)|
Now, what I love about this new set of articles is that I don’t have a single one dominating my view count. Despite the lower counts overall, this is actually really good news. After all, if I happen to see a drop in view count on any of these pages, I’ll hardly notice. That cannot be said for years past. Just take a look at the ratio between the 1st and 5th post for previous years:
- 2017: 14.76
- 2018: 17.86
- 2019: 14.73
- 2020: 2.42
In the past, it would have taken at least 14 articles at roughly 5th place view count to replace my best post. These days, I just need a couple articles to make up the difference. In other words, my view counts are relatively stable now. Take that, Google!
Top Sources of Traffic
Once again, I don’t have easy access to this data this year, so I extrapolated using Plausible. Regardless, here are my top sources for 2020.
|#1||Google (2,271 views)||Google (38,925 views)||Google (259K views)||Google (92.9k views)|
|#2||Facebook (418 views)||GitHub (809 views)||DuckDuckGo (4,809 views)||Bing (22.3k views)|
|#3||Twitter (64 views)||Bing (451 views)||Bing (4,775 views)||DuckDuckGo (19.2k views)|
|#4||LinkedIn (30 views)||Google+ (266 views)||WordPress Android App (1,289 views)||Yahoo (3.9k views)|
|#5||StumbleUpon (20 views)||WordPress Reader (247 views)||GitHub (967 views)||Ecosia (3.1k views)|
|#6||Yahoo (14 views)||Twitter (246 views)||Yahoo Search (777 views)||Dev (2.2k views)|
|#7||Bing (12 views)||DuckDuckGo (215 views)||Ecosia (522 views)||GitHub (1.3k views)|
|#8||GitHub (9 views)||Facebook (193 views)||Twitter (289 views)||TopDev (810 views)|
|#9||WordPress Reader (8 views)||Instagram (86 views)||Qwant (160 views)||Edabit (550 views)|
|#10||DuckDuckGo (3 views)||Yahoo (85 views)||Yandex (144 views)||Qwant (500 views)|
One big trend I’m noticing from this year is that while Google hasn’t brought me nearly as many views this year (see here for a rant about that), I have quite a bit more diversity in views from previous years. In fact, while my five sources are all from search engines, I get quite a bit of traffic from places like Dev and GitHub as well. Perhaps unsurprisingly, those places yield better visit duration as well.
In the future, I’ll be looking to build on this diversity by continuing to provide the types of content y’all want to read (and watch).
At this point it goes without saying, but the statistics for this are also extrapolated from Plausible. If I got some free time, I’ll try to update 2020’s numbers with some more accurate estimates. At any rate, here’s the list of top countries for 2020.
|#1||United States of America (4,037 views)||United States of America (20,949 views)||United States of America (115,649 views)||United States of America (57.6k views)|
|#2||South Korea (578 views)||India (6,230 views)||India (33,496 views)||India (20.9k views)|
|#3||France (542 views)||United Kingdom (2,581 views)||United Kingdom (14,206 views)||Germany (14.2k views)|
|#4||Russia (221 views)||Canada (1,716 views)||Germany (13,664 views)||United Kingdom (10.5k views)|
|#5||Germany (220 views)||Germany (1,517 views)||Canada (11,003 views)||Canada (7.7k views)|
|#6||Philippines (189 views)||France (1,066 views)||France (8,636 views)||France (5.3k views)|
|#7||Canada (183 views)||Australia (807 views)||Brazil (6,097 views)||Australia (3.8k views)|
|#8||India (173 views)||Israel (718 views)||Australia (5,445 views)||Netherlands (3.6k views)|
|#9||Japan (150 views)||Brazil (685 views)||Netherlands (4,847 views)||Brazil (3.3k views)|
|#10||Cambodia (145 views)||Netherlands (611 views)||Spain (4,237 views)||Russia (2.7k views)|
With a decline in views from the previous year, it’s no surprise to see a decline in views across the board for the top countries. That said, it’s interesting to see Germany overtake the UK as well as Brazil dropping two spots. Also, it looks like Russia is checking out my site a bit as well. How cool is that?
Top YouTube Videos
While I technically started my YouTube channel last year, I forgot to include statistics about it here. I suppose it’s better late than never!
|#1||3 Ways to Check If a List Is Empty in Python (232 views)||3 Ways to Element-Wise Sum Two Lists in Python (974 views)|
|#2||4 Ways to Reverse a Dictionary in Python (146 views)||4 Ways to Reverse a Dictionary in Python (571 views)|
|#3||3 Ways to Element-Wise Sum Two Lists in Python (142 views)||3 Ways to Map Two Lists to a Dict in Python (353 views)|
|#4||3 Ways to Map Two Lists to a Dict in Python (44 views)||3 Ways to Check If a List Is Empty in Python (214 views)|
|#5||The Definitive Guide to List Comprehensions in Python (37 views)||4 Ways to Get the Last Element of a List in Python (143 views)|
While I haven’t exactly been active on YouTube, I’m quite pleased with these results, and I plan to fill the channel out more in the future. So far, I’m sitting at 111 subs!
This year, I made money in a few different ways. Obviously, my main source of revenue is Patreon, but I also made a bit of money on Amazon. To start, here’s the Patreon revenue.
Likewise, here’s the Amazon revenue. This is a bit tricky to report on because most of the income comes from Trill Trombone. That said, all the money is coming to me, so here’s how that’s going.
While it’s not much, I’d say this is pretty good for passive income. Overall this year, I made somewhere around $300 which is roughly what I made last year. Hopefully, we can keep this growing in the new year.
In the past, I made ad revenue, but I don’t really do ads anymore. That said, here’s the data for those interested (aka my future self).
Previously, I also briefly had a membership site before I shifted over to Patreon.
Beyond that, I’ve made money here and there in other ways. For instance, I’ve had a shop which maybe sold one product over the years. In the future, I might try to reintegrate ads, but only if I get a significant amount of traffic. Otherwise, the focus will be writing as always!
Last year, I reported on a few statistics that didn’t make it into this edition of the yearly review—specifically, content length and daily averages. While personally I think daily averages are a bit redundant, I’m definitely interested in content length. That said, I don’t know how to easily compute either without some of the tools I’ve used previously. As a result, I’ll just dump both tables here for record keeping purposes.
Perhaps sometime in the next year, I’ll find a way to fill these out. Until then, that’s it for the usual statistics!
A Look Into 2021
With all that out of the way, let’s just say that I’m feeling pretty good about 2021. With the COVID vaccine on its way, we could be seeing some sort of return to normalcy in our future. For me, that means getting some regular exercise and possibly a distinction between home and work.
As for the website, I’m just going to keep writing. Like last year, my focus for the new year will be mostly Python content. Hopefully, that translates into videos, but we’ll see how much time I have as a PhD student. In the meantime, I appreciate y’all sticking around. See you next time!
The backbone of any Python program is decision making. In other words, given some input, what should our program do? Today, we'll answer part of that by learning if statements.
The first step in opening a jar is to get a jar. But, how do we do that? Let's let recursion figure that out for us.