-
Mar 20, 2021
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,...
-
Jan 12, 2021
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...
-
Jan 5, 2021
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...
-
Dec 9, 2020
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,...
-
May 18, 2020
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...
-
Apr 13, 2020
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...
-
Mar 30, 2020
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...
-
Feb 26, 2020
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...
-
Feb 14, 2020
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...
-
Nov 10, 2019
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...
-
Sep 2, 2019
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...
-
Apr 18, 2019
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...
-
Jan 22, 2019
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...
-
Jan 17, 2019
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...
-
Jun 13, 2018
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...
-
May 22, 2018
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...
-
Apr 10, 2018
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...
-
Apr 10, 2018
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....
-
Apr 2, 2018
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...
-
Feb 28, 2018
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...
-
Jan 24, 2018
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...
-
Jan 8, 2018
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...
-
Oct 3, 2017
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...
-
Jan 14, 2017
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...
-
Nov 26, 2016
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...
-
Oct 17, 2016
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...
-
Jun 17, 2016
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...
-
Mar 26, 2016
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:...
-
Apr 24, 2015
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...
-
Mar 27, 2015
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,...
-
Mar 5, 2015
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...
-
Feb 17, 2015
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...
-
Feb 13, 2015
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...
-
Feb 12, 2015
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...
-
Feb 6, 2015
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...
-
Jan 9, 2015
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....
-
Jan 17, 2014
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....
-
Nov 28, 2013
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...
-
Oct 30, 2013
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...
-
Oct 4, 2013
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...
-
Jul 15, 2013
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...
-
Mar 29, 2013
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...
-
Mar 26, 2013
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...
-
Mar 17, 2013
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...
-
Mar 5, 2013
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”....
-
Feb 3, 2013
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...
-
Jan 16, 2013
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...
-
Jan 13, 2013
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....
-
Dec 24, 2012
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...
-
Dec 22, 2012
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,...
-
Nov 15, 2012
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...
-
Nov 1, 2012
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....
-
Oct 11, 2012
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....
-
Sep 28, 2012
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...
-
Aug 29, 2012
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...
-
Aug 22, 2012
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...
-
Jul 19, 2012
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...
-
May 1, 2012
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...
-
Nov 15, 2011
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...