G403 – A website for awesome

About Me

Welcome to G403.co, my name is Gabriel and I will be your host for this journey into insanity.

I currently work at Mindera as a developer, working across various projects. Currently working on the Dunelm project as a nodejs backend developer, with lots of AWS infra and lambda fun. I’ve previously worked on Jam Pan as a React developer, producing their system for connecting creative suppliers with clients wanting to hire them. Prior to this I was working as a BE Go developer for the Mitek project.

Previously I was a system’s developer for Fusions, producing code, maintaining systems and developing automation techniques (think puppet, vagrant, jenkins and packer) to streamline development, deployment and maintenace.

I am formerly a dev-op for Go MAD Thinking, where I developed software as well maintained infrastructure.

I had previously suffered quite badly from chronic side project syndrome (CSPS), producing tonnes of projects no-one used :grin:. Slim API, a set of command line tools for generating API endpoints/mvc architecture on top of Slim using Symfony’s console component. I helped where I could with maintenance on the Slim PHP framework. I also built DOM, a front end for working with Digital Ocean’s v2 API, though with the new team functionality in DO it’s not needed so much.

I had also produced an open source deployment platform built using Rails-API and a front end client in AngularJS/Bootstrap.

Through Fusions I had maintained 3 modules for hubot, hubot-dploy.io, hubot-automerger and hubot-trello-list-alerts.

I also contribute to various open source projects in my spare time, mainly focused on PHP. I had written my own markdown website handler but now I use jekyll and github pages.

My work projects have consisted of Fusions, D&A Opticians, iCheev and I was lead developer on the corporate administration site for iCheev.

You can find me on twitter, github, LinkedIn, stackoverflow. If you see the username gabriel403 somewhere, it’s probably me.

My main languages are currently NodeJS/TS, with previous heavy experience in PHP/RoR with oodles of jQuery, AngularJS, Bootstrap and Dojo JS as well.

I’m a graduate of De Montfort University, gaining a 1st class degree with Honours in Software Engineering.

I am an open source software developer/systems administrator, who works equally on the backend, PHP (Slim, ZF2, Apigility, Symfony, homegrown), RoR as both APIs and full stack frameworks and the frontend jQuery, AngularJS, Bootstrap, Dojo Toolkit. I also have extensive experience of provisioning/managing servers with puppet and packer. As well as such things as Redis, bower, brunch and grunt. As part of my CSPS I like to try new technology, and buy the laptop sticker for it. I’ve recently aquired a hankering for docker, which we started to use when migrating some services from heroku to a DO droplet.

I am currently systems developer for Fusions PIM, a system for managing product enrichment lifecycle. I manage multiple servers for hosting the various environments as well as day to day PHP development as part of the development team. I write multiple one off apps to automate and simplify routine tasks, including a RoR application for updating the on-call support member and a Rails API/AngularJS deployment platform. I also maintain the server instances and development VMs using a series of puppet scripts (puppet forge and home grown) and packer.

I’m a passionate open source advocate producing various modules to ease the use of Slim Framework, Zend Framework 2, as well as my own website/blog, making use of various open source tools, such as Michelf’s PHP Markdown Extra and GitHub for hosting. I blog on various PHP/JS related topics and present talks on various subjects at local user groups.

Go MAD Technology

Industrial Placement/Internship

During my placement year at university I started as a junior web developer working for Go MAD Thinking, working on iCheev. iCheev (yes that is how it’s spelt) is a website to help people plan and achieve their goals, through various tools. I quickly became the server administrator handling SVN, access control, testing and live servers as well as deployment.

I also introduced the trac bug tracking system which we’ve used to track the development process of new features as well tracking bugs from discovery to resolution.

Post Graduate

After graduating I went back to working for the same company as web developer/server administrator. I started working with more languages such as C#.NET and Ruby.

Jenkins CI

I also worked to integrate our provisional suite of unit tests into a more continuous solution by the introduction of Jenkins CI to routinely run our rapidly increasing suite of unit tests. I then progressed to using Jenkins CI to automate our deployment through the testing stages and finally to the production deploy.


As a frequent contributor to open source projects, most of them through github I introduced the company to git and championed the use of git as our vcs, finalising with a presentation on git, github and gitflow to the majority of the company upon which the decision was taken to move forward with git.


After discovering the wonders of puppet and vagrant (and how github use puppet to set up their local dev machines (I stole the name)) and how well they could be combined I started work on a project to enable our devs to spin up vagrant instances to use as dev servers. I also produced configurable puppet scripts that would reproduce our various development projects, with all server dependencies, with minimal fuss. This allowed rapid deployment of our projects to new nodes as needed. This also freed the devs and allowed them to use any combination of operating system and hardware they wished whilst still running their development on the vagrant boxes which would replicate a common environment. Extra vagrant boxes were generated to enable developers to replicate different environments from our ‘edge’ development server all the way to production, all on VMs on their local machine. This also lead to new technologies being implemented as puppet scripts allowing easy deployment amongst developers and then on servers, as the puppet scripts don’t need to run on a virtual. This also enabled writing puppet scripts to set up brand new or newly reinstalled machines with all the programs a dev needs.

Fusions PIM

Vagrant, Puppet and Packer

One of my first jobs when I started working at Fusions was to rebuild the dev vm the company was currently using. Due to time constraints and only being a small company they hadn’t had the oppertunity to keep the VM up to date nor to automate an installation with the various provisioning tools available. During the rebuilding of the VM I made the conscious decision to make the provisioning and future rebuild of the VM as automated as possible, I wanted to spend my time doing development not rebuilding virtual machine images. I’d already had experience of using Puppet and Vagrant at GMT and was able to expand on that significantly when building the fusions VM. I was able to keep the dependencies of the puppet scripts nicely serperated so that they can be reused in other environments. This led on to being able to use an expanded and more configurable set of scripts to set up the more advanced environments, so that our edge, staging, backup and production servers where all buildable using the same set of scripts. I also used the advantages of Packer to further automate the building of these VMs, meaning I’d literally have to run a single command to produce a new up to date virtual machine in any particular environment.


When I first joined Fusions all deployments were manual, consisting of sftp uploads and folder naming, chowning and chmoding of certains directories. This would not do. Until we found our ideal deployment service I built and maintainted a RoR/resqueue app that automated as much of this as possible.


We do out of hours support, with a single person being on call and getting OT pay based on day of week and shift, using current products would mean trying to tie 2 or 3 apps together and then using something like IFTTT to get the scheduler to change which phone was on duty. It was much simpler to write our own purpose built app to do all this. The result of which was soundwave (which we plan on open sourcing really really soon).


The account holder of our Digital Ocean account was for obvious reasons our boss. As I was dealing with most of the ops I needed someway of interacting with DO. Thankfully DO released their v2 API soon after I joined. I built as a front end client to that API to allow me to work with our droplets.


I’m frequent speaker at the local PHP user group, on a variety of subjects from building your own framework, to using puppet, packer and vagrant, as well as front end testing with behat.

Open Source Software


Most of my open source code can be viewed in my github account, these include a set of tools for generating API end points Slim API, modules for the Slim PHP framework, modules for ZF2, PHP Based CI Server, doing bug fixes and code for Slim & ZF2 itself, as well as working on my projects to try out the various other programming languages. A RoR app for doing deployments Prowl, v2. A kanban board written in Node.js Kaizen Kanban, using redis as a backend.


Subscribe via RSS

Testing the new JetPack Compose Pt2

A simple intro to testing basic Android interactions and updates using mockito in JetPack compose


Testing the new JetPack Compose

I had some trouble testing JetPack Compose with ViewModels and mockito, so thought I'd make this simple blog post to help anyone else stuck with it.


Securely inject API keys into your Android app during the build process

So you want to inject API keys in a reasonably secure way during the build process? Here's one simple way at least.


Testing a Retrofit/RxJava Android library using Mockito

There's lots of blog posts out there with great examples on how to do certain things in Kotlin/Android. What there seems to be a lack of, in general, is how to write tests, how to write tests for complex apps, or libraries.


AWS API Gateway part 2 - CORS 😱

After my last blog post we can start to make requests via axios to my API gateway. Hitting the gateway directly via postman or the browser worked fine, but with axios we were running into CORS issues. This is a super short blog detailing what we need to do to deal with these CORS issues. I’m not going to get into a big description about CORS because there’s a whole bunch of stuff about OPTIONS requests, origin headers and other boring stuff you can read elsewhere. We just want to know what to do to start making those axios requests right?


Using AWS to create a dynamodb driven API

In the previous post we created an Android app that displays some json data as a swipeable ViewPager, we stubbed the data for this app at the time. This time we’re going to be creating a dynamodb table driven API in AWS, cheap, simple and easy to maintain.


Implementing ViewPager2 in a basic Android app

This is 1st in a series of quick blog posts on implementing some features in an Android app. ViewPager allows us have a horizontal (and vertical) swiping component that populates from a series/list of various kinds, either Views, Fragements or data sources.


Using GitHub actions to deploy branch builds to a s3 bucket

My first blog post in FIVE YEARS 😮 This post is about using github actions to build static sites on branches and deploying them to S3.


Converting Rails Apps From Heroku To Docker

We recently had to move a rails app from heroku+postgres to our own servers, since heroku free is now enforcing nap times (but I don’t wanna nap!). We don’t want to have to manage the rails dependencies ourselves, as they can be a pita. Docker to the rescue!


A Howto on Converting SVN repos to Git

One of our major projects at GoMAD Tech is currently stored in SVN but is soon moving to git.


ZF2 Forms, Annotations and Composed Objects

How to combine multiple annotated entity derived forms into a single form.


ZF2 Custom Form Element

Quick walk through on creating a simple custom form element that just echos out the value.


Inversion of Control: Service Locator & Dependency Injection

Quick notes for dependency injection vs retrieving from service locator, this is mainly for zf2 but the basics apply elsewhere.


Factories an Invokables in ZF2

These are just some quick notes really, just for some future reference, mostly concerned with the differences as they pertain to invokables and factories in Zend/ServiceManager.


Zend Skeleton Application And G403Translator: Db Driven Translation

I recently had need to do some translations with ZF2, the current state of ZF2 means that you can only load translations from files so I decided to take this oppertunity to experiment with creating my own module for doing it.


Zend Skeleton Application and the ZFC User Module

So I’ve been playing a lot with zf2 recently and inspired by EvanDotPro’s post on getting things working using pure git, I thought I’d throw one up using composer+git.


Blog Introduction

###Don’t bother, this is from when I was running my own convoluted md->html parsing voodoo.


Readme Changes File

###Don’t bother, this is from when I was running my own convoluted md->html parsing voodoo.