Ruby 2.5: yield_self
yield_self is coming to Ruby 2.5. What is this long requested feature, and how does it work? Some features take a while to get into a Ruby release. As you can see from the original request on Ruby’s Redmine issue tracker, yield_self has been brewing for 5 years. It has been waiting on a good name, and the Ruby team has settled on one. But what is it? To understand… Continue reading
Ruby 2.5: The Christmas Present
Let's talk a wee bit about Ruby 2.5. This starts a week of looking at upcoming features in the language. Here at FreeAgent Towers, we use a lot of Ruby. The application itself is written in Rails, and our website is static HTML, CSS and JS, but is generated with Middleman. We love it, and so we follow its development closely. One of the exciting points in the Ruby year… Continue reading
FreeAgent Testermonials: Getting rid of ‘QA’ and why what we call things matters
In this Testermonial post, FreeAgent's resident test engineer describes why we've rebranded 'QA' and why what we call things matters. As mentioned in my previous Testermonial, my only gripe when starting at FreeAgent — and a very minor one at that — was the rather entrenched use of the term quality assurance or QA in the development and release process to describe the pre-release testing phase which occurs before deploying… Continue reading
We're hiring! Check out our vacancies 👈
External authentication scripts in OpenVPN the right way
OpenVPN is a wonderfully flexible piece of software in anyone's toolkit, but recently we found a sharp edge that wasn't the most obvious thing to work around. After spinning up a new VPN server we wanted to add username/password authentication against an external source. Looking at the OpenVPN documentation, the --auth-user-pass-verify <script> flag provides this functionality. Writing the script for this was easy enough — read the credentials from a… Continue reading
Running a high-availability SaaS infrastructure without breaking the bank
The cloud is commoditising web application hosting but at FreeAgent we continue to build and manage our own infrastructure, using hand-picked servers, switches and elbow grease. Why we do this is a question I commonly get asked. In this article I'll share our hosting history, how it has evolved over the last ten years, and how we now operate a high-availability SaaS infrastructure on our own hardware without breaking the… Continue reading
FreeAgent Testermonials: Making user stories valuable with exit criteria
In this post, FreeAgent's resident test engineer explores the use of exit criteria in user stories, the value they provide and how to write them (example included). Table of contents Background and prologue FreeAgent's first test engineer Testing as an embedded practice Testermonials Exit criteria in user stories Introducing exit criteria Exit criteria wins Writing valuable exit criteria An example user story with exit criteria FreeAgent’s first test engineer I… Continue reading
Schrodinger’s Ruby array
When can a single array instance in Ruby both be empty and contain items simultaneously? Read on, and find out! Continue reading
Passphrase generation using awk
Given a requirement of generating a temporary passphrase that can be communicated over the phone to another person, I thought of XKCD #936 which suggests using four random words together as a passphrase. Then there's just the question of how to generate that easily. On each system there's a file containing a list of words somewhere, on OS X it's located at /usr/share/dict/words. This contains a good ~236,000 words on… Continue reading
Programming, Burgers, and Treasure: Summer with FreeAgent
This summer it has been my pleasure to join FreeAgent as a Data Engineering intern. Alongside the analytics and architecture teams, I have been working on a new exciting feature to complement the FreeAgent application. Programming mostly with Python, I have learned a great deal from my colleagues, and I wish to share the experience with you all here on the engineering blog. Since joining in early June, the intern… Continue reading
Rest in peace, @mathie
There wasn't supposed to be anything particularly unusual about today. It started out as a typically drizzly Edinburgh summer morning, grey clouds hanging low above the castle, with just a hopeful glimpse of blue in the distance offering the prospect of a little respite later in the day. It wasn't until I arrived at my desk and checked our Slack channels that I first heard the shocking news of the… Continue reading