• Free SSL with Heroku, Cloudflare, and Google Domains

    Recently, I went through the process of deploying a small Rails application on Heroku and registering a custom domain with Google Domains for it. In today’s web, HTTPS encryption is a must have, and I wanted it for my site. Heroku offers Automated Certificate Management for a small monthly cost,...
  • Easy Automated Rails Tests with Github Actions

    Modern software development typically includes some form of continuous integration and delivery. As such, engineering teams have to detect regressions quickly, as new code continuously gets merged into the build. An essential part of regression detection is automated tests. What are automated tests? As the name implies, automated tests are...
  • Treat New Engineers to a Day-One Production Deploy

    Every engineering team has an onboarding process for new hires. The main goals are to get set up and contribute as soon as possible. There are many different ways to achieve these goals, but one thing I’ve found incredibly helpful in speeding things up is a “Day-One Deploy”. What is...
  • Quick Tips for adding a REST API to a Rails Application

    Rails projects typically start out as simple HTML pages and forms operating on a database, but evolve into more complex applications over time. In order to add a client-side framework or mobile application, creating a REST API might be necessary. It’s really straightforward to create a new Rails API. However,...
  • Side Project: How Much Adobo?

    Spent more time working on another random project this month! Meet How Much Adobo?, an online meal-generator that tells you how much chicken adobo and rice you should eat to meet your calorie goals! Sure, it’s esoteric, but it was a fun way to work with some new technologies I...
  • Side Project: NomTracker

    It’s been awhile since I started and actually deployed a side project! Meet, NomTracker, a stripped-down clone of MyFitnessPal. For the past two weeks, this has occupied some of my free time (of which I have more of nowadays). It was fun to learn and relearn all of the steps...
  • Ruby OpenStruct-like Objects in Python with namedtuple

    In object-oriented programming, classes are how we define objects and specify their data attributes. Sometimes, we want to create objects with attributes “on the fly”, without having go through the boilerplate of defining a new class. For example, creating mock objects in tests. Let’s say we want to create a...
  • Rails Development Environment with Docker Compose in Ubuntu 18.04

    A long time ago, doing local web development was as simple as installing a framework and all its dependencies on my laptop. Now, I keep my development environments isolated from my local machine using containers via Docker. In the case where I need multiple services, I “orchestrate” the tech stack...
  • Quick Thoughts on Working with Junior Engineers

    It’s been eleven years since I began my career as a professional software engineer. I’ve worked alongside others with various levels of experience, ranging from fresh graduates to seasoned veterans. Early in my career, I believed the best way to grow as a software engineer was to surround myself with...
  • A Fix for Slow TrackPoint Speed in Ubuntu 18.04 (Unity) on ThinkPad

    I recently ran a system update for Ubuntu on my ThinkPad X1 Carbon (5th-Gen). Afterwards, I noticed the speed of the TrackPoint was really slow. The pointer would barely move! A quick search on the web led to many potential fixes, but none of them worked on my particular setup...
  • Quick Thoughts on Developer Happiness

    It’s hard enough to interview and hire good software engineers. It’s even harder to keep them engaged, productive, and willing to stick around. There are definitely ups and downs to any job, and being a software engineer is no different. Sometimes, the downs get overwhelming, leading to great engineers looking...
  • ThinkPad Function-Key Mapping to Toggle Touchpad in Ubuntu 18.04 (Xorg Edition)

    This is a follow-up to my existing blog post on setting a function-key to toggle the touchpad in Ubuntu 18.04 on the ThinkPad X1 Carbon (5th-Gen). The instructions worked for awhile, but differences between Wayland and Xorg eventually led to it breaking in kernel version 4.15.0-47-generic. I suspect it has...
  • Features in Ruby I Miss While Working in Python

    For about six years, I worked primarily on the Ruby on Rails stack. For me, Ruby was (and still is) a great language for learning programming concepts like test-driven development and object-oriented design patterns. Its syntax is “human-friendly” and great for beginners to read and understand. Recently, I moved back...
  • ThinkPad Function-Key Mapping to Toggle Touchpad in Ubuntu 18.04

    As a ThinkPad enthusiast, I’m a fan of using the TrackPoint for mouse navigation. I prefer to disable the touchpad altogether, just to avoid accidental clicks caused by my palms. I recently installed Ubuntu 18.04 on my X1 Carbon (5th-Gen) and couldn’t find a straightfoward way to toggle the touchpad...
  • Natural TrackPoint Scrolling on ThinkPad in Ubuntu 16.04

    In Ubuntu, it’s quite easy to set “natural” scrolling on the touchpad. We can do this by checking a box in Mouse & Touchpad settings. However, for ThinkPad users, this doesn’t change the scrolling settings on the TrackPoint. To get the TrackPoint settings to match the natural scrolling on the...
  • Quick Review: Big-O Notation

    As a web developer, I very rarely find myself deeply analyzing algorithms. However, a basic understanding of Big-O analysis can be really useful for software engineers. It provides a common language for us to discuss the performance of our code and the potential ways we can improve it. What is...
  • Building a Simple Raspberry Pi Dashcam

    About a year ago, I bought a Raspberry Pi Zero W to do some tinkering. It took awhile, but I finally found some time to play around with it! There are many fun Raspberry Pi projects out there, but I chose to do something I really needed: a Raspberry Pi...
  • Enabling WiFi and SSH on a Raspberry Pi in Ubuntu 16.04

    There are several ways to interface with a Raspberry Pi device. The most straight-forward way is probably to plug in a USB keyboard and monitor. However, it can be seen as more convenient to SSH into the device and work with it over WiFi, especially if it’s a headless device....
  • A Quick Review of the Asus ZenBook 3 UX390UA

    In 2016, I purchased a Thinkpad 13 to replace my Apple MacBook. After a couple weeks of use, I ran into issues with the Thinkpad’s battery life and suspend functionality in Ubuntu. I also found its chassis a bit flimsy, flexible, and cheap-feeling. It was fine for home-use, but not...
  • The Influential Qualities of my Favorite Teammates

    Since about 2009, I’ve had the pleasure of working on several different engineering teams. Each one came with its own set of tools and methodologies, all contributing to my growth as a developer. Sure, I learned lots of “OOPs” and “TDDs” along the way. However, a lot of my growth...
  • Vagrant and VirtualBox with Secure Boot in Ubuntu 16.04

    To dual-boot Windows 10 and Ubuntu 16.04 side-by-side, Secure Boot must remain enabled. Unfortunately, this clashes with Vagrant and VirtualBox in Ubuntu. A symptom of the issue is the following error when attempting vagrant up: The provider 'virtualbox' that was requested to back the machine 'default' is reporting that it...
  • "I Am Thankful For…" An Appreciation for 2017

    The beginning of a new year is a great time to look back and reflect on everything we’re grateful for. As a web developer, I like to take a look at the tools that have made impacts on my work or side projects. Here are a few of the developer-related...
  • Fixing Volume Controls on the Asus ZenBook 3 (UX390UA) in Ubuntu 16.04

    I recently purchased an Asus ZenBook 3 to replace my aging Thinkpad X220. Most things work right out of the box just fine, but I noticed the audio function controls having no affect on the actual volume of the laptop. After a bit of Googling, I came upon an old...
  • Remapping CapsLock to Escape in Ubuntu 16.04

    As a Vim user, I prefer to remap the CapsLock key on my keyboard to Escape. It makes it easier to switch between insert and visual mode without having to stretch my pinky all the way up to the top-left corner of the keyboard. It’s a minor detail, but a...
  • A Quick Review of the Lenovo Thinkpad 13

    Back in April, I purchased a Macbook to take around with me during my month-long trip across Europe. Its portability was the main draw, making it really easy to carry around in my 40-liter REI backpack. However, after my trip, I found the Macbook less useful for things I enjoy...
  • Getting My New Macbook Dev-Ready

    For my trip to Europe, I purchased a brand new Macbook! It’s the perfect travel companion: lightweight, decent battery life, and just powerful enough to do basic computing (email, blogging, etc). I bought it to replace my trusty Thinkpad x220, which I’ve used as a development machine for about five...
  • My "Bare Minimum" Vim Plugins

    Vim has been my programming editor of choice since about 2012. It’s an effective text editor at minimum, but it can be configured into a full-fledged IDE if desired. After learning the ins and outs of Vim, it can be difficult to go back to other basic text editors. After...
  • Why I left Blogger for Jekyll

    After many years on Google’s Blogger platform, I’ve decided to switch over to Jekyll. The old site is still up, with all of my previous blog posts. However, any new content will be posted here. There are several reasons I decided to leave Blogger. These are just the important few:...
  • SOLID Review: Dependency Inversion Principle

    Note: This is part of a series of articles reviewing the five SOLID Principles of object-oriented programming. The final SOLID principle is known as the Dependency Inversion principle. Arguably the most important of the five principles, the Dependency Inversion principle can be thought of as a culmination of the principles...
  • SOLID Review: Interface Segregation Principle

    Note: This is part of a series of articles reviewing the five SOLID Principles of object-oriented programming. The Interface Segregation Principle is probably the most straight-forward of all the SOLID principles. It states: “Clients should not be forced to depend on methods that they do not use.” In dynamic languages,...
  • SOLID Review: Liskov Substitution Principle

    Note: This is part of a series of articles reviewing the five SOLID Principles of object-oriented programming. Barbara Liskov introduced her substitution principle back in 1987 during her keynote titled Data Abstraction and Heirarchy. Today, it is one of the five SOLID principles in object-oriented programming. The original definition is...
  • Share Your Local Web Server Publicly using ngrok

    As a web developer, my workflow often includes writing a little code, firing up a local web server, and doing a quick smoke test to make sure things look alright. Occasionally, I’ll encounter a situation where I’ll need someone else (coworker, client, etc.) to provide some feedback on a design...
  • Replacing the Screen on the Lenovo Thinkpad X220

    Back in 2011, I purchased a Thinkpad X220 to replace my aging Thinkpad T61. It’s a great laptop, serving me well for just about four years now! Unfortunately, my screen recently began exhibiting the “vertical line” issue, which is basically a vertical strip of discoloration along a part of the...
  • SOLID Review: Open/Closed Principle

    Note: This is part of a series of articles reviewing the five SOLID Principles of object-oriented programming. The Open/Closed Principle was first coined by Bertrand Meyer in his book Object Oriented Software Construction. Meyer states that the implementation of any class in a system should be changed only to correct...
  • SOLID Review: Single Responsibility Principle

    Note: This is part of a series of articles reviewing the five SOLID Principles of object-oriented programming. The Single Responsibility Principle was first coined by Robert Martin in an article on the Principles of Object Oriented Design. To this day, it remains an important design principle because it encourages a...
  • A Gift to Myself: My 2015 Gaming PC

    Recently, I’ve been itching to play some of the newer PC games coming out (or recently released), but my laptop was lacking the power to do so. I’ve always been into PC games, but I drift in and out. This year, I decided I would get back into playing again....
  • Cleaner Rails JSON API Controller Specs with OpenStruct

    As many of us know, Ruby on Rails makes it really easy to write RESTful APIs. Paired with a rich client-side framework, we can create applications with slick user interfaces. A common approach for this is to write JSON APIs on the server for consumption by a Javascript front-end framework....
  • "I Am Thankful For…" from a Web Dev

    The Thanksgiving holiday is a time to reflect and appreciate the gifts in our lives. Of course, I’m thankful for friends and family, but I’d like to take some time to share some of the “geeky” stuff I really appreciate. As a Ruby on Rails developer, I use many third-party...
  • Quick Review: Decorator Pattern in Ruby

    In the object-oriented world, simple applications usually require small classes with static behaviors. Adding, modifying, and sharing those behaviors can be achieved by mixing in modules or inheriting from other classes at compile time. However, more complex applications might require a particular instance of a class to gain additional functionality...
  • Non-Verbal Cues for Programmers to say "Leave me alone!"

    Interruptions are an ultimate killer of productivity for any software developer. When writing code, everything from algorithms to variable names are stored temporarily in the brain. If you are interrupted, your brain is forced free up room in order to switch context. This knocks bits and pieces of valuable programming...
  • Being a Pessimistic Programmer, but a Positive Person

    I’ll be honest. As a programmer, my mindset is usually more negative than positive. I’ve accepted that my code, at some point, will fail and the software I write will never be complete. As I’m planning out projects, I’m usually thinking about the worst-case scenarios and possible issues. I’ve been...
  • Kaizen Through Kanban: Simple Principles, Great Benefits

    I recently attended a small presentation titled “Personal Kanban” hosted by the Seattle Software Craftsmanship group. The speaker was Jim Benson, who incidentally wrote a book titled Personal Kanban. The presentation focused on how we, as software craftsman, can use Kanban effectively to provide clarity in our work. We do...
  • My Interview Questions for Potential Employers

    By common definition, the purpose of a job interview is to allow an employer to screen candidates and find someone to fill an open job position. Each and every applicant must prove his or her worth to the potential employer. Many will apply, but only one (or very few) will...
  • Quick Review: CSS Positioning

    For web designers and developers, it is important to understand how to lay elements out on a page. Anybody can hack together a gorgeous looking webpage, but it’s important to write clean code along with it. It’s amazing how a basic understanding of HTML and CSS can make web projects...
  • Getting JavaScript Closures (The Module Pattern)

    JavaScript is an essential tool for any web developer. There is no denying the rise in popularity of the language. Since its inception, JavaScript has been used, abused, and misunderstood by many programmers. Classically trained developers (such as myself) often find it difficult to grasp programming in “the JavaScript way”....
  • Side Project: QueueDo

    When I work on my own projects, I like to keep track of the tasks involved in getting them done. I started by creating to-do lists in spreadsheets because it was quick, easy, and simple. Nowadays, I enjoy using Trello. After signing up and customizing the boards, I can visualize...
  • Personal Lessons from Jeff Atwood's "Effective Programming"

    I recently finished Jeff Atwood’s blog-turned-book: Effective Programming: More Than Writing Code. It’s a compilation of blog entries about different ways to improve programming ability outside of the typical “study and follow a code tutorial” method. The whole book is worth a read, but here are some interesting points I...
  • Quick Review: Delegator Pattern in Java

    In the object-oriented world, there are times when our classes need to share some or all of their functionality with others. There are many different ways we can achieve this. Depending on the programming language, we can tell our class to inherit its behavior from one or more other classes....
  • To Thine Own Self Be True: A Social Network Experiment

    Several months ago, I completely removed myself from all my social media networks. It was sort of a personal experiment. I wanted to remember what it felt like before my “friends” and I were completely interconnected at any or all points of the day. How did I, personally, connect with...
  • Quick Review: Basic Observer Design Pattern in Ruby

    Every so often, it’s nice to give yourself a quick review of basic topics in software. Today, I wanted to review the observer design pattern and give a very simple implementation of it in Ruby. The observer pattern allows several observers to be notified when an observable object, or subject,...
  • Dynamic ActiveRecord Database Connections (without Rails)

    If you are familiar with Ruby on Rails, you know you can configure which database to use based on the RAILS_ENV environment variable. This can be one of several values: production, development, test, etc. You can read more about it in the Rails Environment Settings section in the Ruby on...
  • Wake Your Entrepreneurial Spirit at a Startup

    I believe everyone, at the very least, has thought about building an awesome product and making a ton of cash by selling it to the masses. It’s this ambitious dream that drives us to come up with great ideas and take huge risks trying to share them with the world....
  • Quick and Dirty Node.js Process (Job) Queue

    I recently began experimenting with nodejs for a small web scraping project. I wrote a tiny script that goes out to lots of URLs and downloads files to disk. The simple solution was to iterate through the list and send a request to load the URL and download the page....
  • Guidelines for doing Work at Coffee Shops

    Imagine this: you walk into a coffee (or tea) shop and purchase your favorite beverage. Maybe you’re a little hungry, so you pick up a small sandwich or salad. Now, you look around for a place to sit. Maybe it’s the comfortable leather chair or the rustic table by the...
  • Simple Password Encrypted Files w/ GnuPG

    If you are sending files or documents with sensitive information (eg. database credentials), you probably don’t want to send it without making sure it is encrypted. In Linux and OSX, I use a tool called GnuPG to add password protection to files I want to share with other people. This...
  • Vi(m) Users and the Nipple Mouse

    Every so often, someone asks me “why do you like using the little mouse nub over the touchpad?” Most people assume I’m some hipster who thinks touchpads are too mainstream and prefers the irony of using the input device of a 1970s IBM employee. In all honesty, the reason the...
  • Be the Best by Learning from the 'Better'

    In the past four years, I’ve only worked with two different teams. So, I’m relatively junior in my career. My prime advice for anyone starting a career in software: always be surrounded by developers who are “better” than you. By “better”, I mean relatively more experienced, with a deeper understanding...
  • Automatic 'ls' after 'cd' in the Terminal

    As a web developer, I find myself navigating around in the terminal most of my time. The most frequent combination of commands I usually run are cd immediately followed by an ls. After a bit of Googling, I found a way to do this automatically in Ubuntu at home and...
  • Grouping HTML Hex Colors by Hue in JavaScript

    I was recently tasked with creating a color pallete for some custom (legacy) code for an existing e-commerce website. One of the requirements was to show the colors grouped by similar tint. I thought to myself, this is a classic sorting problem. There was a catch, though. What do we...