RSS.Social

Thomas Hunter II

follow: @[email protected]

Posts

I Photographed San Francisco No Kings Protest

I Photographed San Francisco Carnaval 2025

The scales are tipping in the Software Engineering industry

Notes on installing Linux on a 2008 Apple Intel iMac

Post Apocalyptic Computing

AI will change the world but not in the way you think

Running Debian Bookworm on a 13" AMD Framework Laptop

I Photographed San Francisco People's March 2024

I Photographed Santa Skivvies Run 2024

Writing Multithreaded Node.js Applications: Is it worth it? at NodeConf EU

The Ultimate Fujifilm X-E1 Camera Guide

Using an iPod Classic Monochrome 4th Gen in 2024

Discreet, Cheap, Film-Like EDC Street Photography Camera in 2024

Map Buddy Product Retrospective

My Photography is Featured at Philz Coffee in Potrero Hill

Introducing GenAI in O’Reilly Answers

I Photographed San Francisco Carnaval 2024

I Photographed San Francisco Bay to Breakers 2024

My Photography is Featured at Ikon Coffee

Photography is a Loss of Dimension, Senses, and Fidelity

A Cheap and Pocketable Camera in 2024

Enabling English on a Japanese Panasonic Lumix GX1

After your first 10,000 Photographs

Repairing a Minolta X-370 Light Leak

I Photographed San Francisco Crawloween 2023

Getting into Photography on a Budget in 2023

PS2 RPI4 Part IV: Conclusion

How to file a CCPA complaint against Reddit

How to Delete your Reddit Account and All Data under GDPR/CCPA

Welcome to your Chat Bot

Emulating Windows XP on Linux in 2023

How NOT to Measure Latency by Gil Tene

mig: The Universal Database Migration Runner

Setting Open Graph Tags without Server Side Rendering

Detecting if a PWA/TWA is Installed

Node.js Package Management at UtahJS

Multithreaded JavaScript: Concurrency Beyond the Event Loop

Distributed Systems with Node.js: Humble Books Bundle

GitHub Actions for Node.js Apps at DevOps.js

The Death of a Node.js Process

Logging, Metrics, and Tracing with Node.js at Node Congress

Node.js Modules, Packages, and SemVer

Zero-downtime deploys with DigitalOcean, GitHub, and Docker

PS2 RPI4 Part III: Underway

PS2 RPI4 Part II: Internals

PS2 RPI4 Part I: Restoration

Distributed Systems with Node.js: Building Enterprise-Ready Backend Services

Go v1.15.8 vs Node v14.15.5 Microbenchmark

Elpizia

Installing the Node.js Binary Archive on Linux

The Apex Consumer

Go v1.13.3 vs Node v12.12.0 Microbenchmark

Cheap and Portable Writing Device in 2019

Fixing the Massdrop AKG K7XX Squeak

On using Service Workers with Static Content

Nine Volt Daisy Chain

Why should I use a Reverse Proxy if Node.js is Production-Ready?

Cobalt Caliber

JavaScript Symbols: But Why?

Node.js Task Runners: Are they right for you?

Introducing Package Diff

Protecting your JavaScript APIs

Treating OpenBox like a Tiling WindowManager

The Increasing Need for Regulation of the Software Industry

Removing gVim Right and Bottom Borders

Common API mistakes and how to avoid them

On Migrating from Google Analytics

Review of the iClever Foldable Bluetooth Keyboard

Books I'm Reading to Become a Better Writer

Compromised npm Package: event-stream

17 Pounds in 44 Days: My Adventure with Keto

On Migrating from Wordpress to Static Markdown

The Monster in the Basement

Why you should avoid ORMs (with examples in Node.js)

Essential Firefox Tweaks

JavaScript Object Type Coercion

JavaScript Object Property Descriptors, Proxies, and Preventing Extension

Advice for Technical Public Speaking: Part 3

Advice for Technical Public Speaking: Part 2

Advice for Technical Public Speaking: Part 1

Go v1.10.3 vs Node v10.6.0 Microbenchmark

Recent Concerns about Node.js Security

Node.js and Lambda Three Part Series

Developing Cobalt Dungeon using Phaser and Cordova

Cobalt Dungeon Dev 01: Creating a New Room

Cobalt Dungeon for iOS is now available

Cobalt Dungeon for Android is now available

Cobalt Dungeon Dev 02: Creating a Bitmap Font for Phaser

Cobalt Dungeon Dev 03: FL Studio Overview

The Long Road to Async/Await in JavaScript at SF Node

I'm working on a mobile game called Cobalt Dungeon

Support me on Patreon

Twitter Plays Zork: @DemocraticZork

Go v1.9.1 vs Node v8.9.0 Microbenchmark

The Long Road to Async/Await in JavaScript at NodeConfAr17

What have I been up to? Late 2017 Edition

Is it time to replace REST with RPC?

Enterprise Conversation Episode 14: OpenTable with Thomas Hunter

Refactoring a Node.js codebase using Async/Await

Random Meetup Attendee Bookmarklet

2017: A Central Europe Odyssey

Redis and Node Part 4: Lua Scripting

Redis and Node Part 3: Atomicity with MULTI

Redis and Node Part 2: Shared State

Redis and Node Part 1: The Basics

Digital Nomad: Inventory Advice

HTTP API Design Part 4: API Standards

HTTP API Design Part 3: Bodies

HTTP API Design Part 2: Responses

HTTP API Design Part 1: Requests

Advanced Microservices

Node.js, Redis, and You! at RedisConf17

Linux Mint Disable "Recently Used"

Ubuntu 16.04 LTS Xen stuck on "Loading Initial Ramdisk"

Service Discovery With Node.js and Consul at SF Node

Online Colorscheme Configurator for i3, i3status, dmenu

A Holistic Approach to Microservices

Running a Node.js process on Debian as a Systemd Service

My Trip to Japan

Enabling Yubikey U2F support in Linux

The JavaScript Event Loop Presentation (2016 Edition)

Installing Linux Mint on an XPS13 (9350)

The only bad thing about ES7 Async/Await

Upgrading to the XPS 13 (9350)

NextPlayer: A Node.js module for managing player turns

HTML5 Mobile Apps, Part 5: Ecosystem Opinions

HTML5 Mobile Apps, Part 4: Live Operations

HTML5 Mobile Apps, Part 3: Distribution

HTML5 Mobile Apps, Part 2: Performance

HTML5 Mobile Apps, Part 1: Development and Debugging

Strategic Game of Life: Mobile Edition

Upgrading Linode II: Xen to KVM

The long road to Async/Await in JavaScript

Tips for Building Mobile Games in HTML5

Gridloche: Realtime Multiplayer Go-Like with RPG Elements

Upgrading Linode

Robot Onslaught: Multiplayer twin-stick 2D shooter using PubNub

Arpad: An ELO Ranking System for Node.js

Consumer Centric API Design

Linux Kernel 3.15.3 on Linux Mint 17 (or other Debian-Based Distributions)

Running a Node.js process on Debian as an init.d Service

What have I been up to? Early 2014 Edition

Principles of good RESTful API Design

Book Review: Debian 7: System Administration Best Practices

JavaScript and Canvas version of Conway's Game of Life

Letting PHP know that its connection behind NGINX is over HTTPS

See which user accounts hackers try to access on your server the most

Tips for assembling the O2 (Objective2) Headphone Amplifier Kit

Only Push/Pull Current GIT Branch

Remove OpenDNS from Linux Mint

Enable Emoji fonts on Debian / Ubuntu / Mint Linux

Border Patrol Saga

Cheating at Cookie Clicker

Recursively download website files using WGET

Instant Backbone.js Application Development

Book Review: Hands-on Testing with PHPUnit How-to

Installing Redis on Debian as a Service

Fixing Homebrew

SSH into a machine with a dynamic IP

Setting up a Security Camera for a Linux Webcam

Track IP Address using DD-WRT + CRON + WGET

Safely Parse Complex Objects and Arrays in PHP

WordPress GET Variables with lighttpd

The JavaScript Event Loop [Presentation]

How to "Burn" an ISO to a USB drive in OS X

Generate OAuth Consumer Key and Shared Secrets using PHP

Set opendiff (FileMerge) as your git diff tool on OS X

Lansing Startup Weekend February 2013: GeoMonsters Presentation

Lansing Startup Weekend

SleekMVC, my PHP Framework, gets Routing support

Enable PHP Mail on OS X Mountain Lion

GeoLocation based Communication with Node.js, Redis

What WordPress 4.x Could Be

I turned on a light

Programmer Religious Wars and the Abstraction Gradient

Node App Inspired by Daniel Suarez' Book Daemon

Wacom Bamboo Splash Review

Subdomains and Google Apps with Gandi and Linode

Client-Side Terrain Tile Representation Algorithm

A Better Debian SSH Login Message

Transitioning from MediaTemple to Linode

Install Node.js on Debian 6

Visual Git History Log in Terminal Window

Using authbind with Node.js

Fun Timing Game in Canvas

Respond to JSON or XML requests from a Node.js API

Drop Root Privileges in Node.js

The Upcoming Parallel Digital Universe

Could JavaScript support Parallelism like in Haskell?

All Hands Active Board Member

Configurable Object to XML Converter for Node.js

How Cobalt Calibur uses Canvas to display Sprite-Based Graphics

MongoDB Node.js driver collection select doesn't require callback

GitHub Connection Timed Out

CouchDB and PHP Web Development

Node.js Convert JSON to XML, Pluralize

Backup External Music Collection using Rsync

Fixing ApacheBench on OS X Lion

Spaghetti Architecture and the Importance of Starting Over

Review of OpenShift Node.js Support

Step by Step guide to getting Cobalt Calibur running on OpenShift

Raspberry Pi with Tons of Hardware

Cobalt Calibur 3 Open Source

Copying OpenIndiana Image onto USB in OS X

My First Arduino Project

Code School Review

Series or Parallel Power-Source Switch

Extended Pigpen Cipher to Include Numbers

Auto Mount External Drives in Debian

Per-User Password Hashing Algorithms

Recursively Delete Files by Extension

Recursively convert OGGs to MP3s

Node.js GPS Module

A Primer on Web Caching

The Future of Augmented Reality

PHP + Apache Stack vs Node.js

OS X Wireless Control from the CLI

Scan for Computers on Local Network with Nmap

SSHing into Arch Linux Raspberry Pi

Updating Pacman on the Raspberry Pi

Linux CLI apps should have a --json flag

Gracefully Kill Node.js App from Ctrl+C

Move special OS X user folders to external drive

Determine Wireless Encryption Type

Express.js Pass-Through Directory

Bad Mount Point Input/Output Error

MacBook Pro with SSD and Hard Drive

Git SSL Errors

NPM SSL Errors

Settling In to a New Mac

Female Voice using eSpeak

Know your Wireless Cards!

Speech Synthesis and Bluetooth with Node.js

Suppressing SSH MOTD Messages

Re-Map Caps Lock key to Esc in OS X

Why Android should switch to Go

NERF Gun Laser Instructions

Node.js Robotics Software Suite

RedBubble Poor Product Quality

Creating Self Executable PHP Scripts

Open Sourcing Facebook App, Squirrelify

Open Sourcing EVE Crawler

Cobalt Calibur: Roadmap

Ignore SSL Errors with NPM Node Package Manager

Pitfalls when Renaming your GitHub Account

Using .htaccess to Prevent www Subdomain

Global gitignore vs repository gitignore

Modded Laser NERF Gun

Building a Really Simple Node.js Module

Redirect all Pages from Old Domain to New Domain Using .htaccess

Linux Force Dismount

Moving Content to a new Domain and Keeping SEO

Hiding Files and Folders in OS X Finder

Open Source AJAX Game Engine

Why Node.js is awesome: A short history of web applications

Tracking Backbone.js "Page Views" with Mixpanel

The Shark Fin Conjecture

Why the MPAA and RIAA will soon be gone

Cobalt Calibur 3.0: Node.js, MongoDB, Redis, Backbone.js

How to use javascript event bindings to make callbacks cleaner

Xpath Expressions Explained

Tech Startup Entrepreneur Books

Force or Prevent WWW subdomain with lighttpd

How to generate a Self Signed SSL Certificate for lighttpd

Tumblr-like Template Syntax PHP Library

Really simple SSH proxy (SOCKS5)

GIT: Colored Output, Shortcut Commands, Autocompletion, and Bash Prompt

Using Swipes in MacVIM in OS X

Simple PHP Namespace Friendly Autoloader Class

Scheduling a daily Cron task in Debian to check external IP

Building Custom OS X Dashboard Widgets

How to login via SSH Without a Password

Delay command execution in X-Chat

Submitting Multi-Dimensional Array Data to PHP

lighttpd configuration to redirect subdomains

MySQL REPLACE vs INSERT ON DUPLICATE KEY UPDATE

Apache2 Outperforming lighttpd 1.5

Installing lighttpd on Ubuntu 10.04

PHP / MySQL Web Application Migration Steps

Time Differences between PHP and MySQL

Dynamic Form Actions using Different Buttons

Read GET URL variables using JavaScript

Zend Certified Engineer (ZCE) Study Guide Links

Accessing CodeIgniter Session Data using External Scripts

PHP cURL cookies not saving on Windows

Convert ASCII to UTF-8 using VBA

Web Spidering with PHP

FL Studio Piano Roll Tutorial

FL Studio Comprehensive Mixer Interface Overview

Polymorphism, Abstract Classes, and Interfaces in PHP

FL Studio Automations

FL Studio Interface Overview

Introduction to CSS: Selectors and Relationships Explained

Preloading CSS Hover Images

Simple AJAX

Password Encryption, Hashing, Salting Explained

Create Windows Vista like buttons using Photoshop

Web Image Formats Size and Quality Comparison

Creating Seamless Textures using Photoshop

Introduction to Photoshop Blending Options

CSS Image Button Rollovers

CSS Box Model differences in Firefox and Internet Explorer

Database Administration using phpMyAdmin

Free Notepad++ Web Developers Theme

Pagerank and higher search engine rankings explained

Change PHP Timezones

Setting up VHOSTS using XAMPP/Apache in Windows

Changing MySQL Default Character Sets

Generating Password Protected ZIP Files using PHP

MySQL Fulltext Search Ignored Words

Data Hiding in a Word Document

PHP Navigation System using Single Entry Point

Search Engine Friendly Exit Counter

Clean user data using PHP and Regular Expressions