Migrate to next.js
This builds and works and cleans up a few things. We're also migrating to material ui - but not very deeply yet. No clue what we're going to do with the talks and blog posts yet. The real question is - do I care about those at this point? I think I'd like to use this as a playground a bit, make some of the CSS style sections into components. Maybe make all of this a bit more dynamic or something. But for now, this gets me a something. Change-Id: I455bb3fbf9d7473e8f7bcf639b2254ffe0917a32
This commit is contained in:
parent
51a94f25dd
commit
c9344ec266
6
.eslintrc.json
Normal file
6
.eslintrc.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "next/core-web-vitals",
|
||||
"rules": {
|
||||
"react/no-unescaped-entities": "off"
|
||||
}
|
||||
}
|
53
.gitignore
vendored
53
.gitignore
vendored
@ -1,33 +1,36 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
.yarn/install-state.gz
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
# production
|
||||
/build
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# IDE things
|
||||
.idea
|
||||
*.iml
|
||||
dist
|
||||
.publish
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
5
.prettierrc
Normal file
5
.prettierrc
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"trailingComma": "es5",
|
||||
"semi": false,
|
||||
"singleQuote": true
|
||||
}
|
19
.zuul.yaml
19
.zuul.yaml
@ -18,16 +18,9 @@
|
||||
parent: build-javascript-deployment
|
||||
success-url: "http://site.{build.uuid}.{tenant.name}.zuul-preview.opendev.org/"
|
||||
vars:
|
||||
js_build_command: package
|
||||
javascript_content_dir: dist
|
||||
|
||||
- job:
|
||||
name: inaugust-publish-website
|
||||
parent: build-javascript-deployment
|
||||
vars:
|
||||
js_build_command: package
|
||||
javascript_content_dir: dist
|
||||
post-run: playbooks/publish.yaml
|
||||
node_version: 18
|
||||
js_build_command: build
|
||||
javascript_content_dir: out
|
||||
|
||||
- job:
|
||||
name: inaugust-publish-javascript-to-netlify
|
||||
@ -85,8 +78,9 @@
|
||||
parent: inaugust-publish-javascript-to-netlify
|
||||
vars:
|
||||
netlify_site_id: 61580c77-b0fe-42c7-acec-c92d4cd1729c
|
||||
javascript_content_dir: dist
|
||||
js_build_command: package
|
||||
node_version: 18
|
||||
js_build_command: build
|
||||
javascript_content_dir: out
|
||||
secrets:
|
||||
- secret: inaugust-netlify-auth
|
||||
name: netlify_auth
|
||||
@ -101,5 +95,4 @@
|
||||
- inaugust-build-website
|
||||
post:
|
||||
jobs:
|
||||
- inaugust-publish-website
|
||||
- inaugust-publish-netlify
|
||||
|
@ -4,6 +4,8 @@ My website, blog posts and conference talks
|
||||
If you're interested in my presentations, you can go look at them here:
|
||||
http://inaugust.com/talks
|
||||
|
||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
||||
|
||||
Building
|
||||
--------
|
||||
|
||||
@ -17,9 +19,9 @@ The following commands will get you started:
|
||||
|
||||
# This will create a local webhost, serving all of your presentations.
|
||||
# It will autodetect changes and refresh any applicable pages.
|
||||
yarn start
|
||||
yarn dev
|
||||
|
||||
# This will build the content in the ``dist`` directory
|
||||
yarn run package
|
||||
# This will build the content in the ``out`` directory
|
||||
yarn build
|
||||
|
||||
.. _yarn: https://yarnpkg.com/en/docs/install
|
||||
|
397
gulpfile.js
397
gulpfile.js
@ -1,397 +0,0 @@
|
||||
(function initializeGulp () {
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var cheerio = require('cheerio');
|
||||
var rimraf = require('rimraf');
|
||||
|
||||
var gulp = require('gulp');
|
||||
var git = require('gulp-git');
|
||||
var filter = require('gulp-filter');
|
||||
var less = require('gulp-less');
|
||||
var data = require('gulp-data');
|
||||
var change = require('gulp-change');
|
||||
var webserver = require('gulp-webserver');
|
||||
var streamqueue = require('streamqueue');
|
||||
var ignore = require('gulp-ignore');
|
||||
var prompt = require('gulp-prompt');
|
||||
var handlebars = require('gulp-compile-handlebars');
|
||||
var rename = require('gulp-rename');
|
||||
|
||||
var dir = {
|
||||
'dist': './dist',
|
||||
'src': './src'
|
||||
};
|
||||
|
||||
// List of file paths.
|
||||
var paths = {
|
||||
'html': dir.src + '/**/*.html',
|
||||
'index': dir.src + '/index.hbs',
|
||||
'css': dir.src + '/css/**/*.css',
|
||||
'js': dir.src + '/js/**/*.js',
|
||||
'keybase': dir.src + '/keybase.txt',
|
||||
'talks': dir.src + '/talks',
|
||||
'talkindex': dir.src + '/talks/index.hbs',
|
||||
'posts': dir.src + '/posts',
|
||||
'images': [
|
||||
dir.src + '/**/*.png',
|
||||
dir.src + '/**/*.gif',
|
||||
dir.src + '/**/*.jpg',
|
||||
dir.src + '/**/*.jpeg',
|
||||
dir.src + '/**/*.svg'
|
||||
]
|
||||
};
|
||||
|
||||
// The current package.json file.
|
||||
var packageJson = require('./package.json');
|
||||
|
||||
/**
|
||||
* The handlebars configuration object.
|
||||
*/
|
||||
var handlebarsConfig = {
|
||||
helpers: {
|
||||
'datetime': function (object) {
|
||||
return object.toLocaleDateString();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* This method parses through discovered presentations, reads their
|
||||
* html metadata, and returns an array of that metadata.
|
||||
*/
|
||||
function buildPresentationManifest () {
|
||||
var presentations = [];
|
||||
var files = fs.readdirSync(paths.talks);
|
||||
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var file = paths.talks + '/' + files[i];
|
||||
try {
|
||||
var stat = fs.statSync(file);
|
||||
var $ = cheerio.load(fs.readFileSync(file));
|
||||
presentations.push({
|
||||
'title': $("head title").text(),
|
||||
'description': $("head meta[name='description']").attr('content'),
|
||||
'mtime': stat.mtime,
|
||||
'path': 'talks/' + files[i].replace('.hbs', '.html')
|
||||
});
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
presentations.sort(function (a, b) {
|
||||
return a.mtime >= b.mtime ? 1 : -1;
|
||||
});
|
||||
return presentations;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method parses through discovered posts, reads their
|
||||
* html metadata, and returns an array of that metadata.
|
||||
*/
|
||||
function buildPostManifest () {
|
||||
var posts = [];
|
||||
var files = fs.readdirSync(paths.posts);
|
||||
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
var file = paths.posts + '/' + files[i];
|
||||
try {
|
||||
var stat = fs.statSync(file);
|
||||
var $ = cheerio.load(fs.readFileSync(file));
|
||||
posts.push({
|
||||
'title': $("head title").text(),
|
||||
'description': $("head meta[name='description']").attr('content'),
|
||||
'mtime': stat.mtime,
|
||||
'path': 'posts/' + files[i].replace('.hbs', '.html')
|
||||
});
|
||||
} catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
posts.sort(function (a, b) {
|
||||
return a.mtime >= b.mtime ? 1 : -1;
|
||||
});
|
||||
return posts;
|
||||
}
|
||||
|
||||
function performTemplateChange(content) {
|
||||
var file = dir.src + '/layout/post.hbs';
|
||||
var stat = fs.statSync(file);
|
||||
return fs.readFileSync(file, {'encoding': 'utf-8'});
|
||||
}
|
||||
|
||||
function performTalkTemplateChange(content) {
|
||||
var file = dir.src + '/layout/talk.hbs';
|
||||
var stat = fs.statSync(file);
|
||||
return fs.readFileSync(file, {'encoding': 'utf-8'});
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean the output directory.
|
||||
*
|
||||
* @param {Function} cb callback.
|
||||
* @return {*} A gulp stream that performs this action.
|
||||
*/
|
||||
gulp.task('clean', function (cb) {
|
||||
rimraf(dir.dist, cb);
|
||||
});
|
||||
|
||||
/**
|
||||
* Build the static file structure from our dependencies.
|
||||
*/
|
||||
gulp.task('package:libs', function (cb) {
|
||||
|
||||
var resolveBootstrap = gulp.src(
|
||||
'./node_modules/bootstrap/dist/css/bootstrap.css')
|
||||
.pipe(gulp.dest(dir.dist + '/css'));
|
||||
|
||||
var resolveCSS = gulp.src(
|
||||
'./node_modules/@fortawesome/fontawesome-free/css/*')
|
||||
.pipe(filter('*.css'))
|
||||
.pipe(gulp.dest(dir.dist + '/css'));
|
||||
|
||||
var resolveFonts = gulp.src(
|
||||
'./node_modules/@fortawesome/fontawesome-free/webfonts/*')
|
||||
.pipe(filter(['*.otf', '*.eot', '*.svg', '*.ttf', '*.woff', '*.woff2']))
|
||||
.pipe(gulp.dest(dir.dist + '/fonts'));
|
||||
|
||||
// Reveal.js is a special snowflake.
|
||||
var resolveReveal = gulp.src('./node_modules/reveal.js/*/**/*.*',
|
||||
{'base': './node_modules/reveal.js/'})
|
||||
.pipe(ignore(['**/test/**', '*.js']))
|
||||
.pipe(filter([
|
||||
'**/*.js',
|
||||
'**/*.css',
|
||||
'**/*.eot',
|
||||
'**/*.ttf',
|
||||
'**/*.woff'
|
||||
]))
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
|
||||
streamqueue({'objectMode': true},
|
||||
resolveBootstrap,
|
||||
resolveCSS,
|
||||
resolveReveal,
|
||||
resolveFonts);
|
||||
cb()
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* Package all images.
|
||||
*/
|
||||
gulp.task('package:images', function () {
|
||||
return gulp.src(paths.images, {'base': dir.src})
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Package keybase static files.
|
||||
*/
|
||||
gulp.task('package:keybase', function () {
|
||||
return gulp.src(paths.keybase, {'base': dir.src})
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Package all css.
|
||||
*/
|
||||
gulp.task('package:css', function () {
|
||||
return gulp.src(paths.css, {'base': dir.src})
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Package all js.
|
||||
*/
|
||||
gulp.task('package:js', function () {
|
||||
return gulp.src(paths.js, {'base': dir.src})
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Package the handlebars files.
|
||||
*/
|
||||
gulp.task('package:talkindex', function () {
|
||||
|
||||
var templateData = {
|
||||
'presentations': buildPresentationManifest(),
|
||||
'author': packageJson.author
|
||||
};
|
||||
|
||||
// Automatically build the site list.
|
||||
return gulp.src(dir.src + '/talks.hbs', {'base': dir.src})
|
||||
.pipe(handlebars(templateData, handlebarsConfig))
|
||||
.pipe(rename(function (path) {
|
||||
path.extname = ".html";
|
||||
}))
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Package the handlebars files.
|
||||
*/
|
||||
gulp.task('package:postindex', function () {
|
||||
|
||||
var templateData = {
|
||||
'posts': buildPostManifest(),
|
||||
'author': packageJson.author
|
||||
};
|
||||
|
||||
// Automatically build the site list.
|
||||
return gulp.src(dir.src + '/index.hbs', {'base': dir.src})
|
||||
.pipe(handlebars(templateData, handlebarsConfig))
|
||||
.pipe(rename(function (path) {
|
||||
path.extname = ".html";
|
||||
}))
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
gulp.task('package:posts', function () {
|
||||
|
||||
var templateData = {
|
||||
'author': packageJson.author
|
||||
};
|
||||
|
||||
// Automatically build the site list.
|
||||
return gulp.src(dir.src + '/posts/*.hbs', {'base': dir.src})
|
||||
.pipe(data(function(file) {
|
||||
var stat = fs.statSync(file.path);
|
||||
var $ = cheerio.load(fs.readFileSync(file.path));
|
||||
return {
|
||||
'title': $("head title").text(),
|
||||
'description': $("head meta[name='description']").attr('content'),
|
||||
'body': $("body").html(),
|
||||
}}))
|
||||
.pipe(change(performTemplateChange))
|
||||
.pipe(handlebars(templateData, handlebarsConfig))
|
||||
.pipe(rename(function (path) {
|
||||
path.extname = ".html";
|
||||
}))
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
|
||||
gulp.task('package:talks', function () {
|
||||
|
||||
var templateData = {
|
||||
'author': packageJson.author
|
||||
};
|
||||
|
||||
// Automatically build the site list.
|
||||
return gulp.src(dir.src + '/talks/*.hbs', {'base': dir.src})
|
||||
.pipe(data(function(file) {
|
||||
var stat = fs.statSync(file.path);
|
||||
var $ = cheerio.load(fs.readFileSync(file.path));
|
||||
var newpath = file.clone();
|
||||
return {
|
||||
'title': $("head title").text(),
|
||||
'description': $("head meta[name='description']").attr('content'),
|
||||
'body': $("body").html(),
|
||||
'path': newpath.relative.replace('.hbs', '.html'),
|
||||
}}))
|
||||
.pipe(change(performTalkTemplateChange))
|
||||
.pipe(handlebars(templateData, handlebarsConfig))
|
||||
.pipe(rename(function (path) {
|
||||
path.extname = ".html";
|
||||
}))
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* Copy the HTML files into the dist folder.
|
||||
*/
|
||||
gulp.task('package:html', function () {
|
||||
return gulp.src(paths.html, {'base': dir.src})
|
||||
.pipe(gulp.dest(dir.dist));
|
||||
});
|
||||
|
||||
/**
|
||||
* This task builds a new presentation from the base presentation template.
|
||||
*/
|
||||
gulp.task('new', function () {
|
||||
var templateData = {
|
||||
author: packageJson.author
|
||||
};
|
||||
var destinationFolder = '';
|
||||
return gulp.src(dir.src + '/template/index.hbs')
|
||||
.pipe(prompt.prompt([
|
||||
{
|
||||
type: 'input',
|
||||
name: 'folderName',
|
||||
message: 'Presentation Folder Name (/^[a-z][a-z_]+$/):',
|
||||
validate: function (value) {
|
||||
var result = value.match(/^([a-z][a-z_]+)$/);
|
||||
return result !== null;
|
||||
}
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'title',
|
||||
message: 'Presentation Title:'
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'description',
|
||||
message: 'Presentation Description:'
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'event',
|
||||
message: 'First presented at:'
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'event',
|
||||
message: 'First presented on (date):'
|
||||
}],
|
||||
function (res) {
|
||||
destinationFolder = res.folderName;
|
||||
templateData.presentation = {
|
||||
'title': res.title,
|
||||
'description': res.description,
|
||||
'event': res.event
|
||||
}
|
||||
}))
|
||||
.pipe(handlebars(templateData, handlebarsConfig))
|
||||
.pipe(rename(function (path) {
|
||||
path.dirname += '/' + destinationFolder;
|
||||
path.basename = "index";
|
||||
path.extname = ".html";
|
||||
}))
|
||||
.pipe(gulp.dest(dir.src))
|
||||
.pipe(git.add());
|
||||
});
|
||||
|
||||
/**
|
||||
* Package the entire site into the dist folder.
|
||||
*/
|
||||
gulp.task('package', gulp.series('package:html',
|
||||
'package:talks', 'package:talkindex',
|
||||
'package:posts', 'package:postindex',
|
||||
'package:libs', 'package:keybase',
|
||||
'package:images', 'package:css', 'package:js'));
|
||||
|
||||
/**
|
||||
* Start a local server and serve the application code. This is
|
||||
* equivalent to opening index.html in a browser.
|
||||
*
|
||||
* @return {*} A gulp stream that performs this action.
|
||||
*/
|
||||
gulp.task('serve', function () {
|
||||
gulp.watch(paths.html, gulp.series('package:html'));
|
||||
gulp.watch(paths.images, gulp.series('package:images'));
|
||||
gulp.watch(paths.talks, gulp.series('package:talks'));
|
||||
gulp.watch(dir.src + '/talks/*.hbs', gulp.series('package:talks'));
|
||||
gulp.watch(paths.css, gulp.series('package:css'));
|
||||
gulp.watch(paths.js, gulp.series('package:js'));
|
||||
gulp.watch(paths.posts, gulp.series('package:posts'));
|
||||
gulp.watch(paths.index, gulp.series('package:posts'));
|
||||
|
||||
return gulp.src(dir.dist)
|
||||
.pipe(webserver({
|
||||
'livereload': true,
|
||||
'open': true
|
||||
}));
|
||||
});
|
||||
})();
|
7
jsconfig.json
Normal file
7
jsconfig.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
}
|
||||
}
|
6
next.config.mjs
Normal file
6
next.config.mjs
Normal file
@ -0,0 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
output: 'export',
|
||||
};
|
||||
|
||||
export default nextConfig;
|
51
package.json
51
package.json
@ -1,14 +1,13 @@
|
||||
{
|
||||
"name": "presentations",
|
||||
"version": "1.0.0",
|
||||
"description": "My convention presentations.",
|
||||
"main": "index.html",
|
||||
"name": "inaugust.com",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "gulp serve",
|
||||
"prestart": "gulp package",
|
||||
"new": "gulp new",
|
||||
"package": "gulp package"
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"format": "prettier --write 'src/**/*'",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"author": {
|
||||
"name": "Monty Taylor",
|
||||
@ -16,32 +15,20 @@
|
||||
"url": "http://inaugust.com"
|
||||
},
|
||||
"license": "CC-BY 4.0",
|
||||
"repository": "https://opendev.org/inaugust/inaugust.com",
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "^5.2.0",
|
||||
"bootstrap": "^3.3.5",
|
||||
"font-mfizz": "^2.4.1",
|
||||
"modernizr": "^3.6.0",
|
||||
"reveal.js": "^3.7.0"
|
||||
"@emotion/react": "^11.11.3",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@fontsource/roboto": "^5.0.8",
|
||||
"@mui/icons-material": "^5.15.6",
|
||||
"@mui/material": "^5.15.6",
|
||||
"next": "14.1.0",
|
||||
"react": "^18",
|
||||
"react-dom": "^18"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cheerio": "^0.19.0",
|
||||
"gulp": "^4.0.0",
|
||||
"gulp-change": "^1.0.0",
|
||||
"gulp-compile-handlebars": "0.6.1",
|
||||
"gulp-data": "^1.2.0",
|
||||
"gulp-filter": "^3.0.0",
|
||||
"gulp-git": "^2.8.0",
|
||||
"gulp-ignore": "^1.2.1",
|
||||
"gulp-less": "^3.0.3",
|
||||
"gulp-prompt": "^0.1.2",
|
||||
"gulp-rename": "^1.2.2",
|
||||
"gulp-webserver": "^0.9.1",
|
||||
"netlify-cli": "^2.58.0",
|
||||
"rimraf": "^2.4.2",
|
||||
"streamqueue": "^1.1.0"
|
||||
},
|
||||
"repository": "https://opendev.org/inaugust/inaugust.com",
|
||||
"engines": {
|
||||
"yarn": ">= 1.0.0"
|
||||
"eslint": "^8",
|
||||
"eslint-config-next": "14.1.0",
|
||||
"prettier": "^3.2.4"
|
||||
}
|
||||
}
|
||||
|
@ -1,29 +0,0 @@
|
||||
- hosts: all
|
||||
tasks:
|
||||
|
||||
- name: Pull contents back
|
||||
synchronize:
|
||||
mode: pull
|
||||
src: "/home/zuul/src/opendev.org/inaugust/inaugust.com/dist/"
|
||||
dest: "{{ zuul.executor.work_root }}/dist/"
|
||||
|
||||
- hosts: localhost
|
||||
tasks:
|
||||
- name: Add ns1.inaugust.com to inventory
|
||||
add_host:
|
||||
name: ns1.inaugust.com
|
||||
ansible_python_interpreter: python3
|
||||
ansible_user: mordred
|
||||
|
||||
- name: Add ns1 hostkey to known hosts
|
||||
known_hosts:
|
||||
name: ns1.inaugust.com
|
||||
key: "ns1.inaugust.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDvCg98cFYN7zqdF7742dlnme9lp7QGCemMlF68NLVpuDt7FxqH7blel2ju3upnz1LZHPU9nPuI/+ByYQ+7/1ezGS+N5CQIfWkvhFnBRlwNqIEP/Lfyw3LhFm72QRwDuKxkV5kKzZHXhNlg0I2PgLwDliijSX/0WW9Vgkb2zv/tLXbEM6LBSCXwAPjlfc6LVwmkY3vSxulU6kyL7Izyi83lD533g7jKP8KkOjuFEled8biKV2sP1hIc0tWWlL47G0jRdyB6LVmxOlb0arULfhqEWdW7qldIj2bPmUd2cAG522OoPYZQdDgGYPQlyS0ZJgWvjYoatUAyq8B7ELeJwqN62rcwn8yX3o+bykDX50HCKlrfHHsisST+YcOTtDG8X4H5UlGtMUygmpFEJjUOOoHD6dwmT1R92V5a3Sov1W2Fc7TcfmFoXo1G3N0/wsruVfmzJ7Q/WNtBf4p+c9DXTfJcNKfOIs6o/7ZrzexctEZQRFa7cxBEv2n+fVDN3DcQ12k="
|
||||
|
||||
- hosts: ns1.inaugust.com
|
||||
tasks:
|
||||
|
||||
- name: Publish the contents
|
||||
synchronize:
|
||||
src: "{{ zuul.executor.work_root }}/dist/"
|
||||
dest: "/var/www/inaugust.com/"
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"m.homeserver": {
|
||||
"base_url": "https://mordred.ems.host"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"m.server": "mordred.ems.host:443"
|
||||
}
|
98
src/app/globals.css
Normal file
98
src/app/globals.css
Normal file
@ -0,0 +1,98 @@
|
||||
:root {
|
||||
--max-width: 1100px;
|
||||
--border-radius: 12px;
|
||||
--font-mono: Hack, monospace;
|
||||
|
||||
--foreground-rgb: 0, 0, 0;
|
||||
--background-start-rgb: 255, 255, 255;
|
||||
--background-end-rgb: 255, 255, 255;
|
||||
|
||||
--primary-glow: conic-gradient(
|
||||
from 180deg at 50% 50%,
|
||||
#16abff33 0deg,
|
||||
#0885ff33 55deg,
|
||||
#54d6ff33 120deg,
|
||||
#0071ff33 160deg,
|
||||
transparent 360deg
|
||||
);
|
||||
--secondary-glow: radial-gradient(
|
||||
rgba(255, 255, 255, 1),
|
||||
rgba(255, 255, 255, 0)
|
||||
);
|
||||
|
||||
--tile-start-rgb: 239, 245, 249;
|
||||
--tile-end-rgb: 228, 232, 233;
|
||||
--tile-border: conic-gradient(
|
||||
#00000080,
|
||||
#00000040,
|
||||
#00000030,
|
||||
#00000020,
|
||||
#00000010,
|
||||
#00000010,
|
||||
#00000080
|
||||
);
|
||||
|
||||
--callout-rgb: 238, 240, 241;
|
||||
--callout-border-rgb: 172, 175, 176;
|
||||
--card-rgb: 180, 185, 188;
|
||||
--card-border-rgb: 131, 134, 135;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--foreground-rgb: 255, 255, 255;
|
||||
--background-start-rgb: 0, 0, 0;
|
||||
--background-end-rgb: 0, 0, 0;
|
||||
|
||||
--primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
|
||||
--secondary-glow: linear-gradient(
|
||||
to bottom right,
|
||||
rgba(1, 65, 255, 0),
|
||||
rgba(1, 65, 255, 0),
|
||||
rgba(1, 65, 255, 0.3)
|
||||
);
|
||||
|
||||
--tile-start-rgb: 2, 13, 46;
|
||||
--tile-end-rgb: 2, 5, 19;
|
||||
--tile-border: conic-gradient(
|
||||
#ffffff80,
|
||||
#ffffff40,
|
||||
#ffffff30,
|
||||
#ffffff20,
|
||||
#ffffff10,
|
||||
#ffffff10,
|
||||
#ffffff80
|
||||
);
|
||||
|
||||
--callout-rgb: 20, 20, 20;
|
||||
--callout-border-rgb: 108, 108, 108;
|
||||
--card-rgb: 100, 100, 100;
|
||||
--card-border-rgb: 200, 200, 200;
|
||||
}
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
max-width: 100vw;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
body {
|
||||
color: rgb(var(--foreground-rgb));
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
transparent,
|
||||
rgb(var(--background-end-rgb))
|
||||
)
|
||||
rgb(var(--background-start-rgb));
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
html {
|
||||
color-scheme: dark;
|
||||
}
|
||||
}
|
14
src/app/layout.js
Normal file
14
src/app/layout.js
Normal file
@ -0,0 +1,14 @@
|
||||
import './globals.css'
|
||||
|
||||
export const metadata = {
|
||||
title: 'Monty Taylor',
|
||||
description: "Monty Taylor's Tech Resume",
|
||||
}
|
||||
|
||||
export default function RootLayout({ children }) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
)
|
||||
}
|
25
src/app/page.js
Normal file
25
src/app/page.js
Normal file
@ -0,0 +1,25 @@
|
||||
import CssBaseline from '@mui/material/CssBaseline'
|
||||
import Container from '@mui/material/Container'
|
||||
import Box from '@mui/material/Box'
|
||||
import styles from './page.module.css'
|
||||
|
||||
// Let's fix the styles later
|
||||
import './resume.html/mordred.css'
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<>
|
||||
<CssBaseline />
|
||||
|
||||
<Container maxWidth="xl">
|
||||
<div className="jumbotron">
|
||||
<h1>Monty Taylor</h1>
|
||||
</div>
|
||||
<Box>Things you may or may not care or not care about.</Box>
|
||||
<Box>
|
||||
It should be obvious, but I may be reworking what is going on here.
|
||||
</Box>
|
||||
</Container>
|
||||
</>
|
||||
)
|
||||
}
|
232
src/app/page.module.css
Normal file
232
src/app/page.module.css
Normal file
@ -0,0 +1,232 @@
|
||||
.main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 6rem;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.description {
|
||||
display: inherit;
|
||||
justify-content: inherit;
|
||||
align-items: inherit;
|
||||
font-size: 0.85rem;
|
||||
max-width: var(--max-width);
|
||||
width: 100%;
|
||||
z-index: 2;
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
|
||||
.description a {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.description p {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
padding: 1rem;
|
||||
background-color: rgba(var(--callout-rgb), 0.5);
|
||||
border: 1px solid rgba(var(--callout-border-rgb), 0.3);
|
||||
border-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.code {
|
||||
font-weight: 700;
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(25%, auto));
|
||||
max-width: 100%;
|
||||
width: var(--max-width);
|
||||
}
|
||||
|
||||
.card {
|
||||
padding: 1rem 1.2rem;
|
||||
border-radius: var(--border-radius);
|
||||
background: rgba(var(--card-rgb), 0);
|
||||
border: 1px solid rgba(var(--card-border-rgb), 0);
|
||||
transition:
|
||||
background 200ms,
|
||||
border 200ms;
|
||||
}
|
||||
|
||||
.card span {
|
||||
display: inline-block;
|
||||
transition: transform 200ms;
|
||||
}
|
||||
|
||||
.card h2 {
|
||||
font-weight: 600;
|
||||
margin-bottom: 0.7rem;
|
||||
}
|
||||
|
||||
.card p {
|
||||
margin: 0;
|
||||
opacity: 0.6;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.5;
|
||||
max-width: 30ch;
|
||||
text-wrap: balance;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
padding: 4rem 0;
|
||||
}
|
||||
|
||||
.center::before {
|
||||
background: var(--secondary-glow);
|
||||
border-radius: 50%;
|
||||
width: 480px;
|
||||
height: 360px;
|
||||
margin-left: -400px;
|
||||
}
|
||||
|
||||
.center::after {
|
||||
background: var(--primary-glow);
|
||||
width: 240px;
|
||||
height: 180px;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.center::before,
|
||||
.center::after {
|
||||
content: '';
|
||||
left: 50%;
|
||||
position: absolute;
|
||||
filter: blur(45px);
|
||||
transform: translateZ(0);
|
||||
}
|
||||
|
||||
.logo {
|
||||
position: relative;
|
||||
}
|
||||
/* Enable hover only on non-touch devices */
|
||||
@media (hover: hover) and (pointer: fine) {
|
||||
.card:hover {
|
||||
background: rgba(var(--card-rgb), 0.1);
|
||||
border: 1px solid rgba(var(--card-border-rgb), 0.15);
|
||||
}
|
||||
|
||||
.card:hover span {
|
||||
transform: translateX(4px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion) {
|
||||
.card:hover span {
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mobile */
|
||||
@media (max-width: 700px) {
|
||||
.content {
|
||||
padding: 4rem;
|
||||
}
|
||||
|
||||
.grid {
|
||||
grid-template-columns: 1fr;
|
||||
margin-bottom: 120px;
|
||||
max-width: 320px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.card {
|
||||
padding: 1rem 2.5rem;
|
||||
}
|
||||
|
||||
.card h2 {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.center {
|
||||
padding: 8rem 0 6rem;
|
||||
}
|
||||
|
||||
.center::before {
|
||||
transform: none;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.description a {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.description p,
|
||||
.description div {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.description p {
|
||||
align-items: center;
|
||||
inset: 0 0 auto;
|
||||
padding: 2rem 1rem 1.4rem;
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
rgba(var(--background-start-rgb), 1),
|
||||
rgba(var(--callout-rgb), 0.5)
|
||||
);
|
||||
background-clip: padding-box;
|
||||
backdrop-filter: blur(24px);
|
||||
}
|
||||
|
||||
.description div {
|
||||
align-items: flex-end;
|
||||
pointer-events: none;
|
||||
inset: auto 0 0;
|
||||
padding: 2rem;
|
||||
height: 200px;
|
||||
background: linear-gradient(
|
||||
to bottom,
|
||||
transparent 0%,
|
||||
rgb(var(--background-end-rgb)) 40%
|
||||
);
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet and Smaller Desktop */
|
||||
@media (min-width: 701px) and (max-width: 1120px) {
|
||||
.grid {
|
||||
grid-template-columns: repeat(2, 50%);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.vercelLogo {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
.logo {
|
||||
filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
from {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
@import url('https://cdn.jsdelivr.net/npm/hack-font@3/build/web/hack-subset.css');
|
||||
|
||||
.browsehappy {
|
||||
margin: 0.2em 0;
|
||||
background: #ccc;
|
||||
@ -5,10 +7,11 @@
|
||||
padding: 0.2em 0;
|
||||
}
|
||||
|
||||
/* Space out content a bit */
|
||||
/* Space out content a bit
|
||||
body {
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
*/
|
||||
|
||||
/* Everything but the jumbotron gets side spacing for mobile first views */
|
||||
.header,
|
||||
@ -23,7 +26,7 @@ body {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
/* Make the masthead heading the same height as the navigation */
|
||||
/* Make the masthead heading the same height as the navigation */
|
||||
.header h3 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
@ -42,11 +45,20 @@ body {
|
||||
margin: 30px 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #337ab7;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Main marketing message and sign up button */
|
||||
.jumbotron {
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
font-family: "Hack", monospace;
|
||||
font-family: 'Hack', monospace;
|
||||
background-color: #eee;
|
||||
padding-top: 32px;
|
||||
padding-bottom: 32px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.jumbotron .btn {
|
||||
@ -54,24 +66,28 @@ body {
|
||||
padding: 14px 24px;
|
||||
}
|
||||
|
||||
.jumbotron h1 {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 62px;
|
||||
}
|
||||
|
||||
/* Supporting marketing content */
|
||||
.marketing {
|
||||
margin: 40px 0;
|
||||
}
|
||||
|
||||
.markerting > p + h4 {
|
||||
margin-top: 28px;
|
||||
}
|
||||
margin-top: 28px;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
.footer {
|
||||
display: none;
|
||||
}
|
||||
.breadcrumbs {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.footer {
|
||||
display: none;
|
||||
}
|
||||
.breadcrumbs {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive: Portrait tablets and up */
|
||||
@ -95,39 +111,55 @@ body {
|
||||
}
|
||||
|
||||
h3.resumesection {
|
||||
background-color: #999999;
|
||||
font-family: "Hack", monospace;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-bottom: 6px;
|
||||
|
||||
background-color: #999999;
|
||||
font-family: 'Hack', monospace;
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
h3.subsection {
|
||||
background-color: #eee;
|
||||
font-family: 'Hack', monospace;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.job ul li {
|
||||
line-height: 12pt;
|
||||
font-size: 10pt;
|
||||
}
|
||||
#porthead {
|
||||
padding-left: 8px;
|
||||
padding-top: 6px;
|
||||
|
||||
#porthead {
|
||||
padding-left: 8px;
|
||||
padding-top: 6px;
|
||||
}
|
||||
.titletitle {
|
||||
padding-left: 6px;
|
||||
padding-right: 6px;
|
||||
}
|
||||
p {
|
||||
margin: 0 0 10px;
|
||||
}
|
||||
.techskills {
|
||||
padding-left: 6px;
|
||||
font-size: 12pt;
|
||||
}
|
||||
.summary {
|
||||
padding-left: 6px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 12pt;
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
.job {
|
||||
font-size:14pt;
|
||||
font-size: 14pt;
|
||||
padding-left: 6px;
|
||||
margin-bottom: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
.jobtitle {
|
||||
font-size: 12pt;
|
||||
margin-top: 0px; padding-top: 0px;
|
||||
margin-top: 0px;
|
||||
padding-top: 0px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
@ -135,7 +167,8 @@ h3.resumesection {
|
||||
.jobskillslist {
|
||||
font-size: 8pt;
|
||||
font-style: italic;
|
||||
margin-top: -12px; padding-top: 0px;
|
||||
margin-top: -12px;
|
||||
padding-top: 0px;
|
||||
margin-bottom: 10px;
|
||||
margin-left: 10px;
|
||||
}
|
853
src/app/resume.html/page.js
Normal file
853
src/app/resume.html/page.js
Normal file
@ -0,0 +1,853 @@
|
||||
import CssBaseline from '@mui/material/CssBaseline'
|
||||
import Container from '@mui/material/Container'
|
||||
import Box from '@mui/material/Box'
|
||||
|
||||
import './mordred.css'
|
||||
|
||||
export default function Resume() {
|
||||
return (
|
||||
<>
|
||||
<CssBaseline />
|
||||
|
||||
<Container maxWidth="xl">
|
||||
<div className="jumbotron">
|
||||
<h1>Monty Taylor</h1>
|
||||
<ul className="lead">
|
||||
<li>+1 206 471 3749 </li>
|
||||
<li>mordred@inaugust.com </li>
|
||||
<li>
|
||||
<a href="https://matrix.to/#/@mordred:waterwanders.com">
|
||||
@mordred:waterwanders.com
|
||||
</a>{' '}
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://keybase.io/mordred">keybase.io/mordred</a>{' '}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="techskills">
|
||||
SRE, Open Source Executive, and Free Software Hacker. Expert in Cloud
|
||||
Computing, Large Scale Systems, CI/CD.
|
||||
</div>
|
||||
|
||||
<h3 className="resumesection">
|
||||
<span className="titletitle">Links and Media</span>
|
||||
</h3>
|
||||
|
||||
<div className="techskills">
|
||||
<a href="https://en.wikipedia.org/wiki/Monty_Taylor">
|
||||
Wikipedia: Monty_Taylor
|
||||
</a>
|
||||
</div>
|
||||
<div className="techskills">
|
||||
<a href="http://www.businessinsider.com/most-important-people-in-cloud-computing-2014-4#no-22-hps-monty-taylor-changing-how-big-companies-build-clouds-18">
|
||||
Infoworld: The 39 Most Important People in Cloud Computing
|
||||
</a>
|
||||
</div>
|
||||
<div className="techskills">
|
||||
<a href="https://www.wired.com/2013/04/new-hackers-taylor">
|
||||
Wired: Why Open Source Software is like Burning Man (only better)
|
||||
</a>
|
||||
</div>
|
||||
<div className="techskills">
|
||||
<a href="https://medium.com/@Jay_Jamison/that-kind-of-blew-my-mind-aka-missing-monty-taylor-dfba9594310f#.wu7a5zyu8">
|
||||
Jay Jamison: The kind of blew my mind
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<h3 className="resumesection">
|
||||
<span className="titletitle">Work History</span>
|
||||
</h3>
|
||||
|
||||
<div className="techskills">
|
||||
<div className="job">
|
||||
<p>Oracle</p>
|
||||
<p className="jobtitle">Architect, OCI Substrate: Seattle, WA</p>
|
||||
<p className="jobskillslist">2020-present</p>
|
||||
<ul>
|
||||
<li>
|
||||
Architect responsible for the Substrate, the underlying
|
||||
infrastructure on top of which OCI is deployed.
|
||||
</li>
|
||||
<li>
|
||||
Designed and implemented both processes and systems for managing
|
||||
the intersection of the capacity needed by service teams and the
|
||||
hardware BOM ordered for standing up new regions.
|
||||
</li>
|
||||
<li>
|
||||
Drove multiple programs related to shrinking a cloud designed
|
||||
for hyperscale into ever smaller physical footprints.
|
||||
</li>
|
||||
<li>
|
||||
Coordinated activities on behalf of the Compute Organization
|
||||
related to modernizing deployment automation.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">OpenStack</span>
|
||||
|
||||
<span className="titledate">2010-2020</span>
|
||||
</h3>
|
||||
|
||||
<div className="summary">
|
||||
By the time I left in 2020, OpenStack was one of the fastest-growing
|
||||
open-source communities in the world. It was forecast to have a
|
||||
global market revenue of $5.63 billion USD in 2020 and $6.73 billion
|
||||
USD in 2021. As one of the project founders I wore enumerable hats,
|
||||
including but not limited to working in leadership positions for
|
||||
several of the corporations involved in the 501(c)6 non-profit
|
||||
Foundation that acts as caretaker of the project, in technical
|
||||
leadership positions within the open source project, and on the
|
||||
Board of Directors of the Foundation.
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Red Hat</p>
|
||||
<p className="jobtitle">
|
||||
Member of Technical Staff, Office of the CTO: Remote
|
||||
</p>
|
||||
<p className="jobskillslist">2016-2020</p>
|
||||
<ul>
|
||||
<li>
|
||||
Drove strategy related to CI/CD for the Ansible ecosystem.
|
||||
</li>
|
||||
<li>Led development team focused on developing Zuul.</li>
|
||||
<li>Participated in the SRE responsibilities for OpenDev.</li>
|
||||
<li>
|
||||
Coordinated with Ansible organization on product related efforts
|
||||
around Zuul.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>IBM</p>
|
||||
<p className="jobtitle">
|
||||
Distinguished Engineer / Director of Engineering
|
||||
</p>
|
||||
<p className="jobskillslist">2015-2016</p>
|
||||
<ul>
|
||||
<li>
|
||||
Led OpenStack Innovation team focused on CI/CD and scaling of
|
||||
OpenStack for Public Cloud.
|
||||
</li>
|
||||
<li>Led development team focused on developing Zuul.</li>
|
||||
<li>Participated in the SRE responsibilities for OpenDev.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Hewlett-Packard</p>
|
||||
<p className="jobtitle">
|
||||
Distinguished Technologist / Director of Engineering
|
||||
</p>
|
||||
<p className="jobskillslist">2011-2015</p>
|
||||
<ul>
|
||||
<li>
|
||||
Staffed and led the OpenDev SRE team. Grew community consensus
|
||||
of the need for broader staffing and succeeded in achieving
|
||||
divestiture of the team from being a single-company team.
|
||||
</li>
|
||||
<li>
|
||||
Led teams focused on CI and CD of OpenStack for both Public and
|
||||
Private cloud products
|
||||
</li>
|
||||
<li>
|
||||
Managed coopetition between hundreds of competing and
|
||||
collaborating companies, both directly in the form of influence
|
||||
and interpersonal relationships, and through implementation of
|
||||
systems to ensure level playing fields.
|
||||
</li>
|
||||
<li>
|
||||
Grew two separate teams in parallel, one internal and one
|
||||
external. Each went from 2 to ~50 over a two year period.
|
||||
</li>
|
||||
<li>
|
||||
Drove partnerships and customer engagements related to OpenStack
|
||||
externally. Represented OpenStack internally to engineering
|
||||
organizations across Business Units.
|
||||
</li>
|
||||
<li>
|
||||
Staffed for and achieved technical leadership and recognition
|
||||
for HP in OpenStack. Based on C-Suite requests housed over half
|
||||
of the OpenStack Technical Committee and several Projet Team
|
||||
Leads within my team. Drove HP to be the top overall contributor
|
||||
to OpenStack.
|
||||
</li>
|
||||
<li>
|
||||
Oversaw the creation of TripleO, which was the basis of HP
|
||||
Helion and is now the foundation of Red Hat's RHSOP OpenStack
|
||||
product line.
|
||||
</li>
|
||||
<li>Oversaw the creation of Ironic and Bifrost.</li>
|
||||
<li>Oversaw the creation of Zuul.</li>
|
||||
<li>Oversaw the stabalization of Keystone.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Rackspace Cloud</p>
|
||||
<p className="jobtitle">System Architect: Remote</p>
|
||||
<p className="jobskillslist">2010-2011</p>
|
||||
<ul>
|
||||
<li>
|
||||
Helped start the OpenStack project (see creation line on
|
||||
<a href="https://launchpad.net/openstack">
|
||||
https://launchpad.net/openstack
|
||||
</a>
|
||||
, it's a fun bit of history).
|
||||
</li>
|
||||
<li>
|
||||
Designed and implemented the development process and the systems
|
||||
to support it. Instituted the concept of "gated commits" where
|
||||
code only landed if if was code reviewed and all automated tests
|
||||
passed. Under this system, from Day Zero of the project, no
|
||||
developer had, or has ever had, direct push access.
|
||||
</li>
|
||||
<li>
|
||||
Founded the SRE function responsible for running all of the
|
||||
tooling and systems needed to support the OpenStack project.
|
||||
</li>
|
||||
<li>
|
||||
Laid ground work for scaling the developer ecosystem from ~40
|
||||
developers to this high water mark of 2500 in any given six
|
||||
month period.
|
||||
</li>
|
||||
<li>
|
||||
Coordinated with varying and competing interests from teams at
|
||||
Rackspace, NASA and Canonical.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">Open Source</span>
|
||||
</h3>
|
||||
|
||||
<div className="summary">
|
||||
As Open Source has taken over the industry, work directly on
|
||||
constituent projects and associated non-profit organizations has
|
||||
become paramount.
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>OpenStack Foundation Board of Directors</p>
|
||||
<p className="jobtitle">Individual Member</p>
|
||||
<p className="jobskillslist">2012-2016,2018-2020</p>
|
||||
<ul>
|
||||
<li>
|
||||
Oversaw business, legal, product and branding concerns
|
||||
representing the Individual Members of the Foundation.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>
|
||||
<a href="https://opendev.org">OpenDev</a>
|
||||
</p>
|
||||
<p className="jobtitle">Founder, SRE, Core Team Member</p>
|
||||
<p className="jobskillslist">2010-present</p>
|
||||
<ul>
|
||||
<li>
|
||||
Founded OpenDev, which started as the OpenStack Infrastructure
|
||||
team. Responsible for development, operation and scaling of all
|
||||
of the support systems for the development of the OpenStack
|
||||
project.
|
||||
</li>
|
||||
<li>
|
||||
Provided initial product management. Expanded that role to be a
|
||||
collaboratively driven group product vision.
|
||||
</li>
|
||||
<li>
|
||||
Built and operated world's largest Open Source CI
|
||||
infrastructure, supporting 2500 developers world wide, landing
|
||||
10k changes per month and consuming approximately 20k cloud
|
||||
servers per day.
|
||||
</li>
|
||||
<li>
|
||||
Oversaw the creation of Zuul, Nodepool, Storyboard, git-review,
|
||||
pbr, elastic-recheck and countless other systems
|
||||
</li>
|
||||
<li>
|
||||
Wrote shade library, which became openstacksdk, to drive
|
||||
multi-cloud interoperability and orchestration issues found in
|
||||
production.
|
||||
</li>
|
||||
<li>
|
||||
Ansible core contributor and owner of OpenStack and Puppet
|
||||
modules
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>
|
||||
<a href="https://zuul-ci.org">Zuul</a>
|
||||
</p>
|
||||
<p className="jobtitle">Co-founder, Maintainer</p>
|
||||
<p className="jobskillslist">2012-present</p>
|
||||
<ul>
|
||||
<li>Co-founder of Zuul, a project gating system.</li>
|
||||
<li>
|
||||
Oversaw product development and project growth, including
|
||||
corporate resource sponsorship.
|
||||
</li>
|
||||
<li>
|
||||
Provided technical marketing worldwide via conference
|
||||
interactions.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>
|
||||
<a href="https://www.python.org/psf/members/#fellows">
|
||||
Python Software Foundation
|
||||
</a>
|
||||
</p>
|
||||
<p className="jobtitle">Fellow</p>
|
||||
<p className="jobskillslist">2012-present</p>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>OpenStack Technical Committee Member</p>
|
||||
<p className="jobskillslist">2012-2017</p>
|
||||
<ul>
|
||||
<li>Oversaw technical governance of the OpenStack project.</li>
|
||||
<li>
|
||||
Grew project and organization from 50 to 2500 contributors.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>OpenStack Project Policy Board Member</p>
|
||||
<p className="jobskillslist">2011-2012</p>
|
||||
<ul>
|
||||
<li>
|
||||
Oversaw overall governance of OpenStack in the days before the
|
||||
Foundation was established.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">Non-profit</span>
|
||||
</h3>
|
||||
|
||||
<div className="job">
|
||||
<p>
|
||||
<a href="https://nolakittenfoster.org/">Nola Kitten Foster</a>
|
||||
</p>
|
||||
<p className="jobtitle">
|
||||
Founder, Vice-President, Secretary: New Orleans, LA
|
||||
</p>
|
||||
<p className="jobskillslist">2020-present</p>
|
||||
<ul>
|
||||
<li>
|
||||
Founded a non-profit New Orleans based foster nursery for young
|
||||
kittens. Work with local animal shelters as well as TNR
|
||||
programs.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>NYU</p>
|
||||
<p className="jobtitle">Adjunct Professor, ITP: New York, NY</p>
|
||||
<p className="jobskillslist">2016</p>
|
||||
<ul>
|
||||
<li>
|
||||
Taught course on "Lighting Without the Board" - focusing on
|
||||
custom programmatic control of lighting and overview of lighting
|
||||
design.
|
||||
</li>
|
||||
<li>Guest lectures on Privacy in the Digitial Age.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Camp Pot Luck</p>
|
||||
<p className="jobtitle">Founder, General Manager</p>
|
||||
<p className="jobskillslist">2010-2014</p>
|
||||
<ul>
|
||||
<li>
|
||||
Started and ran a Burning Man Theme Camp focused on feeding
|
||||
people.
|
||||
</li>
|
||||
<li>Provided dinners for roughly 150 people per day.</li>
|
||||
<li>
|
||||
Managed budget and infrastructure needs, such as fresh and grey
|
||||
water, electrical, structural, kitchen creation, plumbing and
|
||||
camp membership.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>The Satori Group</p>
|
||||
<p className="jobtitle">Company Member</p>
|
||||
<p className="jobskillslist">2009-2011</p>
|
||||
<ul>
|
||||
<li>
|
||||
Member of collaborative theatre ensemble focused on
|
||||
consensus-oriented new work generation. If this seems irrelevant
|
||||
on a tech resume, please note the time period, and then the time
|
||||
period where we founded OpenStack on a system of leaderless
|
||||
group consensus.
|
||||
</li>
|
||||
<li>
|
||||
Designed and implemented electrical refit of company space to
|
||||
create a general purpose performance venue.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">The MySQL Years</span>
|
||||
|
||||
<span className="titledate">2005-2010</span>
|
||||
</h3>
|
||||
|
||||
<div className="summary">
|
||||
Working at MySQL was the first (but not last) time I was part of the
|
||||
largest Open Source acquisition in history. As the world's most
|
||||
popular Open Source database, our clients included basically
|
||||
everyone. After the Sun acquisition we were allowed to fork the
|
||||
primary product and work on re-thinking the internals, because Sun.
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Rackspace</p>
|
||||
<p className="jobtitle">System Architect: Remote</p>
|
||||
<p className="jobskillslist">
|
||||
C++, Python, Drizzle, Linux, OSX, Solaris
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Core developer on{' '}
|
||||
<a href="http://launchpad.net/drizzle">Drizzle</a>: a modern
|
||||
fork of MySQL for the Cloud
|
||||
</li>
|
||||
<li>Wrangled Drizzle build and plugin sub-systems.</li>
|
||||
<li>
|
||||
Managed and owned Drizzle coding standards and C++
|
||||
standardization.
|
||||
</li>
|
||||
<li>
|
||||
Authored{' '}
|
||||
<a href="http://launchpad.net/pandora-build">pandora-build</a> -
|
||||
A set of simple and robust autotools macros.
|
||||
</li>
|
||||
<li>Worked on Bazaar and Rackspace Cloud plugins for Hudson</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Sun Microsystems</p>
|
||||
<p className="jobtitle">Staff Engineer: Remote (Seattle, WA)</p>
|
||||
<p className="jobskillslist">
|
||||
C++, Drizzle, MySQL, Linux, OSX, Solaris
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Core developer on{' '}
|
||||
<a href="http://launchpad.net/drizzle">Drizzle</a>: a modern
|
||||
fork of MySQL for the Cloud
|
||||
</li>
|
||||
<li>Wrangled Drizzle build and plugin sub-systems.</li>
|
||||
<li>
|
||||
Managed and owned Drizzle coding standards and C++
|
||||
standardization.
|
||||
</li>
|
||||
<li>Drizzle "Captain" - primary community code liason.</li>
|
||||
<li>
|
||||
Authored{' '}
|
||||
<a href="http://launchpad.net/pandora-build">pandora-build</a> -
|
||||
A set of simple and robust autotools macros.
|
||||
</li>
|
||||
<li>
|
||||
Authored{' '}
|
||||
<a href="http://launchpad.net/drizzle-interface">
|
||||
drizzle-interface
|
||||
</a>{' '}
|
||||
- Bindings to libdrizzle.
|
||||
</li>
|
||||
<li>
|
||||
Authored{' '}
|
||||
<a href="http://launchpad.net/gearman-interface">
|
||||
gearman-interface
|
||||
</a>{' '}
|
||||
- Bindings to libgearman.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>MySQL</p>
|
||||
<p className="jobtitle">
|
||||
Senior Consultant: Remote (Seattle, WA / Stockholm, Sweden)
|
||||
</p>
|
||||
<p className="jobskillslist">
|
||||
MySQL, MySQL Cluster, Heartbeat, DRBD, Linux, C++, C#, Python,
|
||||
Java, PHP, Ruby
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Solutions Architect for top 10 web properties, telcos and gaming
|
||||
companies.
|
||||
</li>
|
||||
<li>Expert in High Availability and Clustering Solutions.</li>
|
||||
<li>
|
||||
Authored{' '}
|
||||
<a href="http://launchpad.net/ndb-bindings">NDB/Bindings</a> -
|
||||
Wrappers for MySQL Cluster NDB API in Java, Python, Ruby, C#,
|
||||
Perl and Lua.
|
||||
</li>
|
||||
<li>Member of the MySQL Debian Packaging team.</li>
|
||||
<li>
|
||||
Technical owner of MySQL/Linbit relationship related to DRBD.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">Startups</span>
|
||||
<span className="titledate">1999-2011</span>
|
||||
</h3>
|
||||
|
||||
<div className="job">
|
||||
<p>Import Brasileira, LLC</p>
|
||||
<p className="jobtitle">Founder: Seattle, WA</p>
|
||||
<ul>
|
||||
<li>Imported high quality Brazilian Cachaça.</li>
|
||||
<li>
|
||||
Won double-gold at the 2011 San Francisco International Spirits
|
||||
Competition.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>StageFiles</p>
|
||||
<p className="jobtitle">Founder / Partner: Remote</p>
|
||||
<p className="jobskillslist">
|
||||
Plone, Python, mod_python, TurboGears, Debian/Ubuntu GNU/Linux
|
||||
</p>
|
||||
<ul>
|
||||
<li>Started, ran and managed company.</li>
|
||||
<li>
|
||||
Designed and developed a web-based portfolio system for
|
||||
Theatrical Design.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>In August Productions</p>
|
||||
<p className="jobtitle">Founder, CEO</p>
|
||||
<p className="jobskillslist">
|
||||
Python, Zope, elisp, LaTeX, exim, ZODB, GTK, Glade, Cyrus, SASL,
|
||||
SquirrelMail, Apache, Debian GNU/Linux, Debian Packaging
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Started and managed small business concerns, including hiring,
|
||||
payroll and billing.
|
||||
</li>
|
||||
<li>
|
||||
Designed an extensible theatrical lighting control system.
|
||||
</li>
|
||||
<li>Wrote a typesetting system for theatre scripts.</li>
|
||||
<li>Co-developed automated email and web hosting system.</li>
|
||||
<em>Clients included:</em>
|
||||
|
||||
<div className="job">
|
||||
<p>Washington Mutual: Seattle, WA</p>
|
||||
<p className="jobskillslist">
|
||||
C#, Python, LaTeX, Python, Subversion, Apache2, Tomcat,
|
||||
Solaris, Windows XP
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Developed LaTeX based reporting solution for Loan Prepayment
|
||||
Modeling. Yes, someone paid me to work on LaTeX!
|
||||
</li>
|
||||
<li>
|
||||
Provided system support including administration and system
|
||||
design.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Monster.com: Boston, MA</p>
|
||||
<p className="jobskillslist">
|
||||
Zope, Python, DTML, C#, SQL Server, Perforce, Windows 2000
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Took over a Zope-based system for managing Job Content
|
||||
written by external contractors who had left.
|
||||
</li>
|
||||
<li>
|
||||
Single point of contact for Zope related issues for the
|
||||
organization.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Tahinis Mediterranean Bistro, Bar Harbor, ME: Remote</p>
|
||||
<p className="jobskillslist">
|
||||
Plone, Python, Javascript, CSS, Debian GNU/Linux
|
||||
</p>
|
||||
<ul>
|
||||
<li>Created an Online menu system for restaurants.</li>
|
||||
<li>
|
||||
Completely missed the now obvious opportunity to have become
|
||||
Seamless or DoorDash.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>North Carolina State University: Remote</p>
|
||||
<p className="jobskillslist">
|
||||
Zope, Python, mod-perl, Javascript, CSS, Apache, Debian
|
||||
GNU/Linux, Solaris
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Created a system to help students write better lab reports.
|
||||
</li>
|
||||
<li>
|
||||
Created a system to protect copywritten works used in course
|
||||
materials.
|
||||
</li>
|
||||
<li>
|
||||
Worked on web-based system to translate Western Characters
|
||||
into Hindi.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Cox Interactive Media: Atlanta, GA</p>
|
||||
<p className="jobskillslist">
|
||||
Zope, Python, Oracle, PL/SQL, Java, Solaris
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Implemented a Content Management System in a combination of
|
||||
Zope and Java Stored Procedures.
|
||||
</li>
|
||||
<li>
|
||||
Marvelled at the fact that it took 3 solid days to install
|
||||
Oracle. sssh, don't let Oracle hear me say that!
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Thingamy: Oslo, Norway</p>
|
||||
<p className="jobskillslist">Python</p>
|
||||
<ul>
|
||||
<li>
|
||||
Wrote a tool to migrate data from legacy database to ZODB.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Alexander Consulting: London, England</p>
|
||||
<p className="jobskillslist">Zope</p>
|
||||
<ul>
|
||||
<li>Provided solution assessment for proposed CRM System.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>iuveno: Ingolstadt, Germany</p>
|
||||
<p className="jobskillslist">
|
||||
Zope, Python, LDAP, IMAP, SuSE GNU/Linux, ZEO
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Worked on a web-based CRM system that interfaced Palm
|
||||
Pilots.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>MTNI: Atlanta, GA</p>
|
||||
<p className="jobskillslist">Python</p>
|
||||
<ul>
|
||||
<li>
|
||||
Developed a Python library implementation of RFC 1861 -
|
||||
SNPP.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
<div className="job">
|
||||
<p>HRSmart</p>
|
||||
<p className="jobtitle">
|
||||
Senior System Administrator: Dallas, TX
|
||||
</p>
|
||||
<p className="jobskillslist">
|
||||
Apache, MySQL, Debian GNU/Linux, dirvish, Exim, Debian Packaging
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Administered Debian GNU/Linux, Apache and MySQL servers.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Information Innovation</p>
|
||||
<p className="jobtitle">
|
||||
Information Artist / Lead Developer: Amsterdam, The Netherlands
|
||||
</p>
|
||||
<p className="jobskillslist">
|
||||
Perl, MySQL, Apache, Zope, Python, RedHat GNU/Linux, Solaris,
|
||||
MacOS X
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Led development efforts for web-based strategic intelligence
|
||||
product.
|
||||
</li>
|
||||
<li>
|
||||
Designed and developed Internet news-feed reading and
|
||||
processing system. 20 years before AI/ML. As a set of Perl
|
||||
scripts. Because 1999.
|
||||
</li>
|
||||
<li>
|
||||
Architected internal company systems for messaging and
|
||||
Intranet.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 className="subsection">
|
||||
<span className="titletitle">Pre-Y2K Enterprise</span>
|
||||
|
||||
<span className="titledate">1995-1999</span>
|
||||
</h3>
|
||||
|
||||
<div className="job">
|
||||
<p>Branch Bank and Trust</p>
|
||||
<p className="jobtitle">
|
||||
Enterprise Management Systems Analyst: Wilson, NC
|
||||
</p>
|
||||
<p className="jobskillslist">
|
||||
Tivoli, Perl, ksh, AIX, Windows, Samba
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Wrote and maintained Perl and shell scripts for Tivoli system
|
||||
automation.
|
||||
</li>
|
||||
<li>
|
||||
Used Samba to automate bootstrapping of Tivoli Endpoind
|
||||
systems in remote bank branch locations on Windows
|
||||
workstations from an AIX box. If you want a really fun story,
|
||||
ask me about this one.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Best Consulting: Group Health Cooperative</p>
|
||||
<p className="jobtitle">Consultant: Seattle, WA</p>
|
||||
<p className="jobskillslist">
|
||||
Perl, ksh, Sybase, T-SQL, Stored Procedures, Solaris
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Wrote code to update and manage Data Warehouse Common
|
||||
Dimensions tables.
|
||||
</li>
|
||||
<li>
|
||||
Used Perl Typeglobs that I could not possibly read today to
|
||||
build a SQL generation system. One should never use Typeglobs,
|
||||
except for the times when one should. Although I cannot
|
||||
justify it today, I was able to successfully defend the use to
|
||||
Mark-Jason Dominus on the first Perl Whirl Geek Cruise, so I
|
||||
feel confident today that 1998 me wasn't completely off his
|
||||
rocker.
|
||||
</li>
|
||||
<li>Understood enough Perl to know how to use Typeglobs.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>EDS: Russell Stover Candies, Kansas City, MO</p>
|
||||
<p className="jobtitle">Information Analyst</p>
|
||||
<p className="jobskillslist">Perl, ksh, Sybase, T-SQL, AIX</p>
|
||||
<ul>
|
||||
<li>
|
||||
Administered systems and performed DBA tasks supporting a 24x7
|
||||
manufacturing and candy shipping environment.
|
||||
</li>
|
||||
<li>
|
||||
Implemented a full GNU distribution in SMIT packages on to of
|
||||
AIX.
|
||||
</li>
|
||||
<li>
|
||||
Implemented a fully automated provisioning system for
|
||||
installing and managing a fleet of AIX systems in remote
|
||||
warehouse and factory locations. Today you might consider this
|
||||
config managment.
|
||||
</li>
|
||||
<li>
|
||||
Maintained an inherited barcode scanning system that involved
|
||||
RF scanner guns running DOS, that telnetted to an AIX box
|
||||
running a curses menu application that fed data into a 4G
|
||||
database running on a Windows NT server. Remotely.
|
||||
</li>
|
||||
<li>
|
||||
Was promised unlimited candy during interview, only to arrive
|
||||
on first day to discover that the floor of geeks had eaten too
|
||||
much candy and the policy had been revoked.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>Fujitsu Network Communications, Dallas, TX</p>
|
||||
<p className="jobtitle">UNIX Admin/Support</p>
|
||||
<p className="jobskillslist">AIX, C, Framemaker SDK, ksh</p>
|
||||
<ul>
|
||||
<li>
|
||||
Provided system and user support for Desktop AIX systems used
|
||||
by the tech writing team.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="job">
|
||||
<p>IBM, Raleigh, NC</p>
|
||||
<p className="jobtitle">UNIX Admin/Support</p>
|
||||
<p className="jobskillslist">MVS, AIX, C, ksh</p>
|
||||
<ul>
|
||||
<li>
|
||||
Provided system administration and AIX support for the TCP
|
||||
Performance Testing on MVS.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Container>
|
||||
</>
|
||||
)
|
||||
}
|
597
src/resume.html
597
src/resume.html
@ -1,597 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Monty Taylor - Resume</title>
|
||||
<meta charset="utf-8">
|
||||
<!-- hacking font -->
|
||||
<link rel="stylesheet"
|
||||
href="//cdn.jsdelivr.net/font-hack/2.018/css/hack.min.css">
|
||||
<link rel="stylesheet"
|
||||
href="/css/bootstrap.css">
|
||||
<link rel="stylesheet"
|
||||
href="/css/mordred.css">
|
||||
<meta name="description"
|
||||
content="Monty Taylor's Resume">
|
||||
<meta name="author" content="Monty Taylor">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!--
|
||||
Yup - this resume is maintained in HTML by hand. That should tell you
|
||||
something about me if the resume doesn't. The source is at
|
||||
https://opendev.org/inaugust/inaugust.com/
|
||||
-->
|
||||
|
||||
<div class="jumbotron">
|
||||
<div class="container">
|
||||
|
||||
<h1>Monty Taylor</h1>
|
||||
<ul class="lead">
|
||||
<li>+1 206 471 3749</li>
|
||||
<li>mordred@inaugust.com</li>
|
||||
<li><a href="https://matrix.to/#/@mordred:waterwanders.com">@mordred:waterwanders.com</a></li>
|
||||
<li><a href="https://keybase.io/mordred">keybase.io/mordred</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="techskills">
|
||||
SRE, Open Source Executive, and Free Software Hacker.
|
||||
Expert in Cloud Computing, Large Scale Systems, CI/CD.
|
||||
</div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Links and Media</span>
|
||||
</h3>
|
||||
|
||||
<div class="techskills">
|
||||
<a href="https://en.wikipedia.org/wiki/Monty_Taylor">
|
||||
Wikipedia: Monty_Taylor</a></div>
|
||||
<div class="techskills">
|
||||
<a href="http://www.businessinsider.com/most-important-people-in-cloud-computing-2014-4#no-22-hps-monty-taylor-changing-how-big-companies-build-clouds-18">
|
||||
Infoworld: The 39 Most Important People in Cloud Computing</a></div>
|
||||
<div class="techskills">
|
||||
<a href="https://www.wired.com/2013/04/new-hackers-taylor">
|
||||
Wired: Why Open Source Software is like Burning Man (only better)</a></div>
|
||||
<div class="techskills">
|
||||
<a href="https://medium.com/@Jay_Jamison/that-kind-of-blew-my-mind-aka-missing-monty-taylor-dfba9594310f#.wu7a5zyu8">
|
||||
Jay Jamison: The kind of blew my mind</a></div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Work History</span>
|
||||
</h3>
|
||||
|
||||
<div class="techskills">
|
||||
<div class="job">
|
||||
<p>Oracle</p>
|
||||
<p class="jobtitle">
|
||||
Architect, OCI Substrate: Seattle, WA</p>
|
||||
<p class="jobskillslist">2020-present</p>
|
||||
<ul>
|
||||
<li>Architect responsible for the Substrate, the underlying infrastructure
|
||||
on top of which OCI is deployed.</li>
|
||||
<li>Designed and implemented both processes and systems for managing the
|
||||
intersection of the capacity needed by service teams and the hardware
|
||||
BOM ordered for standing up new regions.</li>
|
||||
<li>Drove multiple programs related to shrinking a cloud designed for
|
||||
hyperscale into ever smaller physical footprints.</li>
|
||||
<li>Coordinated activities on behalf of the Compute Organization related
|
||||
to modernizing deployment automation.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">OpenStack</span>
|
||||
|
||||
<span class="titledate">2010-2020</span>
|
||||
</h3>
|
||||
|
||||
<div class="techskills">
|
||||
OpenStack is one of the fastest-growing open-source communities in the world.
|
||||
It’s forecast to have a global market revenue of $5.63 billion USD in 2020 and $6.73 billion USD in 2021.
|
||||
As one of the project founders I wore enumerable hats, including but not
|
||||
limited to working in leadership positions for several of the corporations
|
||||
involved in the 501(c)6 non-profit Foundation that acts as caretaker of the project,
|
||||
in technical leadership positions within the open source project,
|
||||
and on the Board of Directors of the Foundation.
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Red Hat</p>
|
||||
<p class="jobtitle">
|
||||
Member of Technical Staff, Office of the CTO: Remote</p>
|
||||
<p class="jobskillslist">2016-2020</p>
|
||||
<ul>
|
||||
<li>Drove strategy related to CI/CD for the Ansible ecosystem.</li>
|
||||
<li>Led development team focused on developing Zuul.</li>
|
||||
<li>Participated in the SRE responsibilities for OpenDev.</li>
|
||||
<li>Coordinated with Ansible organization on product related efforts around
|
||||
Zuul.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>IBM</p>
|
||||
<p class="jobtitle">Distinguished Engineer / Director of Engineering</p>
|
||||
<p class="jobskillslist">2015-2016</p>
|
||||
<ul>
|
||||
<li>Led OpenStack Innovation team focused on CI/CD and scaling of
|
||||
OpenStack for Public Cloud.</li>
|
||||
<li>Led development team focused on developing Zuul.</li>
|
||||
<li>Participated in the SRE responsibilities for OpenDev.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Hewlett-Packard</p>
|
||||
<p class="jobtitle">
|
||||
Distinguished Technologist / Director of Engineering</p>
|
||||
<p class="jobskillslist">2011-2015</p>
|
||||
<ul>
|
||||
<li>Staffed and led the OpenDev SRE team. Grew community
|
||||
consensus of the need for broader staffing and succeeded in achieving
|
||||
divestiture of the team from being a single-company team.</li>
|
||||
<li>Led teams focused on CI and CD of OpenStack for both Public and
|
||||
Private cloud products</li>
|
||||
<li>Managed coopetition between hundreds of competing and collaborating
|
||||
companies, both directly in the form of influence and interpersonal
|
||||
relationships, and through implementation of systems to ensure
|
||||
level playing fields.
|
||||
<li>Grew two separate teams in parallel, one internal and one external.
|
||||
Each went from 2 to ~50 over a two year period.</li>
|
||||
<li>Drove partnerships and customer engagements related to OpenStack
|
||||
externally. Represented OpenStack internally to engineering
|
||||
organizations across Business Units.</li>
|
||||
<li>Staffed for and achieved technical leadership and recognition for HP
|
||||
in OpenStack. Based on C-Suite requests housed over half of the
|
||||
OpenStack Technical Committee and several Projet Team Leads within my team.
|
||||
Drove HP to be the top overall contributor to OpenStack.</li>
|
||||
<li>Oversaw the creation of TripleO, which was the basis of HP Helion and
|
||||
is now the foundation of Red Hat's RHSOP OpenStack product line.</li>
|
||||
<li>Oversaw the creation of Ironic and Bifrost.</li>
|
||||
<li>Oversaw the creation of Zuul.</li>
|
||||
<li>Oversaw the stabalization of Keystone.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Rackspace Cloud</p>
|
||||
<p class="jobtitle">System Architect: Remote</p>
|
||||
<p class="jobskillslist">2010-2011</p>
|
||||
<ul>
|
||||
<li>Helped start the OpenStack project (see creation line on
|
||||
<a href='https://launchpad.net/openstack'>
|
||||
https://launchpad.net/openstack</a>, it's a fun bit of history).</li>
|
||||
<li>Designed and implemented the development process and the systems to
|
||||
support it. Instituted the concept of "gated commits" where code only landed if
|
||||
if was code reviewed and all automated tests passed. Under this system, from
|
||||
Day Zero of the project, no developer had, or has ever had, direct push access.</li>
|
||||
<li>Founded the SRE function responsible for running all of the tooling and
|
||||
systems needed to support the OpenStack project.</li>
|
||||
<li>Laid ground work for scaling the developer ecosystem from ~40
|
||||
developers to this high water mark of 2500 in any given six month
|
||||
period.</li>
|
||||
<li>Coordinated with varying and competing interests from teams at
|
||||
Rackspace, NASA and Canonical.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Open Source</span>
|
||||
</h3>
|
||||
|
||||
<div class="techskills">
|
||||
As Open Source has taken over the industry, work directly on constituent projects
|
||||
and associated non-profit organizations has become paramount.
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>OpenStack Foundation Board of Directors</p>
|
||||
<p class="jobtitle">Individual Member</p>
|
||||
<p class="jobskillslist">2012-2016,2018-2020</p>
|
||||
<ul>
|
||||
<li>Oversaw business, legal, product and branding concerns
|
||||
representing the Individual Members of the Foundation.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p><a href="https://opendev.org">OpenDev</a></p>
|
||||
<p class="jobtitle">Founder, SRE, Core Team Member</p>
|
||||
<p class="jobskillslist">2010-present</p>
|
||||
<ul>
|
||||
<li>Founded OpenDev, which started as the OpenStack Infrastructure team.
|
||||
Responsible for development, operation and scaling of all of the support
|
||||
systems for the development of the OpenStack project.</li>
|
||||
<li>Provided initial product management. Expanded that role to be a
|
||||
collaboratively driven group product vision.
|
||||
<li>Built and operated world's largest Open Source CI infrastructure,
|
||||
supporting 2500 developers world wide, landing 10k changes per month
|
||||
and consuming approximately 20k cloud servers per day.</li>
|
||||
<li>Oversaw the creation of Zuul, Nodepool, Storyboard, git-review, pbr,
|
||||
elastic-recheck and countless other systems</li>
|
||||
<li>Wrote shade library, which became openstacksdk, to drive multi-cloud
|
||||
interoperability and orchestration issues found in production.</li>
|
||||
<li>Ansible core contributor and owner of OpenStack and Puppet modules</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p><a href="https://zuul-ci.org">Zuul</a></p>
|
||||
<p class="jobtitle">Co-founder, Maintainer</p>
|
||||
<p class="jobskillslist">2012-present</p>
|
||||
<ul>
|
||||
<li>Co-founder of Zuul, a project gating system.</li>
|
||||
<li>Oversaw product development and project growth, including corporate
|
||||
resource sponsorship.</li>
|
||||
<li>Provided technical marketing worldwide via conference interactions.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p><a href="https://www.python.org/psf/members/#fellows">Python Software Foundation</a></p>
|
||||
<p class="jobtitle">Fellow</p>
|
||||
<p class="jobskillslist">2012-present</p>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>OpenStack Technical Committee Member</p>
|
||||
<p class="jobskillslist">2012-2017</p>
|
||||
<ul>
|
||||
<li>Oversaw technical governance of the OpenStack project.</li>
|
||||
<li>Grew project and organization from 50 to 2500 contributors.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>OpenStack Project Policy Board Member</p>
|
||||
<p class="jobskillslist">2011-2012</p>
|
||||
<ul>
|
||||
<li>Oversaw overall governance of OpenStack in the days before the
|
||||
Foundation was established.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Non-profit</span>
|
||||
</h3>
|
||||
|
||||
<div class="job">
|
||||
<p><a href="https://nolakittenfoster.org/">Nola Kitten Foster</a></p>
|
||||
<p class="jobtitle">Founder, Vice-President, Secretary: New Orleans, LA</p>
|
||||
<p class="jobskillslist">2020-present</p>
|
||||
<ul>
|
||||
<li>Founded a non-profit New Orleans based foster nursery for young kittens.
|
||||
Work with local animal shelters as well as TNR programs.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>NYU</p>
|
||||
<p class="jobtitle">Adjunct Professor, ITP: New York, NY</p>
|
||||
<p class="jobskillslist">2016</p>
|
||||
<ul>
|
||||
<li>Taught course on "Lighting Without the Board" - focusing on custom
|
||||
programmatic control of lighting and overview of lighting design.</li>
|
||||
<li>Guest lectures on Privacy in the Digitial Age.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Camp Pot Luck</p>
|
||||
<p class="jobtitle">Founder, General Manager</p>
|
||||
<p class="jobskillslist">2010-2014</p>
|
||||
<ul>
|
||||
<li>Started and ran a Burning Man Theme Camp focused on feeding
|
||||
people.</li>
|
||||
<li>Provided dinners for roughly 150 people per day.</li>
|
||||
<li>Managed budget and infrastructure needs, such as fresh and
|
||||
grey water, electrical, structural, kitchen creation,
|
||||
plumbing and camp membership.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>The Satori Group</p>
|
||||
<p class="jobtitle">Company Member</p>
|
||||
<p class="jobskillslist">2009-2011</p>
|
||||
<ul>
|
||||
<li>Member of collaborative theatre ensemble focused on
|
||||
consensus-oriented new work generation. If this seems irrelevant
|
||||
on a tech resume, please note the time period, and then the
|
||||
time period where we founded OpenStack on a system of leaderless
|
||||
group consensus.</li>
|
||||
<li>Designed and implemented electrical refit of company
|
||||
space to create a general purpose performance venue.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">The MySQL Years</span>
|
||||
|
||||
<span class="titledate">2005-2010</span>
|
||||
</h3>
|
||||
|
||||
<div class="techskills">
|
||||
Working at MySQL was the first (but not last) time I was part of
|
||||
the largest Open Source acquisition in history. As the world's most popular
|
||||
Open Source database, our clients included basically everyone.
|
||||
After the Sun acquisition we were allowed to fork the primary
|
||||
product and work on re-thinking the internals, because Sun.
|
||||
</div>
|
||||
|
||||
|
||||
<div class="job">
|
||||
<p>Rackspace</p>
|
||||
<p class="jobtitle">System Architect: Remote</p>
|
||||
<p class="jobskillslist">C++, Python, Drizzle, Linux, OSX, Solaris</p>
|
||||
<ul>
|
||||
<li>Core developer on <a href="http://launchpad.net/drizzle">Drizzle</a>:
|
||||
a modern fork of MySQL for the Cloud</li>
|
||||
<li>Wrangled Drizzle build and plugin sub-systems.</li>
|
||||
<li>Managed and owned Drizzle coding standards and C++ standardization.</li>
|
||||
<li>Authored <a href="http://launchpad.net/pandora-build">pandora-build</a> - A set of simple and robust autotools macros.</li>
|
||||
<li>Worked on Bazaar and Rackspace Cloud plugins for Hudson</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Sun Microsystems</p>
|
||||
<p class="jobtitle">Staff Engineer: Remote (Seattle, WA)</p>
|
||||
<p class="jobskillslist">C++, Drizzle, MySQL, Linux, OSX, Solaris</p>
|
||||
<ul>
|
||||
<li>Core developer on <a href="http://launchpad.net/drizzle">Drizzle</a>: a modern fork of MySQL for the Cloud</li>
|
||||
<li>Wrangled Drizzle build and plugin sub-systems.</li>
|
||||
<li>Managed and owned Drizzle coding standards and C++ standardization.</li>
|
||||
<li>Drizzle "Captain" - primary community code liason.</li>
|
||||
<li>Authored <a href="http://launchpad.net/pandora-build">pandora-build</a> - A set of simple and robust autotools macros.</li>
|
||||
<li>Authored <a href="http://launchpad.net/drizzle-interface">drizzle-interface</a> - Bindings to libdrizzle.</li>
|
||||
<li>Authored <a href="http://launchpad.net/gearman-interface">gearman-interface</a> - Bindings to libgearman.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>MySQL</p>
|
||||
<p class="jobtitle">Senior Consultant: Remote (Seattle, WA / Stockholm, Sweden)</p>
|
||||
<p class="jobskillslist">MySQL, MySQL Cluster, Heartbeat, DRBD, Linux, C++, C#, Python, Java, PHP, Ruby</p>
|
||||
<ul>
|
||||
<li>Solutions Architect for top 10 web properties, telcos and gaming companies.</li>
|
||||
<li>Expert in High Availability and Clustering Solutions.</li>
|
||||
<li>Authored <a href="http://launchpad.net/ndb-bindings">NDB/Bindings</a> - Wrappers for MySQL Cluster NDB API in Java, Python, Ruby, C#, Perl and Lua.</li>
|
||||
<li>Member of the MySQL Debian Packaging team.</li>
|
||||
<li>Technical owner of MySQL/Linbit relationship related to DRBD.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Startups</span>
|
||||
<span class="titledate">1999-2011</span>
|
||||
</h3>
|
||||
|
||||
<div class="job">
|
||||
<p>Import Brasileira, LLC</p>
|
||||
<p class="jobtitle">Founder: Seattle, WA</p>
|
||||
<ul>
|
||||
<li>Imported high quality Brazilian Cachaça.</li>
|
||||
<li>Won double-gold at the 2011 San Francisco International Spirits Competition.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>StageFiles</p>
|
||||
<p class="jobtitle">Founder / Partner: Remote</p>
|
||||
<p class="jobskillslist">Plone, Python, mod_python, TurboGears, Debian/Ubuntu GNU/Linux</p>
|
||||
<ul>
|
||||
<li>Started, ran and managed company.</li>
|
||||
<li>Designed and developed a web-based portfolio system for
|
||||
Theatrical Design.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>In August Productions</p>
|
||||
<p class="jobtitle">Founder, CEO</p>
|
||||
<p class="jobskillslist">Python, Zope, elisp, LaTeX, exim, ZODB, GTK, Glade, Cyrus, SASL,
|
||||
SquirrelMail, Apache,
|
||||
Debian GNU/Linux, Debian Packaging</p>
|
||||
<ul>
|
||||
<li>Started and managed small business concerns, including hiring, payroll and billing.</li>
|
||||
<li>Designed an extensible theatrical lighting control system.</li>
|
||||
<li>Wrote a typesetting system for theatre scripts.</li>
|
||||
<li>Co-developed automated email and web hosting system.</li>
|
||||
<em>Clients included:</em>
|
||||
|
||||
<div class="job">
|
||||
<p>Washington Mutual: Seattle, WA</p>
|
||||
<p class="jobskillslist">C#, Python, LaTeX, Python, Subversion,
|
||||
Apache2, Tomcat, Solaris, Windows XP</p>
|
||||
<ul>
|
||||
<li>Developed LaTeX based reporting solution for Loan Prepayment Modeling. Yes, someone paid me to work on LaTeX!</li>
|
||||
<li>Provided system support including administration and system design.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="job">
|
||||
<p>Monster.com: Boston, MA</p>
|
||||
<p class="jobskillslist">Zope, Python, DTML, C#, SQL Server, Perforce, Windows 2000</p>
|
||||
<ul>
|
||||
<li>Took over a Zope-based system for managing Job Content written by external contractors who had left.</li>
|
||||
<li>Single point of contact for Zope related issues for the organization.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Tahinis Mediterranean Bistro, Bar Harbor, ME: Remote</p>
|
||||
<p class="jobskillslist">Plone, Python, Javascript, CSS, Debian GNU/Linux</p>
|
||||
<ul>
|
||||
<li>Created an Online menu system for restaurants.</li>
|
||||
<li>Completely missed the now obvious opportunity to have become Seamless or DoorDash.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>North Carolina State University: Remote</p>
|
||||
<p class="jobskillslist">Zope, Python, mod-perl, Javascript, CSS, Apache,
|
||||
Debian GNU/Linux, Solaris</p>
|
||||
<ul>
|
||||
<li>Created a system to help students write better lab reports.</li>
|
||||
<li>Created a system to protect copywritten works used in course materials.</li>
|
||||
<li>Worked on web-based system to translate Western Characters into Hindi.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Cox Interactive Media: Atlanta, GA</p>
|
||||
<p class="jobskillslist">Zope, Python, Oracle, PL/SQL, Java, Solaris</p>
|
||||
<ul>
|
||||
<li>Implemented a Content Management System in a combination of Zope and Java Stored Procedures.</li>
|
||||
<li>Marvelled at the fact that it took 3 solid days to install Oracle. sssh, don't let Oracle hear me say that!</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job" style="page-break-before: always">
|
||||
<p>Thingamy: Oslo, Norway</p>
|
||||
<p class="jobskillslist">Python</p>
|
||||
<ul>
|
||||
<li>Wrote a tool to migrate data from legacy database to ZODB.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Alexander Consulting: London, England</p>
|
||||
<p class="jobskillslist">Zope</p>
|
||||
<ul>
|
||||
<li>Provided solution assessment for proposed CRM System.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>iuveno: Ingolstadt, Germany</p>
|
||||
<p class="jobskillslist">Zope, Python, LDAP, IMAP, SuSE GNU/Linux, ZEO</p>
|
||||
<ul>
|
||||
<li>Worked on a web-based CRM system that interfaced Palm Pilots.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>MTNI: Atlanta, GA</p>
|
||||
<p class="jobskillslist">Python</p>
|
||||
<ul>
|
||||
<li>Developed a Python library implementation of RFC 1861 - SNPP.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
<div class="job"> <!-- style="page-break-before: always"> -->
|
||||
<p>HRSmart</p>
|
||||
<p class="jobtitle">Senior System Administrator: Dallas, TX</p>
|
||||
<p class="jobskillslist">Apache, MySQL, Debian GNU/Linux, dirvish, Exim, Debian Packaging</p>
|
||||
<ul>
|
||||
<li>Administered Debian GNU/Linux, Apache and MySQL servers.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Information Innovation</p>
|
||||
<p class="jobtitle">
|
||||
Information Artist / Lead Developer: Amsterdam, The Netherlands</p>
|
||||
<p class="jobskillslist">
|
||||
Perl, MySQL, Apache, Zope, Python, RedHat GNU/Linux, Solaris, MacOS X</p>
|
||||
<ul>
|
||||
<li>Led development efforts for web-based strategic intelligence product.</li>
|
||||
<li>Designed and developed Internet news-feed reading and processing system.
|
||||
20 years before AI/ML. As a set of Perl scripts. Because 1999.</li>
|
||||
<li>Architected internal company systems for messaging and Intranet.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<h3 class="resumesection">
|
||||
<span class="titletitle">Pre-Y2K Enterprise</span>
|
||||
|
||||
<span class="titledate">1995-1999</span>
|
||||
</h3>
|
||||
|
||||
<div class="job">
|
||||
<p>Branch Bank and Trust</p>
|
||||
<p class="jobtitle">Enterprise Management Systems Analyst: Wilson, NC</p>
|
||||
<p class="jobskillslist">Tivoli, Perl, ksh, AIX, Windows, Samba</p>
|
||||
<ul>
|
||||
<li>Wrote and maintained Perl and shell scripts for Tivoli system
|
||||
automation.</li>
|
||||
<li>Used Samba to automate bootstrapping of Tivoli Endpoind systems
|
||||
in remote bank branch locations on Windows workstations from an AIX box.
|
||||
If you want a really fun story, ask me about this one.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Best Consulting: Group Health Cooperative</p>
|
||||
<p class="jobtitle">Consultant: Seattle, WA</p>
|
||||
<p class="jobskillslist">Perl, ksh, Sybase, T-SQL, Stored Procedures,
|
||||
Solaris</p>
|
||||
<ul>
|
||||
<li>Wrote code to update and manage Data Warehouse Common Dimensions
|
||||
tables.</li>
|
||||
<li>Used Perl Typeglobs that I could not possibly read today to build
|
||||
a SQL generation system. One should never use Typeglobs, except for
|
||||
the times when one should. Although I cannot justify it today, I
|
||||
was able to successfully defend the use to Mark-Jason Dominus on the
|
||||
first Perl Whirl Geek Cruise, so I feel confident today that 1998
|
||||
me wasn't completely off his rocker.</li>
|
||||
<li>Understood enough Perl to know how to use Typeglobs.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>EDS: Russell Stover Candies, Kansas City, MO</p>
|
||||
<p class="jobtitle">Information Analyst</p>
|
||||
<p class="jobskillslist">Perl, ksh, Sybase, T-SQL, AIX</p>
|
||||
<ul>
|
||||
<li>Administered systems and performed DBA tasks supporting a 24x7
|
||||
manufacturing and candy shipping environment.</li>
|
||||
<li>Implemented a full GNU distribution in SMIT packages on to of AIX.</li>
|
||||
<li>Implemented a fully automated provisioning system for installing
|
||||
and managing a fleet of AIX systems in remote warehouse and factory
|
||||
locations. Today you might consider this config managment.</li>
|
||||
<li>Maintained an inherited barcode scanning system that involved RF
|
||||
scanner guns running DOS, that telnetted to an AIX box running a
|
||||
curses menu application that fed data into a 4G database running on
|
||||
a Windows NT server. Remotely.</li>
|
||||
<li>Was promised unlimited candy during interview, only to arrive on
|
||||
first day to discover that the floor of geeks had eaten too much
|
||||
candy and the policy had been revoked.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>Fujitsu Network Communications, Dallas, TX</p>
|
||||
<p class="jobtitle">UNIX Admin/Support</p>
|
||||
<p class="jobskillslist">AIX, C, Framemaker SDK, ksh</p>
|
||||
<ul>
|
||||
<li>Provided system and user support for Desktop AIX systems used
|
||||
by the tech writing team.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="job">
|
||||
<p>IBM, Raleigh, NC</p>
|
||||
<p class="jobtitle">UNIX Admin/Support</p>
|
||||
<p class="jobskillslist">MVS, AIX, C, ksh</p>
|
||||
<ul>
|
||||
<li>Provided system administration and AIX support for the TCP Performance Testing
|
||||
on MVS.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user