The personal blog of Sam McLeod

New Zealand Otago Trip in a 2019 Mustang GT

In late November of 2018 I was lucky enough to get my hands on the upcoming 2019 Sport spec Mustang GT v8 to be its first driver. I’m not usually an American Muscle enthusiast, but the new 2019 GT really is quite different from its slightly older counterparts, with a new specially developed 10 speed gearbox (yes, 10 gears - because more is better right?), tuned up suspension and so seemed like it would make for a pretty fun trip. I might do a review of the car at some point, needless to say it was a lot of fun, very quick, handled surprisingly well for a big America v8, it did however suffer from very poorly designed console controls.

Run youtube-dl (or similar) in the background

I wanted an alias or function to use youtube-dl in the background. Looking around the web lots of people seemed to want this and most of them were banging their heads against a wall due to: A) bash quoting B) backgrounding dying when their terminal closed C) passing the argument (url in my case) to the function Here’s a simple function I whipped up that seems to ‘just works’β„’: function yt { nohup youtube-dl "$1" --no-progress 2>&1 > youtube-dl-"$(date +%Y%m%d-%H%M%S)".log & } And if you don’t want logs, simply send the output to /dev/null: function yt { nohup youtube-dl "$1" --no-progress 2>&1 > /dev/null & } Example:

Disabling scroll-wheel zoom in Firefox

This feature annoys me endlessly, I end up zoomed in and out of websites all over the internet. … But the fix is easy and there’s no addons required. Navigate to about:config (in Firefox’s URL bar) Change the value of the following two properties to 0: mousewheel.with_control.action mousewheel.with_meta.action If you use Firefox sync and want these settings to sync between your machines, also add the following properties: Create two new properties both of type boolean and set them to true: services.sync.prefs.sync.mousewheel.with_meta.action services.sync.prefs.sync.mousewheel.with_control.action Enjoy!

Highlands Festival of Speed 2018

Last weekend I headed to New Zealand and marshalled at the Highlands Festival of Speed. The Highlands Festival of Speed is a weekend packed with some of the best modern classic racing you will see in New Zealand. Featuring the Pre 65 Racing, Mainland Muscle, Formula Libre, South Island Porsche, OSCA, Highlands Modern Classics/Nostalgic Classics and the Highlands Sprint Series. This is a weekend of true blue Kiwi racing starring some of New Zealand’s most well known racing legends. VideosI’ve supplied the car details at the bottom of this post. PhotosNote: These images are heavily compressed for the web, I have higher quality photos, just email or send me a DM on Twitter if you want them.

Flash Storage and SSD Failure Rate Update (March 2018)

It was almost 3 years ago that my open source storage project went into production. In that time it’s been running 24/7 serving as highly available solid state storage for hundreds of VMs and several virtualisation clusters across our two main sites. I’m happy to report that the clusters have been operating very successfully since their conception. Since moving away from proprietary ‘black box’ vendor SANs, we haven’t had a single SAN issue, storage outage. We’ve also been so please with the success of the design that we’ve grown from a single cluster at each site to a total of 6 clusters (12 nodes).

Theory of constraints

“A chain is no stronger than its weakest link” Any improvement made anywhere besides the bottleneck is an illusion. Any improvement made after the bottleneck is useless because it will always remain starved waiting for work from the bottleneck. Any improvement made before the bottleneck merely results in more β€˜work’ piling up at the bottleneck. Identify the system’s constraint(s) (that which prevents the organisation from obtaining more of the goal in a unit of time) Decide how to exploit the system’s constraint(s) (how to get the most out of the constraint) Subordinate everything else to the above decision (align the whole system or organization to support the decision made above) Elevate the system’s constraint(s) (make other major changes needed to increase the constraint’s capacity) Warning!

Top album picks for 2017

Here are my top album pics for 2017 (in no particular order) Note: This is by no means an exhaustive list, it’s just the top albums that really stood out to me and in all fairness, I’ve thought of several others since so there may be a follow up post (or two). Father John Misty - Pure Comedy As a bonus, a short film was released with the album: From Wikipedia: Most of Pure Comedy was written in 2015. It touches on themes of progress, technology, fame, the environment, politics, aging, social media, human nature, human connection and his own role in it all.

HP 4951C Protocol Analyser

My good friend Joel Shea received a most unlikely gift this Christmas - A vintage HP 4951 Protocol Analyser. According to the HP Computer Museum: Original Price: $3595 The 4951B was replaced by the 4951C and 4952A in 1986. Both new models handled Async, BSC, SDLC, HDLC, X.25 and SNA protocols. The 4951C also handled DDCMP, while the 4952A did not. The 4952A handled X.21 while the 4951C did not. Both new analysers used a floppy dive (618 KB) for removable media. Promo Photo: Joel’s specimen: And the original spec sheet:

Talk - Clustered, Distributed File and Volume Storage with GlusterFS

Using GlusterFS to provide volume storage to Kubernetes as a replacement for our existing file and static content hosting. This talk was given at Infracoders on Tuesday 14th November 2017. NOTE: Below link to slides currently broken - will fix soon! (03/08/2019) Click below to view slides (PDF version): Direct download link

Applying syntax in Sublime based on the first file line

In vim, you can add a comment at the top of files to set the syntax, e.g.: # vim: syntax=ruby In SublimeText there are many ways to detect syntax, one interesting approach I’ve recently found useful is to match on the top line in the file. For example, with Puppet there is a file called Puppetfile, it has no extension but it’s really Ruby syntax, so it’s useful to add linting incase you miss something simple like a , and break deployments. I use a plugin called ApplySyntax making it easy to apply syntax options to files, I believe you can do this in the languages syntax without the plugin but YMMV:

Broadcom, Or How I Learned To Start Worrying And Drop The Packet

Earlier this week we started the process to upgrade one of our hypervisor compute clusters when we encountered a rather painful bug with HP’s Broadcom NIC chipsets. We were part way through a routine rolling pool upgrade of our hypervisor (XenServer) cluster when we observed unexpected and intermittent loss of connectivity between several VMs, then entire XenServer hosts. The problems appeared to impact hosts that hadn’t yet upgraded to XenServer 7.2. We now attribute this to a symptom of extreme packet loss between the hosts in the pool and thanks to buggy firmware from Broadcom and HP. We were aware of the recently published issues with Broadcom/HP NICs used in VMware clusters where NICs would be bricked by a firmware upgrade.


We’re in the process of shifting from using our custom ‘glue’ for orchestrating Docker deployments to Kubernetes, When we first deployed Docker to replace LXC and our legacy Puppet-heavy application configuration and deployment systems there really wasn’t any existing tool to manage this, thus we rolled our own, mainly a few Ruby scripts combined with a Puppet / Hiera / Mcollective driven workflow. The main objective is to replace our legacy NFS file servers used to host uploads / attachments and static files for our web applications, while NFS(v4) performance is adequate, it is a clear single point of failure and of course, there are the age old stale mount problems should network interruptions occur.