latest posts

  • Unlimited Power! My Unstoppable Raspberry Pi Kubernetes Cluster

    I started working on building a Raspberry Pi-based Kubernetes cluster after attending the Bay Area Maker Faire in May 2018 and now it is finally complete! In this post we'll cover what parts I used, a high level description of how I installed Kubernetes using rak8s, and what I plan to do with it.

  • Baking a Pi Router for my Raspberry Pi Kubernetes Cluster

    How I set up a Raspberry Pi 3 Model B+ to be the dns/dhcp server and router for my Raspberry Pi-based Kubernetes cluster. A general guide to how I eventually managed to get the Pi Router sharing working and some cautionary tales of pitfalls I encountered along the way.

  • Raspberry Pi Heat Sink Science

    Does the Raspberry Pi 3 even need a heat sink? An unscientific look into that age-old question that investigates the thermal performance of the Raspberry Pi 3 Model B with and without a heat sink. As a bonus, we'll also consider thermal paste versus thermal tape.

  • Hack Mini - Linux Workstation Build Log

    Recently I've found myself wanting a dedicated desktop machine just for coding. Although I do most of my development at work on iMacs and at home on an aging MacBook Air, I decided against buying another Mac -- the price and performance I wanted just wasn't there. "Linux is close enough", I thought, so I decided to build this small, discrete machine just for development.

  • Learning Operating Systems and Rediscovering C

    One of my goals this year is to learn more of the underlying concepts and theory of operating systems and improve my systems programming skills. Consequentially, I've enrolled in Graduate Introduction to Operating Systems through Georgia Tech this semester to help meet this goal. However, it's been a few years since I've written any C and I never had the opportunity to take an Operating Systems course in undergrad so I've got some ground to cover. This post is currently a work in progress, but I'll add to it over time to document my learning journey and include links to any resources that proved helpful along the way.

    , updated
  • How to Write Custom Rubocop Linters for Database Migrations

    Active Record and Sequel migrations provide an easy way for Ruby developers to alter their database schemas without having to write SQL by hand. This abstraction means that the same migration file could work against both a Postgres and MySQL database by simply changing the underlying database adapter. For large projects with many developers, however, it can be difficult to keep migration style consistent and enforce best practices without additional tooling. In this post we'll write our own custom Rubocop cop for linting migration files.

  • Securing Rails Secrets with Cloud Foundry CredHub

    Over the years, secret management in Rails has greatly improved. Gone are the days of the version-controlled secret_token.rb and now providing secrets through environment variables is encouraged. Environment variables can come with their own problems, however. Luckily with Cloud Foundry and CredHub, there's another way.

  • How to Add a Custom 404 Error Page to a Cloud Foundry Staticfile Buildpack Site

    Although Cloud Foundry makes it simple to get your static site up and running on the web, getting rid of the default NGINX 404 page can be a bit tricky. This post will walk you through tweaking the Staticfile buildpack's NGINX config to serve custom error pages.

    , updated
  • How to Deploy a Static Website with Cloud Foundry

    When it comes to hosting a static website there are many options available ranging from the free (and somewhat limiting) Github Pagesto deploying directly to an Amazon S3 bucket to self-hosting NGINX on Digital Ocean. For those looking for more flexibility than what Github and S3 can provide, but want to avoid the hassle of maintaining a full virtual machine on Digital Ocean, a managed Cloud Foundry can be a good option. This post will cover how to use the Cloud Foundry Staticfile buildpack to deploy to a public Cloud Foundry PaaS and wire it up with a custom domain name and Cloudflare SSL.

  • Migrating from Jekyll to Hugo to Ghost to Jekyll

    In a world where new static site generators and blogging platforms crop up everyday it can be tempting to scrap everything and start anew. This is the story of me doing just that -- moving from Jekyll to Hugo to Ghost and winding right back up at Jekyll. A rambling tale of what I discovered and why I didn't end up migrating in the end.

  • How to Add Custom Language Files to CKEditor 4

    Although CKEditor 4 ships with support for over 60 different language variants, you may find yourself needing to add a 61st. Or maybe while localizing your application you've found that you need to tweak the phrasing for an existing locale. Here's how to add support for new languages to CKEditor and modify existing translations without needing to generate a custom build.

  • Batch Uploading Photos to Amazon S3 with Mitty

    I've had my Jekyll-powered static photo blog for a little over a year now and I really appreciate the control it gives me over my photographs. What I didn't enjoy so much, however, was resizing them and uploading them to one of my AWS S3 buckets for hosting to display them on the blog. That's where mitty comes in.

  • Web Accessibility Testing for Everyone

    Accessibility is a topic that many developers seldom have to think about. Sure most of us are aware that having an accessible website is a good thing to have, but when it comes time to code it is often not in the forefront of our minds. We're generally more focused on adding new features or tweaking visual designs. But just how valuable can these improvements truly be if a percentage of our users cannot even interact with them?

  • Testing i18n in Ruby on Rails

    Verifying that all user-facing copy in your Rails application is localized can be a challenge. While manual validation may work for smaller sites, for larger, more complex applications it can be practically a fool’s errand. If your situation happens to sound more like the latter, don’t lose hope! In this post I am going to cover a few of the methods to easily and automatically test your Rails app for missing translations.

  • Thirty-Nine Days of Code

    Early last May I was inspired by John Resig’s post Write Code Every Day and decided to give it a go myself. I made a commitment to myself to program outside of work for a minimum of thirty minutes each day and have it committed by midnight. I surpassed this initial goal and made it to thirty nine days in spite of a brief bout in San Francisco. Now I’m not going to pretend that this endeavour had some profound effect on me, but it did oblige me to write this post.