Phil Rau

This site is still in progress and subject to updates.

I’m Phil Rau, and among other things I’m a techie. I try to find technical solutions to problems, and get information out to people, including this site. I developed this site to describe in detail my professional and personal experiences, list accomplishments, and interests. I hope that this will give a better understanding of me as a whole.

I’m a graduate of North Carolina State University, class of 2003, with Bachelors of Science in Electrical Engineering and Computer Engineering. Since then I’ve worked in a number of programming jobs, from web applications to full-fledged programs, across numerous languages and operating systems, though Linux is what I prefer and use frequently.

Since 2006 I’ve worked at Cisco Systems, Inc. primarily as a programmer. I have since branched out into sysadmin work – managing the hosting environment and support software – as well as devops and database management.

I’m a big fan of automation and integration between differing systems. I enjoy designing workflows that pull together and offer various operations across systems depending on the user’s needs.

I do programming, devops, sysadmin, etc. as a career and as a hobby, maintaining a homelab system at home. Some of my hobbies that aren’t tech related are astronomy, homesteading, DIY/crafting, camping & hiking.

I am an Eagle Scout, having earned that rank in September of 1995. I’ve been a part of the Scouting program since 1987, with some breaks due to college, family, etc. After aging out I continued as an adult leader, continuing my growth and contributing to the growth of others. Most of my hobbies and interests have their root in my experiences with Scouting, as well as the desire to continue learning.

I do all of my development on Linux systems, primarily as my daily driver, though I have also done so through SSH sessions. I'm comfortable operating within a terminal, as well as using Vim, which is my primary development environment. Through plugins installed using Vundle, I've built up a development environment that allows me to edit multiple files, run syntax checking as I make modifications, as well as see and navigate through uncommitted changes. When developing and testing, I typically set up Docker containers for databases and other dependencies, though I do sometimes install them through the system package manager.

Generally, once I get a good feel for code, I can navigate portions of it mentally, seeing workflows in the code that lead to desired functionality or defects to be fixed. This is helpful with debugging as I'm often able to quickly track down the series of events that lead to an issue, lay it out to others, and effect a fix.

For a bit over the past decade I have been working on Ruby on Rails projects - both professionally and for some personal projects. I find it easy to spin up a new project, and the extra functionality provided by the library of gems allow me to implement whatever features I need. Some components used in these projects are:

  • Javascript/Coffeescript
  • jQuery
  • React
  • Bootstrap, with some customizations made to the stylesheets
  • HAML

Some noteworthy accomplishments from my time working on Ruby on Rails:

  • Created and maintained an internal tooling set that included:
    • Case Management with approvals, state tracking, notifications
    • Software License distribution and tracking
    • Access controls to other systems
    • Designed workflows to integrate with external systems and automate processes
  • Utilized Oracle (later migrated to PostgreSQL), with external MySQL and Oracle databases.
  • Performed upgrades on software to keep up with language changes (Ruby, Rails, Rubocop).
  • Incorporated SQL & Arel knowledge into building complex queries and workflows.
  • Created and maintained Rspec testing suite, utilizing SQLite to mimic external databases when necessary.
  • Set up and maintained hardware and software stacks for applications (expanded upon in DevOps and Sysadmin sections), as well as documenting the setup.
  • Led effort to migrate from Oracle to PostgreSQL in 3-week timeframe.
  • Further expanded on migration by utilizing datatypes offered by PostgreSQL (JSONB, arrays, etc).

Previously, I had worked on PHP projects, though none using an MVC pattern. They had all been procedural, and custom built from the ground up - including Javascript and CSS. Some items I worked on include:

  • Maintained an existing set of internal tools for resource management.
  • Integrated with other external systems (SNMP, REST, etc) to simplify device configuration and workflows.
  • Created and maintained an application to keep track of contacts for various allocated spaces.
  • Created and maintained a frontend for provisioning and management of VMware virtual machines.

As part of my current role I have taken on DevOps tasks, building up our coding infrastructure to modern standards. I created Docker images of our code and infrastructure for feature testing, which ultimately led to using Kubernetes to deploy them to testing and production environments. Prior to this we had been using Apache with Passenger, a setup I helped create and maintain until we switched architectures. On other projects I had helped maintain a standard Apache installation.

  • Created Isolation environment workflow for testing changes before merging
  • Dockerized application for Isolation testing
  • Migrated to Kubernetes, utilizing Docker builds
  • Integrated deployments into GitLab
  • Designed and maintained CI scripts to automate workflows
    • Creation, publishing, and destruction of Docker images as needed
    • Deployments to Kubernetes
    • Isolation environment deployments and teardowns
    • Database user/schema creation and deletion

I have taken on a sysadmin role for my team, setting up and managing Linux servers to run our applications I also host and maintain support applications for development and testing. When something goes wrong, I can connect to the system and review logs to determine the cause, repair the problem, and communicate the details with my team.

  • Set up and maintained Apache & Passenger to host RoR application.
  • Set up Kubernetes infrastructure, with multiple nodes and redundant control planes, to manage our application environment. This replaced the previous Apache/Passenger setup.
  • Migrated from installed to containerized Redis inside Kubernetes architecture.
  • Set up and maintained self-hosted third-party software for application maintenance and reporting.
    • GitLab
    • Sentry
    • Nagios/Zabbix
  • Helped maintain the LAMP stack for PHP projects.
  • Defined characteristics for satellite systems used to run remote code.

I've used a few relational databases over the years. In recent years I've primarily used PostgreSQL and Oracle, including a migration from the latter to the former. Interation with the databases involved either using ActiveRecord models in Rails, designing more complex operations using Arel, or executing plain SQL statements against the database. I've managed views, materialized views, and functions/procedures to manage data, from local and remote sources, directly in the database for use by others.

I've used Redis mostly as a dependency for Sidekiq, though I've developed a couple small features that use it (using the ohm gem).

I've also used MySQL in a PHP environment. This involved writing SQL statements that were run directly against the database to query data, or perform update operations.

Accomplishments:

  • Migrated data from Oracle to PostgreSQL.
  • Once migrated to PostgreSQL, started utilizing native datatypes.
    • Migrated sparse model attributes from its own table (one entry per attribute) to JSONB field on main table.
    • Search queries including main & sparse attributes were significantly faster post-migration.
    • Utilized JSONB fields to store denormalized attributes, such as user information.
    • Migrated common lookups on seldom-changed data from queries to materialized views.
  • Configured weeky point-in-time-recovery backups on remote storage, with occasional testing to ensure validity.
  • Set up SQLite schemas for Rspec testing with models whose data is normally stored externally.

Much of the work I've done professionally I also enjoy personally. I have a homelab set up where my goal is to manage it similarly to a professional environment. I run a series of VMs and LXC containers in a Proxmox cluster, with an NFS server set up for mass storage. Some systems I use provide LDAP, DNS, Postfix, and Syslog. I have a few self-hosted sites I maintain (including this one) as well as other software like GitLab and Haproxy. I have a database server that primarily runs PostgreSQL, but also has MySQL and Redis for applications that require them. Much of the common setup utilizes Puppet for management. This helps me keep my skills fresh, as well as provide services for my family.

Some personal development projects I've worked on:

  • This site (plain HTML content with CSS).
  • Edge Of Nowhere - astronomy site featuring media I've taken (Ruby on Rails with React components).
  • Planting Calendar - calculate/alert when to plant/transplant seeds and plants (work-in-progress, Ruby on Rails with React components).
  • Python package for communicating with a GOTO telescope mount.
  • Python script using above package, integrated with a Wiimote controller to move telescope and switch modes.