BRUCE BLACKLAWS
30 years' of age
South African (ZA) citizen and passport
I'm currently in Cape Town

bruce@bruceblacklaws.com / +27 82 452 0571
		
I'm always open to new opportunities
Preferably remote or Southern Suburbs, Cape Town
		
Request Interview
SUMMARY
You can hire me for full stack web application development or GNU/Linux systems administration. Something in DevOps will be just fine.

I'm the founder of App Evolved. I created Task Complete, Code Jobs and The PHP Shop in my spare time. I have plenty other examples of my work I can show you during an interview.

The work/project descriptions below are only brief summaries. I can elaborate on the details and provide comprehensive information during an interview.
		
SKILLS
  • Linux Systems Administration
  • Web Application Development
  • Systems Automation
  • LAN/WAN design, implementation and management
  • Building Businesses
EXPERIENCE
DevOps Engineer
Ringier One Africa Media from August 2018 until Present (4 months) | Woodstock, Cape Town, ZA
  • DevOps
I'm working in enterprise DevOps and engaged in some really cool projects:
  • Writing Infrastructure as Code using AWS CloudFormation and Puppet/Hiera that deploys and supports the infrastructure for BrighterMonday, Cheki and Pigiame
  • Looking after Jenkins slave build nodes and ensuring they are always available for the developers and investigating failed builds and fixing bugs that caused instability
  • Improving shell scripts which are executed by Puppet and Vagrant. This prevented unnecessary errors and improved the virtual machine bootstrapping process
  • Deployment and configuration of new Jenkins slave build nodes. This includes the fresh installation of Ubuntu GNU/Linux with Puppet, on physical hardware at Hetzner, and the provisioning of build environments via Vagrant
  • Debugging reliability issues with the Vagrant build environments by disabling guest kernel APCI support, via the Vagrantfile configuration, and development of a simple shell script that kept the guests from entering sleep mode
  • Improving CI/CD pipelines implemented in Jenkins. Improvements removed redundant stages and implemented deployment logic correctly
  • Deployments of new AWS app environments using CloudFormation, Puppet and CodeDeploy. A new QA environment was deployed by duplicating the CloudFormation template for the staging environment
  • Developing a NodeJS app that would update a CloudFormation stack with the home users dynamic IP address. This prevented the manual work of changing security groups and ElasticSearch access policies. The app is hosted in AWS Lambda behind API Gateway
  • Deploying Supervisor for a .NET Core applications backend (running on EC2) which maintained the running state of the dotnet processes
I assist web developers with getting stuff done and I solve problems for them:
  • Assisting .NET Core developers with locating a memory leak by configuring kernel memory dumps and performing memory analysis while simulating legitimate web traffic on the app
  • Assisting web developers with accessing AWS resources from networks outside the VPC (demonistrating how useful SSH tunneling can be, configuring HTTP basic auth behind AWS ES proxy)
  • Assisting a web developer with debugging issues present in a Laravel app deployed in a multitenancy environment (fixing up the Apache mod_rewrite rules, editing Blade templates, uploading front end assets to S3, porting an inline closure to it's own controller)
I do great things for our DevOps team and I make processes more efficient for the team:
  • Performing routine code reviews and preventing erroneous code from being merged into the production branch for a variety of DevOps projects
  • Ensuring AWS environments are less error-prone by improving CloudFormation templates (enabling EC2 instance termination protection)
  • Configuring Puppet to manage Apache htaccess configuration through the htpasswd module found on Puppet Forge
  • Researching and suggesting more efficient deployment strategies than the blue-green strategy and presenting these suggestions during a few discussions
  • Improving Vagrant configurations (enabling vRDP) which enabled faster problem debugging and insight on any printed console errors
  • Fixed configuration bugs which were present in the Apache HTTPd configuration. A bug fix included rewriting an outgoing requests HTTP headers (using Apache mod_headers) to include the correct location header for an HTTP virtual host sitting behind CloudFlare (CloudFlare terminated the SSL)
  • Authoring technical documentation and useful tutorials for the team
  • Constantly being on the lookout to reduce the technical footprint for all the application backend stacks (replaced Supervisor with a while loop in the apps init script, pointed out directory versioning can be used instead of creating EC2 AMI images for each deployment)
I attempted to deflate the infighting between the teams by gathering information and listening without any biases:
  • Suggesting and documenting improvements to an applications backend infrastructure and presented this information during a group meeting (research around AWS ECS, Fargate and Docker)
I'm constantly looking for ways to improve the app backend infrastructure and reduce the running costs for all our apps. All improvements I make are in code.
Our enterprise applications are deployed into autoscaling AWS EC2 fleets with fairly complicated CI/CD pipelines. The backend scales horizontally on CPU utilization. Development follows the agile methodology. DevOps is involved in a weekly stand-up discussion with the other teams.
CEO and Founder
App Evolved from November 2017 until Present (1 year, 1 month) | Remote
  • Everything
I'm building every aspect of the business and technical product. App Evolved is something I'll always be working on. Failure is not an option.
Linux Systems Engineer
Aware Corporation from April 2015 until October 2017 (2 years, 7 months) | Claremont, Cape Town, ZA and Saraphi, Chiang Mai, TH
  • Linux Systems Administration
  • Server deployment and management
  • DevOps
I developed a collection of shell scripts that extended the functionality of Zabbix (added to Zabbix agentd configuration as a UserParamameter and configured as an External Check) and Nagios. These shell scripts extended the functionality in various ways:
  • Dynamically determining SNMP OIDs on Cisco and HP managed ethernet switches and using this data to provide reporting on switchport CRC errors
  • Dynamically determining VPN interfaces and and the corresponding connection states on Cisco ASA hardware firewalls via SNMP and returning information in JSON
  • Gathering DNS query statistics by parsing the BIND statistics output
I performed many other tasks and completed plenty projects:
  • Procured white box hardware for and deployed a complete oVirt virtualization environment. I configured multiple servers in this environment (name servers for the office with forwarding zones over the VPN to the HQ, internal Elastix PBX with SIP trunks to Fat Budgie). There was no reason to deploy this project in the cloud
  • Deployed phpIPAM and completely migrated all existing subnet details from an old IPAM system using import tools I found online. I also repaired a bug that was present in phpIPAM
  • Developed a monitoring dashboard rotator which logged into SmokePing, Zabbix and Nagios and presented the graphs on a wallboard display connected to a Raspberry Pi. The project was written in a little JavaScript and PHP. The Chrome Web Store had no support for the ARM port of Chromium so I took it upon myself to develop this tool
  • Developed a small shell script that renewed the SSL certificates for stand-alone Let's Encrypt customer configurations and reporting on the result
  • Patched multiple vulnerabilities (Heartbleed, POODLE, Dirty Cow) and mitigated the attack surface on internal and customer systems
  • Deployed new servers in accordance with required customer specification. Most servers were deployed in the VMware vSphere environment at the data center in Chiang Mai
  • Analysed a variety of customer data and provided an answer to project managers questions. The data came from the DeVineWare web application
  • Involved in multiple developer discussions and provided input regarding the deployment of various new projects (Openbravo ERP)
  • Changed the structure of the Nagios host monitoring to comply to a parent-child nested configuration (reduced unnecessary alerts)
  • Made a change to the internal development shell script that enabled deployments from Git (Subversion default)
I overhauled a new customers AWS stack and deployed extensive monitoring with CloudWatch and New Relic. I reviewed the existing CloudWatch/New Relic configuration and configured the alarms and alerting policies correctly. I also upgraded the customer's GNU/Linux and Windows systems in a way that prevented app interruption.

I routinely performed app deployments (checking out code from SVN and moving it to the production web servers) and reporting the deployment status to the project manager. I took it upon myself to develop a web frontend that would allow developers to deploy code themselves. The application was intergrated into Active Directory (LDAP) and had a simple permitted deployment access control system.

I configured performance monitoring on the Java Servlet Container instances (Tomcat) via JMX and Zabbix. This was used to diagnose performance issues with BI tools (Yellowfin). There was also a tight restriction on the solution (enabling JMX required production downtime) that I worked around.

Performed system upgrades early in the morning to take advantage of the difference in time zones.
			
Reasons for leaving:
Management disallowed useful customer automation, Wanted to turn my idea into a business, Low salary
Remote Linux Systems Administrator
35 East from April 2016 until June 2016 (3 months) | Remote
  • Web Application Development
I worked on a part-time basis and spent two hours an evening on the projects. I was hired by 35 East during my time at Aware Corporation however, I performed the work outside office hours.
			
The projects I worked on were:
  • A spreadsheet viewer/editor in a browser. I parsed the data from a spreadsheet and inserted it into the appropriate relational database schema I created. The web app allowed the user to edit the value in each cell
  • Gather customer task details, request his signature via HelloSign, generate a PDF document and send via email
  • Deployment of Redash and R&D around analysing/displaying internal data
Reasons for leaving:
Work overload (working three different jobs)
Systems Engineer
Indaba Mobile from June 2013 until February 2015 (1 year, 9 months) | Granger Bay, Cape Town, ZA
  • Linux Systems Administration
  • Server deployment and management
  • Network design and management
  • DevOps
I routinely deployed new customer stacks in Amazon Web Services (AWS). I built support for high user concurrency into each stack using horitontal scaling and load balancing techniques.
			
A typical customer stack included:
  • Multiple Ubuntu 14.04 LTS EC2 instances with the Java Runtime Environment (JRE) 1.6 and Apache Tomcat installed
  • 2 MySQL RDS instances
  • 1 Cassandra NoSQL database instance
  • Multiple application ELBs
  • 1 Apache HTTP server with PHP and the Zend Framework (ZF)
I handled the Java Web Application Archive (WAR) deployments and I facilitated the debugging process with the Java developers.
			
I built a collection of tools that made the gathering of stack details more efficient. The toolset I built included the following:
  • A collector shell script that logged into each stack, via SSH, and queried the database and returned statistics relating to the registered users
  • PHP scripts with intergrations into FoneWorx, SMSstation, Clickatell, MaxMind GeoIP2 that would return information relating to the account (remaining credits, account status)
  • PHP script that simulated the web browser (Snoopy) of a mobile device and fetched the contents of the app download pages and parsed the DOM looking for relevant download links
  • Shell script that collected information regarding concurrent user connections and load averages
  • PHP script that aggregates all this information and provides a detailed report via email every morning
I was tasked with gathering information from both local and international hosting providers with the goal of deploying stacks outside of AWS.

Managing an internal office PBX (Elastix) and a Gradle build system (which produced apps for BlackBerry and J2ME) was something I took care of too. I did troubleshoot issues with the BlackBerry and J2ME mobile app builds by making small changes to the source code (changing endpoints, manipulating assets).

I updated JIRA tickets and maintained an internal wiki. Writing multiple tutorials on building stacks and teaching backend developers the correct approach to troubleshoot various stack problems was something I was tasked with too.

I built the website and build uploader that was used on the customer BETA/QA websites and it allowed the mobile app developers to upload builds without my assistance.

Responded to events and outages after hours. Authored technical incident reports and provided them to business.

Deploying customer stacks between 2AM-3AM and additional weekend work was something I performed as well.
			
Reasons for leaving:
Great tech startup suffered awful culture change, Low salary
Show more
Systems Administrator
i-Soft Networks from October 2012 until May 2013 (8 months) | De Waterkant, Cape Town, ZA
  • Systems Administration
  • Field Support
I performed systems administration and customer field support. I configured monitoring of client network infrastructure using Nagios (NRPE, NCSA). I resolved issues on customer networks running OSPF.

Reconfigured existing customer networks more efficiently and deployed on-premises equipment that enabled remote access/monitoring.
			
Reasons for leaving:
Uninteresting technical work, Long driving distance to customers, Low salary
Junior Operations Engineer
Thought Express from May 2011 until June 2012 (1 year, 1 month) | De Waterkant, Cape Town, ZA
  • Operational support
I performed basic Linux sysadmin work and operational support. Travelling to a customer in Nairobi, Kenya to provide operational support was something I did within my first few weeks of employment.
			
I was responsible for maintaining 14 custom built servers at a colocation data centre and ensuring the servers were always operational. Other tasks relating to this were:
  • Installed and setup an IP KVM switch
  • Removed and replaced failed hard disks
  • Rewired cabling and noted PDU port assignments
Reasons for leaving:
Uninteresting technical work, very small access network with low-budget consumer grade hardware, Low salary
Junior Engineer
Liberty Health Holdings from August 2008 until April 2011 (2 years, 8 months) | Claremont, Cape Town, ZA
  • First line user and network support
  • Data center technician
I was responsible for monitoring the IP networks that expanded Africa and I performed 1st line network support when issues would arise and I assisted users with connectivity problems preventing access into the network. I was also responsible for monitoring the physical and virtual server infrastructure (VMware vSphere) spanned across the data centers in Cape Town, Johannesburg and Pretoria.
			
I extensively resolved a variety of other user related issues:
  • Connecting to and accessing the virtual desktop infrastructure (VMware View)
  • User account password resets and account creation (Active Directory)
  • Releasing falsely flagged email messages
  • Replying to and correctly assigning user support requests
I performed hardware maintenance (racking servers, replacing failed hard disks) in the data center and routinely installed updates on all the Windows Server 2003/2008 member servers.
			
Reasons for leaving:
Bureaucracy, Repeatedly forced to attend useless meetings, Low salary
PROJECTS
App Evolved - Business
I developed every aspect of the business myself.

Selling my apartment provided the initial capital I used to get the company off the ground.
			
I incorporated App Evolved as a limited liability company in two countries:
  • South Africa
  • United Kingdom
I ensured accounting was configured and that the company is tax compliant with the annual returns filed and I opened a business bank account. I work with accountants in both South Africa and the UK.

Attempting to secure additional angel funding multiple times failed and I’ve been running the company on a very tight budget.

I’ve spent 9-12 hours everyday, everyweek, everymonth working on the product. I built the product in a very cost effective manner and I’ve architected the app backend infrastructure in a very cost effective manner too.
			
Miscellaneous tasks:
  • Drafting and maintaining company documentation (both legal and internal documentation)
  • Managing the social media and writing blog posts
  • Designing and implementing both online and offline marketing campaigns and strategies
  • Domain registration
  • DNS zone creation and configuration
  • Working with a designer to create a great company logo
  • Acquiring and managing business partnerships
No products are launched (as of May 2018).
			
App Evolved - Technical
I built every aspect of the product myself.

The application includes its own support request system, billing and invoicing, automation toolset and instant messaging with a chatbot.

The application can process both online (via PayPal) and offline (via traditional EFT) payment mechanisms.

I built an internal referral ecosystem that will create free marketing. This runs in parallel with the other online marketing campaigns.

The cloud management console allows a variety of application stacks to be deployed. Application stacks include LAMP and MEAN. The customer can also sign an optional NDA and longer-term contract from within the cloud management console.

All outbound email is housed in a beautifully crafted template and the communication manager allows the user to select which correspondence he would like to receive.

App Evolved extends the functionality of CloudWatch. I've built an automation layer that attempts to rectify CloudWatch alarms/issues automatically and the automation layer can be extended easily.

Frontend
It’s custom code including some great frameworks like jQuery, jQuery UI, AlertifyJS, NProgress, Moment.js, Underscore.js. I have made some changes to jQuery UI and AlertifyJS to better suit my needs.

The code runs perfectly on Blink, WebKit, Gecko and EdgeHTML (Trident untested).

The homepage and assets are hosted on AWS CloudFront. The customer, communication and organization manager are hosted separately.

Backend
I built the RESTful API in PHP on AWS. 1 EC2 instance powers the API, the other EC2 instance powers the WebSocket server (I forked and extended nekudo/php-websocket). The relational database is MySQL RDS. The NoSQL document database is mLab MongoDB. The object store is AWS S3. SSL for the WebSocket server is powered by Let’s Encrypt.

I’ve integrated the app backend into BulkSMS, SendGrid, Papertrail, PayPal, Google Maps Geocoding API. I've integrated the app backend extensively into AWS CloudWatch, EC2, S3, RDS and ELB.
			
The backend consists of:
  • 2 Ubuntu 16.04 LTS EC2 instances with Apache 2.4.18 and PHP 7 (mod_php)
  • 1 HTTPS application load balancer
  • 1 MySQL database
  • 1 MongoDB database
  • 3 S3 buckets
General
The frontend is configured to connect to the HTTPS application load balancer which passes the connection to the API. The API is only accessible from the load balancer and uses a non-routable IP address.

The frontend makes asynchronous calls to the backend via the XMLHttpRequest (XHR) API and uses JSON as the data interchange format.

I’ve used the Ubuntu packaged drivers for the services the app backend makes use of (instead of shipping the drivers with Composer).
			
You are welcome to view the product designs in Zeplin.
A microservice that returns a country's geographical location information.

I developed Get Country Data because I wanted to reduce the amount of costly calls my apps were making to the Google Geocoding/Places API and I wanted to know additional information like currency names, currency acronyms, currency symbols (HTML entities), international telephone calling codes.

The data came out of multiple other projects I was working on. The data is not read from any external source or a local database but rather it's kept in-memory. The code base contains 42 472 lines of code.

Get Country Data is running in Google App Engine on PHP 5.5.
			
The PHP Shop is a subsidiary of App Evolved and provides PHP, AWS and DevOps consulting. The consultations occur instantly in a chat application.

The chat application includes a natural language chatbot and establishes a WebSocket connection into the backend.

Frontend
It's custom code.

Backend
Apache mod_proxy passes the secure WebSocket connection a PHP WebSocket server run by the PHP CLI. I did some extensive work around nekudo/php-websocket.
			
A board that aggregates jobs found on StackOverflow, GitHub and We Work Remotely.

Frontend
It's custom code including Moment.js, js-cookie, AlertifyJS and the Facebook JavaScript SDK.

Backend
I built the RESTful API in PHP on Linode. I built the Code Jobs Proxy in PHP on App Engine. The backend worker is written in PHP and connects to the Code Jobs Proxy and parses job data.
			
A single page web application for people and startups wanting to get freelance tasks complete. The app flips conventional freelancing websites upside down by giving the customer the ability to define the amount of hours the task must be completed in.

Frontend
It's custom code including the implementation of SimpleMDE and PayPal Express Checkout.

Backend
I built the RESTful API in PHP on Linode.
			
The dating app that does not store any of your messages and your profile is automatically deleted when you stop using the app. You can also can earn money by completing surveys.

The application is location aware. It determines the users location via the connections IP address and/or if geolocation is supported on the frontend.

Frontend
It’s custom code including some great libraries like emojify.js, jQuery resizeEnd, WebcamJS v1.0.6.

I implemented Google Invisible reCAPTCHA, Google Maps JavaScript API.

Backend
I built the RESTful API in PHP on Heroku.

Integrations into Papertrail, Mailgun, Google Maps Geocoding, Google Vision, Google Translate and Google Cloud Storage APIs, AWS S3, currencylayer API.
			
The backend consists of:
  • 1 Hobby Dyno (heroku-php-apache2)
  • 1 MySQL database
  • 1 Memcached instance
The app backend is able to detect if a users profile picture contains nudity.

The app backend is integrated into Motion AI which the backend worker uses to act like a legitimate user on the app. The app can also translate messages to/from the users native language.
			
Find the best remote working spaces in every city in the world. If you travel and work remotely, signup and add your opinion.

Frontend
It's custom code including some great frameworks like jQuery UI and jQuery Mobile.

Backend
Integrations into AWS S3 and Google Places.
			
The backend consists of:
  • 1 Hobby Dyno (heroku-php-apache2)
  • 1 MySQL database
WEB APPLICATION DEVELOPMENT
I would like to take my career into the web application development industry. I have around one year experience with full stack web application development.

I have a good understanding of how RESTful APIs and JSON work. I have a good understanding of how relational databases like MySQL work.

I've developed and implemented app backends that use Memcached and I've developed and implemented app backends that use MongoDB.

I built my app backends on Amazon Web Services (AWS), Google Cloud Platform (GCP), Linode, Digital Ocean and Heroku. When I’m using IaaS, I also do the sysadmin work to keep the servers up and running.

I have experience with object-orientated programming and I understand it's principals.

My predominantly used and favourite stack is LAMP (Linux, Apache, MySQL and PHP).

Frontend
I'm familiar with JavaScript, CSS3 and HTML/HTML5.

Backend
I've built all my app backends in PHP (5.3, 5.4, 7). I've written mostly procedural code using the front controller design pattern on my personal projects.

I'm familiar with Node.js (6.10).

Frameworks
Laravel 5.6 on the backend. jQuery, jQuery UI, jQuery Mobile on the frontend.

Revision control
I’m familiar with Git and Subversion.

Miscellaneous
I'm familiar with regular expressions. I have an understanding of how CORS works and the best approach to implement it. I understand how the model-view-controller (MVC) design pattern works.

I have participated in daily scrum meetings however, I am completely happy working without any structured environment (prefer working for a fast-paced startup than a slow moving corporation and I'm very self-sufficient).
                
LINUX SYSTEMS ADMINISTRATION
Over six years GNU/Linux systems administration experience. This is the base of my career.
  • Favorite distribution is Gentoo (vanilla kernel with Xorg and XFCE)
  • Good understanding of how BASH works
  • Automating routine sysadmin tasks
I have experience with Puppet and managing large scale server deployments globally (servers > 150) and I have experience with monitoring using New Relic (APM, Infrastructure), Zabbix and Nagios.

I've deployed high availability GNU/Linux server infrastructure capable of scaling the hosted application to thousands of concurrent users.

I fit well into the DevOps space. I do the routine sysadmin tasks as well as building an automation layer/toolset that will perform these routine tasks automatically and keep track of results. I write infrastructure as code and I debug massive existing application backends.

I have experience building software from source and managing software using the package management systems present on Red Hat and Debian based systems.
		
I have vast experience architecting solutions to problems. Some of my implemented solutions include:
  • MySQL backup strategy that implements master-slave database replication to prevent master table locking
  • Filesystem backup shell scripts that implement archiving and compression
  • Effectively parsing application logs in search of application exceptions, reporting on the findings
  • Dynamically creating Zabbix macros using BASH and SNMP
  • Deployment of multiple geographically distributed authoritative BIND name servers and the deployment, configuration of NicTool
I have experience with managing the following hardware:
  • HP ProLiant DL Servers
  • Dell System X Servers
LAN/WAN DESIGN, IMPLEMENTATION AND MANAGEMENT
  • IPv4, branch networks
  • Cisco routers (800 and 1600 Series)
  • HP ProCurve managed ethernet switches
I’ve built and managed small networks running RIPv2 and OSPF areas, architected backend virtual network infrastructure in AWS and maintained multiple office access networks.

I have a good understanding of how IPv4 subnetting works and how to effectively segment IP networks. I have experience deploying both hardware and software (pfSense, iptables) firewalls and maintaining access control lists.

I’ve provided first-line technical support on big networks expanding Africa (T1/serial leased lines) and facilitated the line fault resolution process with various telcos.
                
EDUCATION
Fish Hoek High School (2006)
My favorite subjects were computer science and history. I participated in extracurricular computer science classes which taught programming with Java.
New Horizons College, Torque IT (2007)
I completed and passed multiple Prometric and Pearson VUE examinations.
  • EC-Council Certified Ethical Hacker (CEH)
  • Cisco Certified Entry Networking Technician (CCENT)
  • Microsoft Certified Systems Administrator (Windows Server 2003)
Seminars and Soft Skills
  • Dale Carnegie Course - Effective Communication and Human Relations (2012, 7 weeks)
  • AWS Summit Cape Town (2017, 1 day)
  • DevOpsDays Cape Town (2018, 2 days)
Self-taught
I learn by doing, by building, by experimenting and by taking risks. If I don't understand something, I take the time to figure it out and I never give up. Ever.
LANGUAGES
  • English (Native)
  • Thai (Elementary proficiency)
MISCELLANEOUS
Transport
I have my own car and valid code B driving license.
Own hardware
I have my own hardware (Macbook Pro mid-2017) and reliable internet connection.