The Github Maximizer

Github is a portfolio for people in the tech industry. Looking at the typical profile, I came to loathe contribution graph which really only signals that your organization uses Github. For everyone else, it’s a sparse graph of punctuated contribution. With this project I highlight the deficiencies in such summary representations of your merits by automating the act of contributing.

To start, I read through Github’s documentation to learn how they counted your contributions. The gist of it is that any commit or comment associated with your account will count as a contribution. I then ran some experiments to test this commit parsing. How do they link commits to your account? What time stamps do they use? Surprisingly, I found that they used the time stamp of the commit for the time stamp of the contribution. By messing around with the commit times, I was able to make contributions before Github even existed. This means there’s no check against real world time and I can touch up my contribution graph for any day in the past.

Given this, the approach is simple. My script will create a new Github repository, generate an initial commit tree, and push the commits upstreams. A Poisson distribution generates time stamps for the commits to impart a more organic look to the graph. After that, we go into Cron mode and push new commits every night.

To create that initial repository I used this Github module to outsource the OAuth and REST calls. For the random distribution used Numpy.random. Shell commands to git created the commit tree and pushed the changes upstream.

I’m pleased with the results and my contribution graph looks great now. Originally, I wanted to do some random code generation but I liked the idea of people discovering this project quickly and getting a chuckle out of it

github_maximizer on Github

Private Server Upgrade

I started this blog 4 years ago to learn how to run a website by signing up for a shared hosting plan. Since then I’ve learned how to manage WordPress, work with DNS, up my SEO game, look at analytics, and hack simple web pages. However, the limitations of the shared host have also limited my ability to learn more advanced topics. I didn’t want to simply use the stack that made up a website; I wanted to set it up myself and understand the structure of my website on a more fundamental level. More than anything else, this motivated me to make the switch.

Just like with shared hosts, they’ve saturated the market for private servers. My only requirement was to keep my hosting bills the same so this limited me to those cheap $5/mo VPS. In this space, the major players are Linode and Digital Ocean; everyone else looked as ephemeral as the VMs they spawned. I ended going with Digital Ocean because of the $50 credit from Github’s developer pack. What made me stay though were all the great tutorials they publish in their community. These were incredibly informative and gave me confidence that I was setting everything up correctly.

So what exactly did I gain from switching over to a VPS? To start off, I lost a lot of the value added features such as CPanel, analytics, email, and one click installs. On the other hand I went from jail shell to root which means I could set all that up and more. With virtualization, I’m also able build my own data center by spawning VMs and configuring the network. The trade-off for this level of control though is time spent, but it’s well worth it for the learning experience.

In bringing up my VPS I had to replace all of my original website’s services and make sure that I configured these all properly. To start off, I took security into my own hands using this Hacker News post as a checklist for securing my server. I then worked to bring up LAMP for WordPress where I gained experience setting up a full stack and the abstraction layers they rely on. What surprised me was how easy it was to port over my entire website from one server to the next. Once the stack is in place, it was a matter of restoring the MySQL database and wp-content directory (guide). It is a testament to flexibility of the web stack’s abstraction layers. After that, all I had to do was bring up email before I can fully commit to the new server. What I learned quickly is that email is a pain to deal with. The easiest solution was to use Zoho by adding a few DNS records to my domain’s zone file. After that, I replaced all the services of my old host and could now focus on adding new capabilities.

One of the things I was most excited to implement was SSL via Let’s Encrypt. It always bothered me that I couldn’t easily setup SSL on my shared host. This meant I was logging into CPanel, web mail, and wp-admin over HTTP up until this point… Along the same crypto vein, I also setup OpenVPN to encrypt my traffic over public Wi-Fi networks for when I’m extra paranoid. I also setup an outgoing mail relay with Mailgun for future projects that will need bots sending out email notifications.

Overall, it was a pleasant experience setting up my droplet and I learned so much in the process. 10/10 will recommend setting up a VPS over any managed hosting solution if you’re an engineer looking to learn something new. Now that I have this VPS up and running though I’m excited about all the new project domains this unlocks for me.

An Engineer Abroad

Over the summer I took my first major travel experience by flying over to Europe for 3 short weeks. With my girlfriend I covered the sites of Rome, Vatican City, Venice, Amsterdam, Paris, and London. At the risk of being cliche, it was an eye opening experience to witness so many cultures in so little time. Between switching time zones, languages, customs, and currencies the trip made me realize how little I actually know about the world and how many more wonderful curiosities there for me to discover. With this post, I hope to play travel blogger for a bit while putting a little engineering spin to it.

The trip itself took 6 months of design work in which I produced a centimeter thick packet comprising a 24 day itinerary, reservations, intra city connections, housing arrangements, survival notes, and redundancies. When I showed friends the itinerary I planned, it was described as obsessive and that I should consider becoming a travel planner. In reality, I would contend that we are living in an age where planning these kinds of trips is easier than it’s ever been. We have so much high quality information available and air travel is more affordable than ever. Further, credit card rewards programs can be gamed in a way that allow almost anyone to go on these trips without breaking the bank.

Admittedly, I started out by hitting the listicles for inspiration on cities and sights to visit in Europe. As an engineer I tried to optimize for minimal travel time and maximize time spent in the top cities. It was overwhelming to pare down the possibilities, but it’s better to trade off quantity for quality when dealing with the physical reality of travel. A handy rule of thumb for this is to take the number of vacation days, subtract 1 day for international travel, and divide the remainder by 3.5 to get an upper bound on the number of cities to visit. I eventually ended up with the route above which makes a nice arc across the continent with direct routes between each point. To further constrain the problem, I allocated 5-6 days in Rome, Paris, and London while leaving 2 days each for Venice and Amsterdam. With that, the problem is now specified to the point where we could book travel and accommodations.

In the past I’ve found ways to game reward programs using automation, but “churning” took a whole new level of creativity to maximize value. Prior to booking my tickets I had been amassing reward points through credit card sign up bonuses. For this trip alone we easily signed up for more than half of those cards above. In order to meet all the bonus requirements we had to use some odd financial maneuvers that basically converted credit card spending into cash which is used to go back and pay off the credit cards. My favorite was using reloadable debit cards (ironically intended for the underbanked) which can then be used to withdraw cash at ATMs. The practice felt almost criminal when I tried to explainit to people.

All told these cards paid for our international plane tickets on Iberia, a Hilton in Venice, and a Holiday Inn for London. To get there though, we have to look at the products of our churning reaction which is redemption.  You had to know all the (mostly unwritten) rules for booking awards. For instance with American Airlines you have to know their award chart, partner airlines, fuel surcharges, and how to search award availability. I ended up having to search for flights on the British Airways website, for award availability on Iberia, and call American Airlines to finally book my tickets. On top of that, I had to search segment by segment and had to reverse my travel route to find availability for us. While hotels awards don’t have the added complexity of partnerships, I did have to look for availability in each city for each chain and work out the redemption costs. This all meant making a lot of tables sorted by derivative measure of value. Definitely a lot more work than I anticipated, but in a way these inefficiencies are what allow people to do this kind of thing profitably.

For charting out an actual day to day itinerary I originally turned towards the internet, but it’s increasingly difficult to pick out the high quality information from it. Dismayed, I retreated to the travel section of the local library which hosts guide books for every destination on my list. Reading through the curated content inside the guidebooks gives a really good grasp of what each city has to offer along with all the necessary “tribal knowledge” that goes along with them. At that point, travel planning became an obsession of mine. I ended up reading through these books cover to cover as I plotted out the most aggressive itinerary I could. The objective here was to see as much as possible, because I didn’t know when the next time we’ll have an opportunity to do this again.

While I’d love to put off publishing this post even longer, I’ll let the photos tell the tale of the actual trip 🙂

This slideshow requires JavaScript.

This slideshow requires JavaScript.

This slideshow requires JavaScript.

This slideshow requires JavaScript.

This slideshow requires JavaScript.