Software engineering and building products.

[Part IV] Working in the US with the E3 Visa

[Part IV] Working in the US with the E3 Visa

Part IV of the guide for moving from Melbourne to San Francisco covers my experience with the E3 visa, which allows myself and my wife to work in the US.
Jan 21, 2023
[Part III] Compensation and Interviewing in Tech: Differences between Australia and the US

[Part III] Compensation and Interviewing in Tech: Differences between Australia and the US

This is Part III, the third post in a series about how I moved from Australia to the US as a software engineer. This post dives into the compensation and interviewing differences used by tech companies in San Francisco.
Jan 21, 2023
[Part I] Relocating from Australia to the US: My Experience as a Software Engineer

[Part I] Relocating from Australia to the US: My Experience as a Software Engineer

The first part in a series of 4 posts about my experience moving from Australia to San Francisco as a software engineer with a wife and young family.

Jan 13, 2023
[Part II] So How Did You Get a Job in the US (As An Australian Engineer)?

[Part II] So How Did You Get a Job in the US (As An Australian Engineer)?

The second post in a series about moving from Australia to the US as a software engineer. This time focussed on finding a job.
Jan 20, 2023
Encoding / Decoding JSON objects in Python

Encoding / Decoding JSON objects in Python

A summary of how to serialize and deserialize from Python data structures into JSON-compatible strings, which is especially useful when working with API requests and responses.

Mar 12, 2019
Bit Manipulation Part 2 - Bitwise operators in Python

Bit Manipulation Part 2 - Bitwise operators in Python

A primer on bitwise operators in Python - left and right shifting, bitwise and / or / exclusive or, and complements.

Bit Manipulation Part 1 - Understanding binary numbers in Python

Bit Manipulation Part 1 - Understanding binary numbers in Python

An easy introduction to binary numbers, which will lead to a follow-up article on bit manipulation in Python.

Primer to Python multiprocessing, multithreading, and asyncio

Primer to Python multiprocessing, multithreading, and asyncio

Basic overview of parallel / concurrent programming, including comparisons between multiprocessing, multithreading, and asyncio (coroutines) in Python.

Oct 24, 2018
Redshift and MySQL's giant list of datetime / timestamp functions

Redshift and MySQL's giant list of datetime / timestamp functions

How to find Redshift current date and other common expressions for working with date, time, datetime, and timestamp columns in MySQL 5.7.x and Redshift.

Sep 8, 2018
Method delegation in Python vs composition or inheritance

Method delegation in Python vs composition or inheritance

Using Python, a short example on how to delegate specified methods to another object, as compared to composition and inheritance.

Jul 11, 2018
Using Python enums in SQLAlchemy models

Using Python enums in SQLAlchemy models

How to use enums in your models to enforce value consistency.

Python command-line scripts with argparse

Python command-line scripts with argparse

A template file for using conditional arguments when running Python scripts from the command line.

Feb 15, 2018
SQLAlchemy merge, flush, commit, refresh: Key Differences Explained

SQLAlchemy merge, flush, commit, refresh: Key Differences Explained

I've always struggled to remember between these very similar methods in the SQLALchemy ORM - so I took some time out to research these and write it down.

Nov 2, 2017
Code Review Checklist - the most important things to look for

Code Review Checklist - the most important things to look for

A few notes on the code review process, and the steps I go through when reviewing.

Sep 21, 2017
SQLAlchemy Many to Many Relationships: An Example in Flask

SQLAlchemy Many to Many Relationships: An Example in Flask

Building model definitions for many-to-many relationships via a secondary table.

Jul 28, 2017
Bash script to relink alembic migrations

Bash script to relink alembic migrations

Sick of `alembic merge heads` slowing down your builds? Here's a short bash script I wrote to rename your migration files and update its down revision.

Running Metabase locally as a service

Running Metabase locally as a service

Want the power of Periscope or Tableau, without the big monthly bill? Setup Metabase to run locally on your CentOS server.

Shared filesystem between servers using NFS

Shared filesystem between servers using NFS

Mount a directory to be shared between multiple servers using Network File System (NFS).

Using model callbacks in SQLAlchemy to generate slugs

Using model callbacks in SQLAlchemy to generate slugs

Dive into SQLAlchemy's little known `event.listen` method to automatically generate slugs when saving a model instance.

Feb 8, 2017
Overriding default Jinja attributes in Python view templates

Overriding default Jinja attributes in Python view templates

How to use the `do` Jinja extension to modify an existing dictionary in your view template.

Jan 30, 2017
Create a custom Alexa Skill with AWS Lambda - Part 3 (Lambda)

Create a custom Alexa Skill with AWS Lambda - Part 3 (Lambda)

Configuring your Lambda function for use with an Alexa skill.

Create a custom Alexa Skill with AWS Lambda - Pt 2 (Alexa Skill)

Create a custom Alexa Skill with AWS Lambda - Pt 2 (Alexa Skill)

How to create and configure a custom Alexa Skill.
Create a custom Alexa Skill with AWS Lambda - Part 1 (Overview)

Create a custom Alexa Skill with AWS Lambda - Part 1 (Overview)

How to build a server-less application which handles authentication, saves details to DynamoDB, and communicates via Amazon's Alexa-enabled products.
Custom Jinja template filters in Flask

Custom Jinja template filters in Flask

A short snippet for creating a template filter, to present datetime objects in Jinja templates.

Oct 31, 2016
JSON field type in SQLAlchemy (Flask / Python)

JSON field type in SQLAlchemy (Flask / Python)

Want to store JSON-serialized data in your database? But sick of calling `json.loads()` and `json.dumps()` when dealing with this data in your Flask app? Read on!

Sep 9, 2016
How to Open a Port with IPtables [Step by Step Guide on CentOS]

How to Open a Port with IPtables [Step by Step Guide on CentOS]

A step by step guide (with example files) to open a port using IPtables, to allow restricted inbound traffic to a server.

Resolving alembic merge branch conflicts

Resolving alembic merge branch conflicts

How to fix alembic's "Multiple head revisions are present for given argument 'head'" error.

May 23, 2016
Automated server deployments with Ansible

Automated server deployments with Ansible

Guide to automating server deployments with Ansible playbooks, with example files.

Sending log files to Logstash with Elastic's Filebeat

Sending log files to Logstash with Elastic's Filebeat

Centralize your logging by using Filebeat to send log files to Logstash.

Using Python's Watchdog to monitor changes to a directory

Using Python's Watchdog to monitor changes to a directory

A small Python script to take action whenever a new file is uploaded to a directory or its contents change.

Data Pipelines - Airflow vs Pinball vs Luigi

Data Pipelines - Airflow vs Pinball vs Luigi

Review of 3 common Python-based data pipeline / workflow frameworks from AirBnb, Pinterest, and Spotify.

Bash script to monitor instances and MySQL

Bash script to monitor instances and MySQL

A simple Bash script to check multiple server instances are responding, and rows are being added to a MySQL database.

Line-by-line code profiling in Python

Line-by-line code profiling in Python

How to find slow sections in your Python code.

Oct 2, 2015
Serving PHP with FPM (FastCGI) using Nginx on CentOS

Serving PHP with FPM (FastCGI) using Nginx on CentOS

Installation steps to start serving any PHP application (eg Wordpress) using FPM on CentOS, together with a sample Nginx config file.

Simple sysadmin tools - Screen on CentOS

Simple sysadmin tools - Screen on CentOS

Screen is one of my favourite utilities when managing servers - it allows you to use multiple shell windows from a single SSH session and to keep these active even after logging out. It is super useful for monitoring long-running processes.

Parsing JSON objects as custom classes in Typescript and Vue

Parsing JSON objects as custom classes in Typescript and Vue

Short snippets showing how I usually parse JSON objects from API responses into a custom Typescript class, and how it's used in VueJS.
Aug 19, 2021
Use aliases to supercharge your bash and zsh terminal

Use aliases to supercharge your bash and zsh terminal

A handful of useful command line snippets for Bash and ZSH.
Jun 13, 2021
Resetting Algolia's vue-instantsearch when clicking a result

Resetting Algolia's vue-instantsearch when clicking a result

Fiddling with Algolia's vue-instantsearch component to reset the search input when selecting a result.
Mar 10, 2021
Introduction to Client-Side Javascript in 2018

Introduction to Client-Side Javascript in 2018

My notes for introducing a junior engineer to client-side Javascript for the first time, touching briefly on vanilla JS, jQuery, and VueJS.

Sep 30, 2018
Code Review Principles - understand what makes effective reviews

Code Review Principles - understand what makes effective reviews

Some thoughts on what code reviews are and are not.

Sep 2, 2017
Supercharged Javascript and CSS animations

Supercharged Javascript and CSS animations

Summary notes from the Browser Rendering Optimization course on Udacity focussed on building 60 fps apps.

Apr 22, 2015
How do you measure user experience quality?

How do you measure user experience quality?

Are there any factors which help evaluate a product as a bronze, silver, or gold standard of quality?

Apr 15, 2015
Overview of basic terms in AngularJS

Overview of basic terms in AngularJS

A glossary of terms commonly used in Angular JS documentation and tutorials.

Mar 26, 2015
Testing a $rootScope broadcast event with Jasmine

Testing a $rootScope broadcast event with Jasmine

A short snippet for testing AngularJS with Jasmine.

Feb 24, 2015
Should I use AngularJS or jQuery?

Should I use AngularJS or jQuery?

AngularJS has a good balance of maturity, community support, and productivity - suitable for use either by itself or together with jQuery in production apps.

Jan 31, 2015
Debugging mobile apps with Charles proxy

Debugging mobile apps with Charles proxy

Notes on using a HTTP / reverse proxy (Charles) to view all traffic between your mobile device and the internet.

Aug 16, 2016
Creating lists of CSS selectors with SASS

Creating lists of CSS selectors with SASS

I like to use CSS selectors like .margin-top-10, .padding-right-20, etc to quickly style a new page. Here's how I create them in SASS.

Jun 21, 2016
Understanding Time, DateTime, and timezones in Rails

Understanding Time, DateTime, and timezones in Rails

My notes on using RoR for formatting times and datetimes to strings, and parsing strings to time objects.

Sep 14, 2015
Consuming a JSON API - Part 2 (EventBus)

Consuming a JSON API - Part 2 (EventBus)

Using EventBus to update your Android app after receiving the contents of a JSON API.

Jul 31, 2015
Consuming a JSON API - Part 1 (Retrofit)

Consuming a JSON API - Part 1 (Retrofit)

Square's Retrofit library together with EventBus makes it super simple to parse the contents of a JSON API into your Android app.

Jul 16, 2015
Simple Android utility to parse config files in your app

Simple Android utility to parse config files in your app

A really simple utility file I keep around in my Android projects which processes a raw JSON file into a List of objects.

Jun 20, 2015
Android swipe to refresh, only at the top of the list

Android swipe to refresh, only at the top of the list

Build a swipe to refresh list, which only refreshes when at the top of the list.

Jun 11, 2015
Creating an instant autocomplete field in Android

Creating an instant autocomplete field in Android

How to create an autocomplete text field in Android, which displays suggestions in the dropdown and has a clear button.

Jun 3, 2015
Rspec - How to test a controller has included concerns

Rspec - How to test a controller has included concerns

A short Rspec snippet to verify the correct concerns have been included in a controller.

May 19, 2015
How to split Rails routes.rb into multiple smaller files

How to split Rails routes.rb into multiple smaller files

Organise your routes.rb file into smaller files, works in both Rails 3 and 4.

Apr 28, 2015
Rails 4 Conditional Page Cache for Logged In Users

Rails 4 Conditional Page Cache for Logged In Users

A technique to generate a full static HTML page for caching, based on any specified conditions.

Feb 19, 2015
Recommended Rspec style for Rails models

Recommended Rspec style for Rails models

Listing out my top 10 recommendations for how to structure and layout rspec tests for Rails models.

Feb 12, 2015
Made with JoyBird