Growing up as a kid I looked forward to reading the newspaper comics everyday. I ate breakfast and read the day’s comics in the same order always leaving the best for last. Calvin and Hobbes was always something I looked forward to and I was sad when Bill Watterson decided to move on from making it. I didn’t understand what it’s like to work on the same thing for 10 years so it didn’t make sense to me, but as an adult I get it.
Five years ago I read the entire Calvin and Hobbes collection and wrote down which comics were my favorite. The comics still held up and I found a bunch that I liked, but none quite as much as the very last one that was made. The comic has taken on different meaning for me as I’ve grown older – at first it made me sad because the comic was over, but now it makes me happy because Watterson was starting off on a new adventure. Ashley bought me a framed copy of it a couple of years ago for my birthday and we have it hanging at the bottom of our stairs.
I’m pretty deliberate about the tattoos I get, so even with all of this history and feelings about the series and the specific comic, it still took me a year or two to finally get a tattoo of it. I’m so very happy with how it came out and how Christopher Gay was able to take the comic and form it to my arm in a unique way.
Catarang is a Continuous Integration (CI) server that I’ve been working on for the past two years in my spare time and have made a ton of progress on in 2016. CI servers, for those who don’t know, do repetitive tasks like compiling code every time a change is checked in or automating pushes to production servers. The most popular one out there is Jenkins, but there are a ton of other options listed out on this excellent Wikipedia page: Comparison of continuous integration software. In this post, I’ve written up the progress I’ve made on Catarang in the past year and what I’m looking to do with it in the future.
Why build a new CI Server?
A question I often get when I talk about Catarang to people is why build a new one if there are a bunch of options out there already? The two main reasons are that none of the CI Servers out there fulfill all my needs and I wanted a project to learn Go on. I’d heard good things about the language and had tried out the little playground they had, but I learn best when I actively use the language on a project. Throughout the two years I’ve been working on Catarang, I’ve fallen in love with Go and find it an utter joy to program in. Once I got a hang of the language (which was very quick), I’ve been able to get a surprising amount done with it with a limited amount of head scratching issues coming up.
I’ve also learned a ton about CI servers and unique issues surrounding how they work. These things are incredibly complicated and take a lot of fiddling to get right! Lastly, it’s been fun to build a large scale tool by myself and be able to rework all of the code at the drop of a hat if I don’t like how it’s structured. I try to keep that to a minimum and make constant forward progress, but at times it’s beneficial to take a step backward and to the side so that it’s easier to go forward in the future.
Progress in 2016
The amount of energy I had to work on Catarang fluctuated quite a bit this year due to work, illnesses, life issues, and politics. There were several weeks where I worked on it non-stop in my free time and then there were several months where I didn’t have any energy to even think about it.
This makes sense considering I’m only working on my own time and not being paid for it, but there were certainly days when I felt guilty about not programming on it when I had wanted to. Catarang as a whole has only 105 commits, so with 81 of them coming in the 2016, it’s easy to see that I did a significant chunk of work on the project this year.
Catarang is still in its infancy, so I wouldn’t suggest anyone start using it yet, but I am proud of how the features are coming together and it’s starting to feel like a real project. Here are all of the features I worked on this year:
I started off building all of the functionality straight into Catarang for git, running arbitrary commands, and saving off artifacts, but realized it’d be better to have a defined interface to make writing plugins easier. I’ve gone through several iterations and am at a middle point with this, but am happy with where I am right now. Each plugin is completely segregated from the rest of the code and I eventually plan on moving them outside of the project itself so that they can be updated independent from Catarang itself. I briefly looked at Hashicorp’s go-plugin and even got a prototype working, but stopped going down that route as it felt like I was going a bit too deep into that system and ignoring other necessary features. Right now plugins are as easy to add as filling out a basic interface and adding a single line to the plugin list to register it.
Job Template and Instantiation
I created a job template so that you can create a job via a single file that you keep in your depot. Catarang will pull in the appropriate plugins from the plugin system and run the commands that you specify in the template. Catarang can already handle when you check in a change to the config file and will rebuild the job based off of the new template, which took a bit of work to allow. This is the number one feature that I had originally wanted in a self-hosted CI server that wasn’t available in the one I was using at work, so it’s nice to have made really good progress on it. The template itself is pretty simple and this is what Catarang’s currently looks like:
It’s a bit verbose since it’s in JSON and that will likely be changed at a later point in time, but it’s a great start.
Each time a job runs, it creates a new instance of itself and saves off all of the log files associated with running that job. Each instance is separate because if you change a job’s configuration template, you’ll get very different output and want to keep that information around. It’s also useful to go back and see why certain runs of the job failed and why some succeeded. This feature has changed quite a bit over the past year due to creating the job template and the plugin system, but it’s at a pretty good place right now.
Unique Logging of Commands
I’m pretty proud of how Catarang logs all of the commands it runs. For every command it keeps
A list of the arguments used to run the command
A high level description of what’s being run and the plugin that ran the command
The output from the command segmented into the Standard Out and Standard Error sections
Because of that last part, I can highlight on the CI server (and in emails) which parts actually failed so you don’t have to go digging for it when it does! I haven’t seen any other CI server do this, so it felt good to get in. It was a bit difficult to get in as I learned there are some deep, dark secrets of StdOut and StdErr that I didn’t know before. Did you know you can get interwoven lines of output in your console that look like this:
Yellow is a standardRed is an error that comes between a single output line single line of output
Yikes! It gets even worse if you have sub-commands being run in parallel and only a single output window.
A Web Server
One of the awesome parts of Go is that it’s suuuuuper easy to set up a web server and serve content. The most basic setup is a single line of code, and a more complex example isn’t far from that. I know next to nothing about web development, so I have a very simple web interface for Catarang that allows you to add new jobs, run them, delete them, clean them, and see all of the output from each job instance. This is the largest thing that will have to be worked on before I release it to the world, but it’s also the least important until I get a solid feature set up and running. I used to have fancy websockets working so the site would live-update, but that broke at some point and I didn’t care enough to go back and fix it since so much of the architecture of the program was changing.
In 2017 I’m going to work much more on making Catarang stable and usable for the general public. It’d be neat to be able to release a very alpha version and start getting feedback on it, but that’s a bit of a stretch goal.
As for the next features I’m going to be implementing, a lot of it will focus on expanding out the Job’s capabilities. I’d like to add the ability to chain multiple jobs together in a pipeline using if/or/and blocks. Getting this right is the most important thing for a CI to be useful to users, so it will likely be quite a bit of iteration before I’m happy with it.
I’d also like to start expanding the plugins to other things people might find useful like Slack notifications and emails. There’s a long way to go, but if I implement some of the basics that most people are going to want, then I’ll get some traction in order for people to want to create their own to flesh out the parts they want but I haven’t made yet.
Tests are something I have a small amount of, but not nearly enough. I haven’t bothered with them since I’m more focused on building out a prototype, but now that it’s getting a bit larger they’re becoming much more useful. I’m going to be aiming for a fairly high test coverage percentage and we’ll see where I get with that.
Lastly, I’d like to start fleshing out the UI on the server into something that’s not a programmer’s prototype. I’m not very good at web development mostly due to lack of experience, so this either entails me finding someone that wants to work on this project with me (for free) or spending a lot of time learning how to build a highly interactive website from scratch. Both seem fairly difficult to do, so we’ll see how this goes.
I’m still super excited to be working on Catarang two years after I first came up with the idea, which is great. I’d love to be able to release it and have people other than myself use it on a day to day basis so I keep building it with that in mind. I know that if I got some dedicated time to work on it I could really build it up into something special, so I’ll have to slowly work in that direction since I can only use spare time right now. If you want to keep up to date on my progress you can follow me on Twitter or follow Catarang on GitHub.
I don’t normally read long standing Marvel series (I’m much more of a self-contained 10 book series kind of person), but something about this comic called to me. Ms. Marvel is about a Muslim girl growing up and realizing that she has super powers. She fights the assortment of bad guys you’d expect, but it’s all new because of the different perspective it has. It’s definitely on the lighter side of comic books, so pick it up if you want typical super hero fare with a slightly different perspective.
I’ve taken a number of physics classes over the year, but nothing in those classes prepared me for this deep dive of physics knowledge. It was a bit hard to follow when he was talking about quarks and their weird electrical charge and spin, but it still gave me a good basis for better understanding the theory of relativity and other physics peculiarities. It was also fascinating to see the history of physics research and how wrong (and right!) people were in the past.
This book is a series of silly questions like “How many AK-47s would it take to lift a person off the ground with the recoil caused by firing” and equally silly, but true answers. Both Ashley and I tore through this book because it was thoroughly entertaining and insightful. I can’t wait to pick up Munroe’s next book because this was one of my favorites this year. Highly recommended.
Everyone I’ve talked to about this book has told me how much it would wreck me and make me sad. I don’t know if it’s because I’ve played so many survival horror games or watched a bunch of sad movies, but it didn’t do that to me. Sure, there was some sad stuff that happened in The Road, but it wasn’t anything I haven’t seen before. Maybe it’s one of those things similar to Citizen Kane where it was original and groundbreaking in its time, but if you experience it now, it doesn’t feel as impressive. Good book, but didn’t live up to the hype.
Becoming Nicole is a great book to read to start to understand the struggle for transgender rights. Nicole and Jonas are identical twins, but Nicole is transgender while Jonas is not. This book is the story of their family, their community, and how learn what being transgender is all about. It’s also a study in how people tend to be scared of things they don’t understand. Becoming Nicole is an easy, if frustrating read and I suggest everyone read it as soon as possible.
If you haven’t read this book, click this link and buy this fucking book, NOW. The Martian is easily my favorite book that I’ve read in the past ten years and it’s not hard to understand why. Science. Explosions. MacGyvering things. Science. Space. Exploration. Did I mention Science? XKCD explains it perfectly in this comic. It’s a book about overcoming an environment that wants to kill you while being scientifically accurate and funnier than I ever expected. So fucking good.
Here’s all the books I read this year:
A Brief History of Time – Stephen Hawking
Alone on the Wall – Alex Honnold and David Roberts
Becoming Nicole: The Transformation of an American Family – Amy Ellis Nutt
Delusions of Gender: How Our Minds, Society, and Neurosexism Create Difference – Cordelia Fine
East of West, Volume 1: The Promise – Jonathan Kichman and Nick Dragotta
Flash Boys: A Wall Street Revolt – Michael Lewis
Flying the SR-71 Blackbird: In the Cockpit on a Secret Operational Mission – Richard H. Graham
Footnotes in Gaza – Joe Sacco
iZombie: Dead to the World – Chris Roberson
Lumberjanes Vol. 1 – Noelle Stevenson, Grace Ellis, Brooke Allen, Shannon Watters
Ms. Marvel Vol. 3: Crushed – G. Willow Wilson
My Beloved World – Sonia Sotomayor
Stringer: A Reporter’s Journey in the Congo – Anjan Sundaram
The Hero of Ages: Book Three of Mistborn – Brandon Sanderson
The Martian – Andy Weir
The Mindfulness Survival Kit: Five Essential Practices – Thich Nhat Hanh
The Road – Cormac McCarthy
Top 10 – Alan Moore, Gene Ha, Zander Cannon
What If?: Serious Scientific Answers to Absurd Hypothetical Questions – Randall Munroe
For whatever reason, I didn’t beat, or even play, that many games this year. While I didn’t play any AAA games, it sounds like there were some great ones (Witcher 3, Mario Maker, etc). I was busy buying a house, transitioning into a new role at work, and dealing with some health issues. 2016 hopefully won’t have any of that, so I should be able to play more games! Unfortunately, none of the games I played stood out as games that I’ll remember in 10 years. Regardless, here’s the list!
Not only was this game the prettiest I played this year, it’s one of the prettiest games I’ve ever played. I was surprised when I heard they used Unity to make it as I didn’t think Unity was capable of driving a game like this. As for the gameplay, I love me a Metroidvania game, and this is no exception to the rule. The gameplay itself isn’t that inspiring, but it’s worth dealing with to appreciate the stunning visuals that this game constantly throws at you.
I’ve loved everything Binding of Isaac related for several years now, so when I heard there was an expansion to Rebirth (which I played over 140 hours of), I was excited. When I finally got it and started playing, I realized that I had already played pretty much all of that game that I wanted to. It had a couple of new mechanics and game modes, but nothing really inspired me to play it the way that the previous two games did. It’s like getting an ice cream shake after you’ve already eaten an ice cream sundae. Sometimes, you just can’t eat anymore ice cream.
Game that moved me (emotionally and physically) in 5 minutes: Bounden
I only played this game for a total of about 5 minutes at GDC, but it was one of the most distinct experiences I’ve ever had with a multiplayer game. You and another person hold the same phone and contort your bodies in dance moves in order to beat levels. I played it with the guy who made it, and it was surprisingly emotional; after we finished, I felt like I had had a moment with my partner in a way that I’ve never felt after playing a video game. I danced with a stranger and felt a closeness with him that is very rare with someone I just met. Bounden is not a particularly good game, but I’ll remember that experience for a while.
First off, this game has better controls and handling than any other mobile game I’ve ever played. I thought gamepad type controls on a mobile phone would always be a disaster, but I was completely wrong. I never felt like the game cheated me and I always felt in control. That is a HUGE accomplishment for Red Lynx. If I could have purchased this game for $40, I would have done that. Unfortunately, this game reveled in its F2P mechanics. It had timers, an energy mechanic, crafting, multiple currencies, daily challenges, a leveling system, and a multiplayer component that required constant monitoring. The game was structured so that you could do everything without paying money, but it would take you AGES to do it. Some upgrades took over 144 hours to complete. I found myself playing the game constantly so that I could collect parts to upgrade my bikes so I could compete online. Instead of advancement being based on skill, it was based on time and money spent. It felt cheap and I realized I wasn’t enjoying playing it, even though I played it more than any other game this year. Trials Frontier is a good game wrapped in shit no one wants to deal with.
I’m always on the lookout for games my wife and I can play together, and I thought Lovers would fit that bill. It’s cute, it’s co-op (instead of being versus), and it has cats in it! Unfortunately, the way this game plays in co-op mode is similar to how it feels to drive in a country that doesn’t speak your language while completely lost with no GPS. The game is quite cute and the weapons are neat, but the gameplay is a bit lacking. Because of how the spaceships are set up, I always found myself piloting and having the AI fire for me. I wish that the ship was a bit more automatic in how it responded to threats instead of having to manually dictate what should happen. Overall the game is quite polished, but just not quite what I wanted out of it.
If there was any game that I played this year that could be said to be fully polished, it’d be Snakebird. This game has to be polished considering you’re going to be spending most of your time cursing while playing it. I have never played a puzzle game that makes me feel inept on the fourth level before. Snakebird is incredibly cute and easy to pick up, but oh so fucking hard to actually beat. After playing a single level for an hour to beat it, I would feel hugely accomplished. One of the things I disliked about the game was that I often knew how to beat a level, but it required very specific movements. I would get frustrated and look up the solution only to find out I had it correct, I just had to turn left once instead of right in ONE spot. I don’t think this game is for everyone (it’s one of the hardest games I’ve ever played), but I enjoyed the time I had with it.
For reference, here are the games I beat this year:
Knights of Pen and Paper
Lara Croft Go
You Must Build A Boat
Dr. Langeskov, The Tiger, and The Terribly Cursed Emerald: A Whirlwind Heist
The Talos Principle
Lovers in a Dangerous Spacetime
Ori and the Blind Forest
Here are the games I played but didn’t beat (or couldn’t “beat”):
The Binding of Isaac: Afterbirth
Similar to last year, I only played two AAA games and tended to focus more on indie games that had unique gameplay or themes. I had a bunch of games that I started at the end of the year, but didn’t really get into because the first game in my list destroyed my ability to play anything else. With no further ado, here are my most memorable games of 2014!
This game was a short term addiction. I played it for 157 hours in the span of two months, got 100% of the achievements (which only 0.9% of players accomplish), and got ridiculously good at this game. I played the original in 2011 for at least 100 hours, so it’s easy to say that Rebirth was a huge step up for me to have played it as much as I did. The entire game was redone to make it a silky smooth experience and a bunch more was added that the original didn’t have. I can’t recommend this game enough; it’s a combination of The Legend of Zelda original meets fucked up Christian theme meets bullet hell meets randomization. Fantastic stuff.
I thought this two color game would be something easy to write off. I thought it’d be a waste of time. All you do in this game is try to put the ball in the hole. The game doesn’t change. So why am I still playing? Does the score matter? It doesn’t seem to. Does it matter if I fuck around and don’t try very hard? I seem to be getting good at this game. Wow, that was a difficult hole, but I made it! This doesn’t really seem to have a purpose. I don’t get it, why am I still playing this game? This is quite relaxing, I almost feel in a zen state. Wow, a cactus!
Not only was this game stunningly gorgeous, it was also an amazing experience. I loved the dynamic of the two main characters – it felt much more real than most games do. I actually cared when they got hurt. The zombie theme got a little old, but the game kept me enthralled all the way to the end. I highly recommend this game, especially if you can pick it up on the PS4. For 2015, I’ll have to try out the DLC as I hear it’s quite good.
I loved Capybara Games’ last big release: Superbrothers: Sword & Sworcery EP, so when I saw trailers for Super Time Force I was ecstatic. It looked like everything I wanted in a throwback to the old Contra and Metal Slug style games. Unfortunately, it turned out to not be anything like what I thought it was going to be. It was more of a puzzle game about how to progress through a level and save your guys than it was a bullet dodging side scroller. Sounds fun, but in practice it didn’t play nearly as well as I thought it should have. Most of the heroe’s abilities I didn’t care about, which made the game feel lackluster even though it had exceptional quality all over the place. Sadness.
The way this game was made astounds me. You can beat it in the first ten minutes you play it, but that doesn’t stop you from replaying it over and over and over again. It is very polished and was a delight to play. Some of the situations I found myself playing through in The Stanley Parable were completely unique from any other game I’ve ever played. Sometimes I couldn’t tell if the game was fucking with me or if I was in on the joke, but I enjoyed it all the same. Everyone will like this game, and if they don’t, they have something wrong with their sense of humor. So very good.
I didn’t know what to expect from this game since I got it out of a Humble Bundle and hadn’t heard of it before that. I watched a trailer before playing that showed me a cute style, but not much else and decided to give it a try. I couldn’t have possibly guessed that Papo & Yo would affect me the way that it did. There is a very, very short list of games that have been able to make me feel a specific emotion powerfully, and Papo & Yo is high on that list. The gameplay is a bit light, but the childlike wonder of the game shines through like no other game I’ve played. The makers of this game were going for something specific, and they hit it out of the park. I don’t think this game is for everyone, but it is easily the most memorable game I played of 2014. Even though I played The Binding of Isaac: Rebirth 50 times longer than I played Papo & Yo, this game is more memorable to me.
For reference, here are the games I beat this year:
Papo & Yo
The Binding of Isaac: Rebirth
The Stanley Parable
To The Moon
The Last Of Us
Super Time Force
Here are the games I played but didn’t beat (or couldn’t “beat”):
Joe Danger 2: The Movie
Legend of Grimrock 2
Risk of Rain
Road Not Taken