Profile photo of Travis Horn Travis Horn

Refactoring Complex SQL to Reduce Query Time by 99%
A query that works perfectly on a small development dataset can still bring the production database to a halt as data volumes scale. You must understa…
Building an Enrollment Prediction System with Machine Learning
Schools need accurate enrollment forecasting for stability and success. Forecasting informs decisions they face annually: staffing, resource allocatio…
Zero Downtime: Setting up a 3-Node MariaDB Cluster
Most developers are used to spinning up a single instance of their database system and calling it a day. But what happens when you need true redundanc…
Managing Geographic Zones with GeoJSON and MariaDB
One of the most common yet complex challenges in application development is the "zone lookup" problem. It's used in processes like managing school dis…
Why Apache is Returning 200 OK Instead of 304 Not Modified
I recently ran into a frustrating caching issue with Apache. I requested a page where the request headers included `If-Modified-Since` and the respons…
A SQL Window Function Case Study
Imagine you need to run a report showing every student enrolled during the academic year. The catch? The report specification requires one row per stu…
From Auto-Increments to UUID v7
When picking a primary key for a table in a database, sometimes there is an obvious choice. If you're creating a table of users, and users authenticat…
Data Types: Continuous, Discrete, and Related Categories
Recognizing data types is a foundational concept in statistics and data science because the type of data you have dictates the appropriate statistical…
Quick Git Fixes
Git is a powerful tool, but it can also be a source of frustration when things go wrong. I've documented the process I use to quickly fix some common …
Converting TSV to CSV with DuckDB
DuckDB is an incredibly versatile, in-process database. Its powerful SQL engine and ability to read various file formats make it an excellent tool for…
Why Open-Source Principles Aren't Always Obvious in Art
I love the free and open-source software (FOSS) community. The idea that code can be freely shared, studied, modified, and redistributed for the benef…
Data Analysis with Azure Machine Learning: Healthcare Data Demo
Data is the lifeblood driving innovation in many industries, including healthcare. Machine learning algorithms are being used to predict patient outco…
Real-Time Delivery ETA Prediction in Python
I've been playing around with how ML techniques can be applied to logistics and e-commerce. One of the ideas I had floating around my head was to buil…
Cursor Rules for SvelteKit Development
Cursor, the AI-first code editor, significantly speeds up my development workflow, especially when working with modern web frameworks. However, like m…
Simple Python Dependency Management
While powerful tools like virtualenv, pipenv, conda, and Poetry exist to provide extra advantages for dependency management, I've found a simple syste…
Setting up a Project with ESLint and Prettier
[ESLint](https://eslint.org/) is a tool for "[linting](https://stackoverflow.com/questions/8503559/what-is-linting)" your code. It can analyze your co…
Introducing libsql Migrate
**libsql Migrate** is a database migration and seed management tool for [libsql](https://github.com/tursodatabase/libsql) with configurable options, b…
Creating a Development Database: Syncing Production Data for Efficient Development
As you develop software, having a development database that mirrors your production data is a game-changer. It allows you to work with realistic data …
Monitoring your Linux Server with Prometheus
Every system administrator would be wise to keep a close eye on the health and performance of their server infrastructure. Prometheus, an open-source …
Integrating SQL Data into your Next.js App
Building dynamic applications often involves connecting to a database to store and retrieve data. Next.js provides an excellent platform for creating …
Comprehensive Guide: Backing Up and Recovering Data in MariaDB
Ensuring the safety and integrity of data in your database management system should be one of the highest priorities. MariaDB, a powerful and widely u…
Getting Started with MariaDB
MariaDB is a great open-source relational database management system. This article will walk you through the process of installing and configuring Mar…
Configuring HTTPS/TLS on nginx: A Complete Guide for Securing Web Traffic
Today, online security is paramount. Configuring HTTPS/TLS/SSL on your web server is crucial to protect sensitive data and establish trust with your u…
Firewall Configuration with nftables
Firewalls are an essential part of network security, and [nftables](https://www.nftables.org/projects/nftables/index.html) is a powerful tool for conf…
Reverse Proxying with nginx
Reverse proxying with nginx is a powerful way to manage and distribute web traffic. In this comprehensive guide, we'll walk you through the installati…
Rolling Your Own Continuous Deployment with Node.js, Git, PM2, and Linux
Continuous deployment involves frequently integrating code changes into a shared repository. This allows for your production app to be updated with th…
SvelteKit Magic: Server-Side Rendering for Observable Plot Explained
Using a web application framework like [SvelteKit](https://kit.svelte.dev/) opens up possibilities to bring your data visualizations to life on the se…
How to Manage Node.js Processes with PM2
Node.js is a popular runtime environment for building scalable and high-performance applications. However, managing Node.js processes can be challengi…
Serving Next.js Apps on your Linux Server
In this tutorial, we will explore the process of serving Next.js apps on a Linux server. Next.js is a powerful framework for building server-side rend…
The Simple Guide to Installing Node.js using APT and NodeSource
Installing Node.js is a crucial step for developers looking to leverage its powerful features and vast ecosystem. In this comprehensive guide, we will…
Uploading and Saving Files with SvelteKit
Recently, while working on a project, I needed to add a feature to allow users to upload a file and save it on the server. I did quite a bit of search…
Step-by-Step Guide: Setting Up a Git Repository Hosting Server
If you're looking for a reliable and secure way to host your Git repositories, setting up your own server can be a great solution. In this step-by-ste…
Streamline Your Linux Experience with Automatic Updates
Staying up-to-date with software updates and security patches is important for a secure computing experience. However, manually keeping track of updat…
Unlocking the Power of Public Key Authentication in OpenSSH: A Comprehensive Guide
Public key authentication is a fundamental aspect of secure and efficient communication in the realm of server administration. In today's interconnect…
Mastering Port Forwarding in VirtualBox: Unlocking Connectivity
VirtualBox is as a powerful tool to create and manage virtual machines. Using it, you may often encounter scenarios where you need to establish commun…
Introducing the Knex Adapter for Auth.js
I am excited to share with you my latest open-source project, an unofficial adapter for [Auth.js/NextAuth.js](https://authjs.dev/) that allows seamles…
Exploring the Power and Beauty of Common Lisp during the #12in23 Programming Challenge
This month marks the halfway point in the yearlong challenge. This time, I ventured into the realm of Common Lisp, the renowned Lisp dialect celebrate…
12 Months, 12 Languages: My Journey with the #12in23 Challenge - Mindshifting May with Prolog
Learning new programming languages is an important aspect of a software developer's journey. It helps you expand your knowledge, learn new techniques,…
Analytical April: Learning Python for Data Science
Python is a powerful programming language that has become increasingly popular over the years. It's a great language for beginners and experienced pro…
SurrealDB: Your Ultimate Guide to Smooth Installation and Configuration
SurrealDB is a cutting-edge, next-generation serverless database that offers powerful features such as SQL-style query language, real-time queries, an…
Conquering the #12in23 Challenge: Tackling Mechanical March with Rust
My excitement about this month in the [#12in23 Challenge](https://exercism.org/challenges/12in23) can be summed up in one word: [Rust](https://www.rus…
Functional February: Exploring Elixir for Exercism's #12in23 Challenge
For the month of February 2023, I continued [Exercism's #12in23 Challenge](https://exercism.org/challenges/12in23) by trying out [the Elixir programmi…
Learn a New Programming Language Every Month with Exercism's #12in23 Challenge
Starting in January of 2023, I decided to take Exercism's #12in23 Challenge. Exercism is a site for learning programming languages and exercising you…
SQL Group with Most Recent Record Each
Say you have a table with student test data. ```sql SELECT t.* FROM tests t ORDER BY t.student_id, t.taken_on ``` | stude…
Building a Telegram Bot with Netlify
Want to build a bot on a messaging platform? You can use [Netlify](https://www.netlify.com/) and their [Functions](https://www.netlify.com/products/fu…
Haskell Development on Windows
If you run Windows and you're interested in Haskell but not sure how to get set up, check out this guide. The process isn't too hard, but it might be …
Vim on Arch
If you've been following along with [this series](https://travishorn.com/series/arch-linux), we installed Arch Linux, xmonad window manager, Alacritty…
xmobar
So far in [this series](https://travishorn.com/series/arch-linux), we've installed Arch Linux, the xmonad window manager, and Alacritty terminal emula…
Alacritty terminal emulator
If you're following along with [this series](https://travishorn.com/series/arch-linux), we've already installed Arch Linux and xmonad window manager. …
The xmonad Window Manager on Arch Linux
In [the last article](https://travishorn.com/installing-arch-linux), we installed a barebones installation of Arch Linux. The base of the operating sy…
Installing Arch Linux
Lately I've been experimenting with more customizable distributions of Linux. My only previous experience with Linux was Ubuntu. It's a nice distribut…
Reverse-Proxying Node.js Apps on Windows with IIS
You can run Node.js apps on Windows with the added layer of a reverse-proxy with the built-in web service manager IIS. Together with a process manager…
Some ways to align the last row in a flexbox grid
Using flexbox doesn't always produce the expected alignment, especially on the last row of a grid. When you use justify-content: space-between it will…
Excel Formula to Scale Data from 0 to 1
Say we have a set of data in column A. ``` 469 396 600 177 240 155 204 454 278 233 ``` And we want to scale the data so that the lowest value equat…
Using JavaScript to Work with Spreadsheets, Part 5: Parsing XLSX Files
This is the fifth article in a series where we'll be learning to use the powerful logic of a programming language like JavaScript to manipulate spread…
Using JavaScript to Work with Spreadsheets, Part 4: Making the CLI More Robust
This is the fourth article in a series where we'll be learning to use the powerful logic of a programming language like JavaScript to manipulate sprea…
Using JavaScript to Work with Spreadsheets, Part 3: Accepting Arguments & Reading Files
This is the third article in a series where we'll be learning to use the powerful logic of a programming language like JavaScript to manipulate spread…
Using JavaScript to Work with Spreadsheets, Part 2: Setting up the Workspace
This is the second article in a series where we'll be learning to use the powerful logic of a programming language like JavaScript to manipulate sprea…
Using JavaScript to Work with Spreadsheets, Part 1: The Shape of the Data
This is the first article in a series where we'll be learning to use the powerful logic of a programming language like JavaScript to manipulate spread…
Building a Sparkline Dashboard
Building on the last article, I'll show you how to use the SparkLine component we built to create a "dashboard" of data points that anyone can quickly…
Build a Sparkline Vue Component
Sparklines can be used to quickly visualize data variance. They are small and intuitive to understand. ![](./images/Oh7Gl0ney.webp) We'll be using V…
Visualizing Google Sheets Data in D3
If you have data in Google Sheets, you can import and visualize it using D3. ![](./images/Y3cfN6j5w.webp) ### Creating the table Maybe you already …
Reacting to data changes in D3 using Vue
D3 provides a powerful interface for reacting to changes in data. When hooked up to Vue, you can create data visualizations that react to your UI or e…
Introducing csval, an open source CSV data validator
csval is a command-line tool and a JavaScript library that can check CSV files against a set of validation rules. Some of the rules you can check for …
Self-contained D3 Pie Chart Function
D3 is a great data visualization library. I often find myself coding the same types of charts over and over again. I decided that it would be wise to …
Self-contained D3 Bar Chart Function
D3 is a great data visualization library. I often find myself coding the same types of charts over and over again. I decided that it would be wise to …
Combine Multiple PowerShell Commands into One
There are some sequences of commands I use over and over again. I decided to make commands that will execute these sequences together. ![](./images/Y…
Build & Deploy Serverless Functions in 5 Minutes
The serverless method promises to take away the hassle of managing servers so you can focus on development. But what does it take to actually get star…
Delaying forEach() Iterations
I recently ran into the problem of having to loop over an array, but with a delay between iterations. This functionality isn't built in to JavaScript …
Creating a Photo Gallery with Vue & CSS Grid
An interactive gallery of photos is the perfect use-case for Vue and the CSS Grid Layout. ![](./images/sHS5kTzU-.webp) This article describes every …
Responsive grid in 2 minutes with CSS Grid Layout
Are you trying to build a grid of elements? If so, you've probably noticed one size doesn't fit every screen size. The modern solution is a responsive…
Need part of a string? Just use slice()
In JavaScript, there are three prototype methods for getting part of a string. Which one should you use? The answer may depend on the context of your …
Removing parts of shapes in SVG
Recently, I needed to remove part of a shape in SVG for a project I was working on. Using clipping paths and masks are not as intuitive as I had first…
Semantic versioning with Git tags
Why should we put thought into version numbering? What's the best system for versioning? How can we implement it? I recently starting thinking about t…
API Server with JWT Authentication
In this article, I'll go over how to create an API server that signs and verifies JSON Web Tokens for authentication. Some of the technologies this s…
Getting Started with Vue Single File Components
If you're just starting out with Vue and you've followed along with the official guide, it begins by detailing how to use Vue in the easiest way possi…
D3 Line Chart with Forecast
In this post, we'll build a function for predicting data using linear regression and the least-squares method. Then we'll plot the forecasted data on …
Creating a responsive header image
Sometimes it's best to load and display different images for different screen sizes. For example, a very large header image that works for a large des…
Dealing with asynchronous functions in JavaScript
Writing non-blocking, asynchronous code is a staple of Node.js development and the broader JavaScript world. JavaScript itself uses an event loop whic…
Just for fun: The LOL ID
What type of unique identifier should you use for your next data-backed project? Incremental integers? UUIDs? A URL-friendly short ID? I present: the …
The importance of standards and standards bodies in web development
In 1990 — the early days of the web — Tim Berners-Lee created a piece of software called WorldWideWeb. It was the first web browser. It allowed people…
Rapid prototyping with CSS keyword colors
When quickly creating prototypes, color may play an important role. Especially for things like data visualization. However, choosing colors can be a t…
Shorten functions with ES6 features
ES6 implements features which use a more expressive closure syntax and more intuitive expression interpolation that can shorten your functions. ![](.…
3 ways a front-end developer can reduce page load
Loading times are a big pain for users. You have to tackle the problem from many angles. Some tweaks can be made on the back-end; with hardware bottle…
Introducing the Diabetes Food Database
I created a free progressive web app which helps people with diabetes find information on the food they eat. ![](./images/KOqK9HUbv.webp) You can us…
What if a project uses tabs and you use spaces?
There are two types of developers. Those who use tabs to indent code and those who use spaces. It seems like a minor difference that shouldn't matter …
Using the Options Object JS Pattern
An "options object" is a programming pattern that you can use to pass any number of named arguments to a function. Rather than using an ordered list o…
Setting up ESLint on VS Code with JavaScript Standard Style
JavaScript Standard Style is an attempt to standardize the way developers write JavaScript. Following this style guide will ensure your code has a lev…
My first competition as a hackathon noob
I recently competed in Node Knockout. > A 48-hour hackathon featuring [Node.js](http://nodejs.org/). It's an online, virtual competition with contesta…
Day-to-day source control
Developers need source control. As a project gets bigger, it becomes hard to maintain without a system for managing code changes. Source control mana…
Setting up Prettier on VS Code
Prettier is an opinionated code formatter. It is fundamentally different than a style linter. Prettier doesn't care how you write your JavaScript. It …
My Title Boxing Club schedule scraper
I built a tool to scrape the latest schedule from Title's website and output CSV data ready for import into Google Calendar. ![](./images/w49c1baDE.w…
Netlify Lambda Functions from Scratch
When learning a new concept, I always like to try building things from as low a level as I can. Rather than using a pre-built template, I want to see …
Adding Bootstrap to a Vue CLI Project
The Vue CLI is an awesome tool to kick-start your Vue projects. But by default — and rightly so — it comes with very little in the way of styling. Fol…
Responsive Scrim
Overlaying text on an image, or even a solid color, can get tricky. The text can very easily become too difficult to read. Scrim is one technique used…
Some design tweaks for Project Gutenberg
I enjoy reading books from Project Gutenberg. If you haven't heard of this project, it's a repository containing tens of thousands of free eBooks. You…
I started naming all my anonymous functions (and you should, too)
JavaScript allows anonymous functions. Wikibooks describes them as… > …a function that was declared without any named identifier to refer to it. As su…
Buttons with custom shapes
Did you know you can create hyperlinks on SVG shapes? The `<a>` tag is valid inside `<svg>`. ![](./images/9rJTyGhVD.webp) Most links (`&lt;a&gt;`) e…
Google-style gauge charts using D3
Google provides a free charting library to display live charts on your site. It works pretty well but has some disadvantages: * The library must be l…
Visualizing SVG Elements
Scalable Vector Graphics, or SVG, is a language for creating vector graphics. Vector graphics are awesome because they have excellent browser support …
Sunrise Block Clock
I came up with the idea for a digital clock where the background was divided into 1,440 blocks — one for each minute of the day. Initially all blocks …
Data by Geographic Distance
Say you have a database that contains information about clients your company serves. Among the client information are two pieces of data: geographical…
Interactive Maps with Vue & Leaflet
This post will cover the basics of interactive maps using Vue.js and Leaflet. If you've never heard of Vue, it's a popular front-end framework for bu…
Setting up ESLint on VS Code with Airbnb JavaScript Style Guide
Airbnb maintains a very popular JavaScript Style Guide that is used by many JavaScript developers worldwide. Following this style guide will ensure yo…
My Codevember 2017 Pens
Codevember is an annual pen-a-day challenge. Participants visit the Codevember site each day, look at the inspiration for the day, and create a "pen" …
The <table>
Tables might just be the most versatile format for displaying structured data. They appear everywhere to display information in a way us humans can qu…
Updating Dynamic Data in D3
D3 uses an enter, update, exit pattern for handling dynamic data. Developers new to D3 might first encounter it when needing to manipulate more than o…
Vue + SVG
I love using D3.js for data visualization. However, there are some smaller projects where I've found manipulating SVG elements in Vue.js is sufficient…
Create Animated Icons using CSS
One cool feature of CSS is the transition rules you can apply to elements. You can use transitions to animate icons when they are clicked. ![](./imag…
Customizing Bootstrap Styles, Step-by-Step
Bootstrap is an awesome toolkit for front-end development. One of it's biggest advantages is that when you start to build your app, instead of startin…
Update from Another Table in SQL
I'm always finding myself in the same position: I have a table with two or more columns. I need to fill in one of those columns based on another one. …
Create a Bouncing Message Notification Icon from Scratch with SVG & CSS
Let's see how easy it is to create a simple icon with SVG and animate it with CSS. ![The end result will look similar to this. Just imagine it bounci…
Responsive Buttons with Bootstrap
Using Bootstrap, I found myself wanting to have a button that will change widths depending on the screen size. Here is what I believe to be the best s…
Redux by example: Combined reducer with action creators
After reading and following along with the official Redux Read Me, I had many code samples saved to Codepen. This is my attempt to condense the most i…
Vue Online Store with Shopping Cart
Today we'll be building the basic framework for an online store and shopping cart with Vue.js single file components. ![](./images/XcoThZ1K6.webp) #…
Building json2table: Turn JSON into an HTML table
Today we'll build a dependency-free function that accepts… * Data in a JSON array * An optional space-separated list of classes … then transforms t…
Recreate the Google Loading Animation using only CSS
Google uses many different loading animations. The one we'll be recreating today has four differently colored balls, bouncing in a horizontal line. !…
Stacked Bar Chart with Chart.js
This is a simple example of using Chart.js to create a stacked bar chart (sometimes called a stacked column chart). > # Chart.js provides simple yet f…
Add LocalStorage to your Vue app in 2 lines of code
Say you already have your Vue app up and running, but you want your users to be able to save their state between usage sessions. How can you achieve t…
Creating a system tray icon to display the current Ether-USD market price
I thought a fun side project would be creating a desktop app that runs in the system tray and displays the market price of ETH in USD when you hover o…
Getting Browser Width & Height
A while back, a user on Stack Overflow asked the question "How to get browser width using JavaScript code?" The accepted answer (from 2009) recommends…
Ordered Lists in HTML
One of my highest rated answers on Stack Overflow is in response to a very simple question. > Is it possible to specify a starting number for an orde…
Using Computed Getters & Setters in Vue
Vue.js supports getters and setters on computed variables. You can use these variables to provide 2-way data binding. Let's use this feature to write …
Form Validation with Vue.js
Client-side validation using JavaScript enhances user experience by giving feedback immediately to the user rather than having them complete a round-t…
Passing Data Between Classes/Components in React
One of the first patterns that you will need to learn when working with React is passing data between classes. Let's look at how to do this by creatin…
Composition + Immutability in JavaScript
RJ Zaworski wrote an excellent introduction to Composition in JavaScript. I highly recommend it and it is a prerequisite to this article. I'm taking R…
Populate <select> via AJAX
I recently ran into a situation where I had a `<select>` input and I wanted to populate it with a list of options from an API endpoint. In fact, I had…
Access the browser's query string as a JavaScript Object
I recently read a post on David Walsh's blog called Get Query String Parameters with JavaScript. He provides a simple function for getting parts of th…
Why it is better to serve site assets from multiple domains
Traditionally, and with most modern web servers, it has been better to serve site assets from multiple domains, rather than from a single domain. But …
Integrating multiple stylesheets in a single site
The question is: "If you have 5 different stylesheets, how would you best integrate them into a site?" The answer will depend on how your site is lai…
The Basics of Modular JavaScript & npm Packages
One of the biggest jumps a new JavaScript developer can make is going from writing collections of spaghetti code to using a system of loosely coupled …
Building a Random-Within-Range Function
Let's walk through building a function in JavaScript that returns a random number within a given range. JavaScript provides an object called `Math` t…
JavaScript Slideshow with No Dependencies
There's no shortage of slideshow plugins and frameworks for JavaScript. But how simple would it be to code one using plain old JavaScript? Warning: Th…
Increase Concurrent Connections in Windows Server 2000
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
SQL Query for Counting Records per Day
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Simple jQuery
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
JavaScript Reference: Objects
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
JavaScript Reference: Closures
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
"Shrinkwrapped" List with CSS
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Link Directly to Google's "I'm Feeling Lucky" Feature
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
xcopy Options for Backup
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Windows XP Malware Cleanup
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Unix Commands
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Troubleshoot Internet Connection Problems
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Windows XP Startup and Shutdown Notifications
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Removing Conficker/Downadup
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Make Single Spacing Default in Word 2007+
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Import Contacts into Outlook from an Email
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Greater Than & Less Than Formatting in Excel
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Enable File and Printer Sharing Across Subnets in Windows Server 2003
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Using MSSQL with Classic ASP
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
Boilerplate Classic ASP Page
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…
A small function to convert an array of ID strings into a dictionary of jQuery objects
I often use jQuery to modify the DOM. The simplest way to do this is to use jQuery's query selector and a modifier function. ```javascript $('#intro'…
Should you name variables based on their content or their purpose?
Before I start, I should say that this is a question without a definite answer. You will not find one in this article. Instead, I'll explore the subje…
Getting Started with R on Windows
This tutorial is meant to be a bare-minimum installation guide and mini "getting started" guide. If you will be using R extensively, there are other t…
Building upon JavaScript with TypeScript
TypeScript is just a superset of JavaScript. You can run classic JavaScript through the TypeScript compiler and it will come out just fine, just the w…
Zero to TypeScript Developer using Visual Studio Code on Ubuntu
Let's start from scratch, or rather — with a running installation of Ubuntu. From there, I'll walk you through installing and setting up an environmen…
Creating a front-end for working with your API proxy
This is part two of a two-part series on working with a third-party API with private keys. If you haven't already, you may want to read part one. Now…
Creating a Node.js proxy to secure your third-party API key
Today I am creating a mailing list signup form that will post data to a sheet on Fieldbook. We could give our form the API key but this is a terrible …
My preferred development environment
Every developer has their own preferred environment; from the hardware, to the operating system, IDE, and other tools. I'll go into detail about what …
What considerations do I make while building a web application or site?
I will break this problem down into six categories: * User interface * Security * Performance * Search engine optimization (SEO) * Maintainabilit…
A recent technical challenge I experienced with PC hardware
I recently upgraded my home PC. I was trying to get new components to work together. I had a new motherboard and a new processor that were supposed to…
What excites me about coding?
I‘m sure many developers will agree with my answer. I like that I can take a problem and come up with a solution just by giving instructions to the c…
What did I learn this week? Knex.js & Bookshelf.js
A while back, I found an awesome open-source project by h5bp called Front-end Job Interview Questions. The project is… > A list of helpful front-end …
Fireflies with canvas and requestAnimationFrame
I've added a new public pen to my CodePen account called [Fireflies](http://codepen.io/travishorn/pen/OVzeqg/). It's a simulation of fireflies (lighti…
npm Package Store
I recently read on [The Changelog](https://changelog.com/) a short post about a tool called **Go Package Store**. > An app that displays updates for …
fake-identity
This is the latest project I've open-sourced. It is a JavaScript module that you can use in the browser or Node to generate fake identity objects. The…
Using Grunt with Travis-CI
If you are using Grunt to run your tests and Travis-CI for your continuous integration, you will need to command Travis-CI to install the grunt-cli be…
Using CSS Media Queries for Responsive Design
Responsive design means that your site is designed for all screen sizes. Imagine a site where all content is wrapped by a fixed width container: ```c…
Browser standards implementation
Every browser renders pages and behaves differently. Even the ones that try to stick to standards implement them inconsistently. Make sure your site i…
Web accessibility
Consider users accessing your site from platforms other than the major browsers: mobile devices, screen-readers, and crawlers, for example. When you …
NoSQL & MongoDB
The latest trend in database technology is away from relational tables. It seems that everybody is trying to find a way to fit a NoSQL database into t…
HTTPS & SSL/TLS
Before we get started on today's blog post I'd like to clear up some terminology. When you connect to a web service using HTTPS (Hypertext Transfer Pr…
Welcome to the redesigned blog
You're reading my personal blog. I hope to keep this updated with interesting and useful posts on a regular basis. If you check out some of the other …
Preventing CSRF Attacks in ColdFusion 9
Update April 17, 2012: David Boyer has created a more feature-rich version of the simple scripts I've made here. He has actually replicated the CSRF f…
HTML5: New Features
The HTML5 specification is still in working draft, but as web development is currently shifting towards an "agile" process, browsers already implement…
jQuery.expire
The latest jQuery plugin I've developed is called **expire**. I intend it to be used as a simple way to set start and end times to pages. All that's r…
Increasingly Higher Level "Hello World" with Node
This is a small experiment that I found a little neat and it may give some clarity to the layers of some Node stacks. I'm going to use Node to send "H…
Web Fonts
There's always been a problem with fonts on the Internet. It's always been possible to send text, images, and videos, but until recently there's been …
jQuery
jQuery is an extremely popular front-end library for web development due to its simplicity and power. According to builtwith.com, jQuery is used in ov…
Contributing Code on GitHub
If you've been looking to get into contributing your skills and ideas to the open-source community, this guide should be able to help you out. The fir…
parallaxBG
I wanted to try my hand at developing a packaged script that you could include on a page with no dependencies (such as jQuery). Today, I'm presenting …
Version Control
The advent of electronic data brought new challenges to the way we keep revisions of information. Keeping track of what happens to a piece of data bec…
Backbone.js
It becomes apparent that as you start building more and more client-side JavaScript functionality to an application, the code can quickly become a har…
Node.js
From Nodejs.org: > Node.js is a platform built on [Chrome's JavaScript runtime](http://code.google.com/p/v8/) for easily building fast, scalable netw…
Programming Fonts
One of the greatest things a programmer can do to make development better is pick a decent font to work with. The default on many IDEs is usually bori…
960 Grid System
One amazingly helpful design tool I've used recently is the grid system. Specifically on this site, I'm using the 960 Grid System. Essentially, it all…
SQL as Understood by SQLite
This post is part of a project to move my old reference material to my blog. Before 2012, when I accessed the same pieces of code or general informati…