Posts

Resolving Invalid Key File Errors With Amazon Aurora
Fri, Jul 23, 2021 - ~600 Words
When adding a column to a large table on an Aurora Mysql 5.6 db.r5.large instance we encountered a disturbing error: Mysql2::Error: Incorrect key file for table 'applicants'; try to repair it` The migration succeeded in our staging environment (with a smaller instance size) and in another production deployment that has very little data, but had failed on the largest instance, both in terms of the database instance type and data volume.
Read more →
Showing users friendly errors when using Liquid templating in Rails
Fri, May 7, 2021 - ~800 Words
When allowing users to work with templates in your system, e.g. for a CRM where you might want email templates, Liquid is a very widely-used option. If it has worked for Shopify all this time then there’s a good chance it will work for our users. In this post I’ll touch on how to use Liquid in your Rails application, but the main problem solved here is how to make the template syntax error messages friendlier for your users.
Read more →
Getting a Quick Summary of Failures on Github Actions With RSpec
Wed, Jan 27, 2021 - ~500 Words
We recently migrated from Circle CI to Github Actions to take advantage of the ability to have all CI runs start immediately no matter how many branches we pushed up at once (on Circle we paid for a limited number of runners, whereas on Github Actions you pay for the minutes used). One thing that we missed however was the short summary of failures that Circle would give us if any spec failed.
Read more →
Automating some steps of the conversion of an existing codebase to TypeScript
Wed, Sep 2, 2020 - ~300 Words
Below is a simple script which will take the list of .jsx files (in this case under the app/javascript directory and for each file it will rename it to have a .tsx extension, and then if webpack compiles (which means that the code type checks) and all tests pass, then this rename can be converted. If either fail, then the rename is reversed and the next file is tested. The motivation for this is that in a codebase of some hundreds of JS(X) files, the majority can actually be renamed cleanly, in part as currently we allow the any type implicitly.
Read more →
Zero Downtime Migrations With Rails and Mysql 5.6+
Sat, Apr 18, 2020 - ~700 Words
As the size of your tables increases the risk of downtime also increases as MySQL will by default apply a full table lock for many typical DDL operations. If you find yourself in the position where adding a column to a table will cause downtime for your application then you may avoid transformation of your schema in general, which can stop a major part of the system design from evolving.
Read more →
Setting Up React and Bootstrap 4 on Rails 6
Sun, Sep 8, 2019 - ~800 Words

In this post we will take a freshly-created Rails 6 app and set up React with Bootstrap 4 such that both the Rails and React-based views can use Bootstrap components.

Read more →
Initial Thoughts on Ruby Pattern Matching
Tue, Jul 2, 2019 - ~800 Words
This post represents a first attempt to evaluate the new pattern matching feature in Ruby 2.7 with a view to determining what use cases it might be a good fit for, both in general and in the context of Ruby. Thanks to @mametter for corrections to this post. Use case: processing JSON This is perhaps the most directly useful application of pattern matching that I could find. Taken from this slide.
Read more →
Improving Vim/Neovim Rendering Performance
Mon, Apr 15, 2019 - ~400 Words

A work in progress, but if you’re experiencing slow rendering performance in vim or neovim (particularly in Ruby files) then here is a list of things to try for a hopefully smoother experience.

Read more →
Recurring Issues Installing Ruby C Extensions on OSX Mojave
Thu, Mar 7, 2019 - ~400 Words

Recently I have had to take the time to fix failed installations of Ruby libraries which build C extensions on Mojave in multiple development environments and across multiple versions of Ruby. The solution(s) are in the end thankfully quite straightforward.

Read more →
My Development Setup
Sat, Mar 2, 2019 - ~300 Words
Terminal / Shell Dotfiles use the Thoughtbot collection as a lightweight base, with all customisation performed in a separate dotfiles-local repository. This gets me: Basic configuration of zsh A basic tmux setup vim/nvim integrated with tmux such that moving between vim and tmux panes is seamless, using the same motions. And most importantly, with this approach there are no lines in the config that I do not understand. Using Alacritty for a lower-latency experience.
Read more →
Readline Problems With Ruby on OSX
Fri, Mar 1, 2019 - ~200 Words
A recurring issue with running a Ruby development environment on OSX is integrations with external libraries, particularly readline. As various elements of the setup evolve (e.g. OSX, Homebrew, Ruby, rbenv) breakage occurs which causes development time to be spent debugging basic machine issues. The relevant error message and failure, issued by byebug was: Sorry, you can't use byebug without Readline. To solve this, you need to rebuild Ruby with Readline support.
Read more →
Install MacVim on OSX
Sat, Feb 16, 2019 - ~100 Words

TLDR

brew cask install macvim

Read more →
Notes on the use of Staging Environments on Heroku
Fri, Sep 2, 2016 - ~1000 Words
The setup and use of a separate staging environment is covered (almost) adequately by Heroku’s documentation on the matter. And yet I must be missing something, as forking my app didn’t do what I expected. In forking a running production app to create a staging clone environment what I expected to have afterwards was: A Heroku app called appname-staging, running the same version of the application A newly-created hobby-dev Postgres instance containing the production data That the staging app should be targeting the new staging database, i.
Read more →
Simpler Handling of AJAX Form Errors in Rails 4
Thu, Aug 18, 2016 - ~1500 Words
The Problem With unobtrusive Javascript, converting a form in Rails to use AJAX is as easy as setting remote: true: = form_for Client.new, remote: true do |form| = form.text_field :name This will cause our form to submit asynchronously, and expect a Javascript response, which will be executed directly to e.g. update the page appropriately. DHH recommends that we design our apps in this manner, where in the Javascript response we re-render the model using its template and use jQuery to update the HTML on the page.
Read more →
Kinesis Freestyle 2 Keyboard Review
Sun, Mar 6, 2016 - ~200 Words
First Impressions First impression upon unboxing the keyboard is that all of the reviews that I had read were out of date–Kinesis have clearly paid attention to feedback and some of the gripes that I had read about (e.g. having a browser ‘home’ hotkey, making the insert function require the pressing of fn) had been addressed. As such, the keyboard layout is easily standard enough to allow for a smooth transition from a regular keyboard (Apple wired and wireless keyboards) to the Kinesis–thus far I have not experienced any real slowdown in typing speed.
Read more →
Using the ES7 Spread Operator with Webpack
Fri, Feb 5, 2016 - ~300 Words
A short post on configuring Webpack to enable use of the ES7 spread operator
Read more →
Reinstalling MySQL on OSX using Homebrew
Thu, Jan 28, 2016 - ~300 Words
If you find that you need to have a particular version of MySQL installed on your OSX machine (e.g. to match the version running in production) but you already have a different version of MySQL installed via Homebrew, then the notes below may help you to replace the installed version with the one you need. DISCLAIMER: The following instructions involve the complete removal of the existing MySQL installation, including any databases.
Read more →
Robust Integration Testing in Rails 4 with RSpec, Capybara and Selenium
Wed, Aug 20, 2014 - ~2900 Words
The Problem Using RSpec and Capybara to test your Rails apps can make writing tests easier which is good both from a perspective of getting people to actually write tests but also for our general productivity as developers. While it has its detractors, I like the terse syntax and ease with which we can define our own helpers which help set up certain contexts such as in this case setting up the default account and switching into its subdomain:
Read more →
Don't Set Goals—Create Systems
Tue, Oct 15, 2013 - ~700 Words
Cartoonists are an interesting lot: they have a job that many would see as being unproductive or even pointless, but since when did being incisive become unproductive? Bill Watterson’s insights on life as expressed through Calvin and Hobbes have entertained and helped millions. If you haven’t seen this bit of tribute art, where a fan has drawn artwork to accompany the text of a speech by Bill then I highly recommend you take a look now.
Read more →