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
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"extends": "next/core-web-vitals",
|
||||||
|
"rules": {
|
||||||
|
"react/no-unescaped-entities": "off"
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,33 +1,36 @@
|
||||||
# Logs
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
logs
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Runtime data
|
# dependencies
|
||||||
pids
|
/node_modules
|
||||||
*.pid
|
/.pnp
|
||||||
*.seed
|
.pnp.js
|
||||||
|
.yarn/install-state.gz
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
# testing
|
||||||
lib-cov
|
/coverage
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
# next.js
|
||||||
coverage
|
/.next/
|
||||||
|
/out/
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
# production
|
||||||
.grunt
|
/build
|
||||||
|
|
||||||
# node-waf configuration
|
# misc
|
||||||
.lock-wscript
|
.DS_Store
|
||||||
|
*.pem
|
||||||
|
|
||||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
# debug
|
||||||
build/Release
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
# Dependency directory
|
# local env files
|
||||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
.env*.local
|
||||||
node_modules
|
|
||||||
|
|
||||||
# IDE things
|
# vercel
|
||||||
.idea
|
.vercel
|
||||||
*.iml
|
|
||||||
dist
|
# typescript
|
||||||
.publish
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
19
.zuul.yaml
19
.zuul.yaml
|
@ -18,16 +18,9 @@
|
||||||
parent: build-javascript-deployment
|
parent: build-javascript-deployment
|
||||||
success-url: "http://site.{build.uuid}.{tenant.name}.zuul-preview.opendev.org/"
|
success-url: "http://site.{build.uuid}.{tenant.name}.zuul-preview.opendev.org/"
|
||||||
vars:
|
vars:
|
||||||
js_build_command: package
|
node_version: 18
|
||||||
javascript_content_dir: dist
|
js_build_command: build
|
||||||
|
javascript_content_dir: out
|
||||||
- job:
|
|
||||||
name: inaugust-publish-website
|
|
||||||
parent: build-javascript-deployment
|
|
||||||
vars:
|
|
||||||
js_build_command: package
|
|
||||||
javascript_content_dir: dist
|
|
||||||
post-run: playbooks/publish.yaml
|
|
||||||
|
|
||||||
- job:
|
- job:
|
||||||
name: inaugust-publish-javascript-to-netlify
|
name: inaugust-publish-javascript-to-netlify
|
||||||
|
@ -85,8 +78,9 @@
|
||||||
parent: inaugust-publish-javascript-to-netlify
|
parent: inaugust-publish-javascript-to-netlify
|
||||||
vars:
|
vars:
|
||||||
netlify_site_id: 61580c77-b0fe-42c7-acec-c92d4cd1729c
|
netlify_site_id: 61580c77-b0fe-42c7-acec-c92d4cd1729c
|
||||||
javascript_content_dir: dist
|
node_version: 18
|
||||||
js_build_command: package
|
js_build_command: build
|
||||||
|
javascript_content_dir: out
|
||||||
secrets:
|
secrets:
|
||||||
- secret: inaugust-netlify-auth
|
- secret: inaugust-netlify-auth
|
||||||
name: netlify_auth
|
name: netlify_auth
|
||||||
|
@ -101,5 +95,4 @@
|
||||||
- inaugust-build-website
|
- inaugust-build-website
|
||||||
post:
|
post:
|
||||||
jobs:
|
jobs:
|
||||||
- inaugust-publish-website
|
|
||||||
- inaugust-publish-netlify
|
- 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:
|
If you're interested in my presentations, you can go look at them here:
|
||||||
http://inaugust.com/talks
|
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
|
Building
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@ -17,9 +19,9 @@ The following commands will get you started:
|
||||||
|
|
||||||
# This will create a local webhost, serving all of your presentations.
|
# This will create a local webhost, serving all of your presentations.
|
||||||
# It will autodetect changes and refresh any applicable pages.
|
# It will autodetect changes and refresh any applicable pages.
|
||||||
yarn start
|
yarn dev
|
||||||
|
|
||||||
# This will build the content in the ``dist`` directory
|
# This will build the content in the ``out`` directory
|
||||||
yarn run package
|
yarn build
|
||||||
|
|
||||||
.. _yarn: https://yarnpkg.com/en/docs/install
|
.. _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
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
})();
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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",
|
"name": "inaugust.com",
|
||||||
"version": "1.0.0",
|
"version": "2.0.0",
|
||||||
"description": "My convention presentations.",
|
|
||||||
"main": "index.html",
|
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "gulp serve",
|
"dev": "next dev",
|
||||||
"prestart": "gulp package",
|
"build": "next build",
|
||||||
"new": "gulp new",
|
"start": "next start",
|
||||||
"package": "gulp package"
|
"format": "prettier --write 'src/**/*'",
|
||||||
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Monty Taylor",
|
"name": "Monty Taylor",
|
||||||
|
@ -16,32 +15,20 @@
|
||||||
"url": "http://inaugust.com"
|
"url": "http://inaugust.com"
|
||||||
},
|
},
|
||||||
"license": "CC-BY 4.0",
|
"license": "CC-BY 4.0",
|
||||||
|
"repository": "https://opendev.org/inaugust/inaugust.com",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^5.2.0",
|
"@emotion/react": "^11.11.3",
|
||||||
"bootstrap": "^3.3.5",
|
"@emotion/styled": "^11.11.0",
|
||||||
"font-mfizz": "^2.4.1",
|
"@fontsource/roboto": "^5.0.8",
|
||||||
"modernizr": "^3.6.0",
|
"@mui/icons-material": "^5.15.6",
|
||||||
"reveal.js": "^3.7.0"
|
"@mui/material": "^5.15.6",
|
||||||
|
"next": "14.1.0",
|
||||||
|
"react": "^18",
|
||||||
|
"react-dom": "^18"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cheerio": "^0.19.0",
|
"eslint": "^8",
|
||||||
"gulp": "^4.0.0",
|
"eslint-config-next": "14.1.0",
|
||||||
"gulp-change": "^1.0.0",
|
"prettier": "^3.2.4"
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
|
||||||
}
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
)
|
||||||
|
}
|
|
@ -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>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
|
@ -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 {
|
.browsehappy {
|
||||||
margin: 0.2em 0;
|
margin: 0.2em 0;
|
||||||
background: #ccc;
|
background: #ccc;
|
||||||
|
@ -5,10 +7,11 @@
|
||||||
padding: 0.2em 0;
|
padding: 0.2em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Space out content a bit */
|
/* Space out content a bit
|
||||||
body {
|
body {
|
||||||
padding-bottom: 20px;
|
padding-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* Everything but the jumbotron gets side spacing for mobile first views */
|
/* Everything but the jumbotron gets side spacing for mobile first views */
|
||||||
.header,
|
.header,
|
||||||
|
@ -42,11 +45,20 @@ body {
|
||||||
margin: 30px 0;
|
margin: 30px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #337ab7;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* Main marketing message and sign up button */
|
/* Main marketing message and sign up button */
|
||||||
.jumbotron {
|
.jumbotron {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-bottom: 1px solid #e5e5e5;
|
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 {
|
.jumbotron .btn {
|
||||||
|
@ -54,6 +66,12 @@ body {
|
||||||
padding: 14px 24px;
|
padding: 14px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jumbotron h1 {
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 62px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Supporting marketing content */
|
/* Supporting marketing content */
|
||||||
.marketing {
|
.marketing {
|
||||||
margin: 40px 0;
|
margin: 40px 0;
|
||||||
|
@ -64,14 +82,12 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
@media print {
|
@media print {
|
||||||
|
|
||||||
.footer {
|
.footer {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.breadcrumbs {
|
.breadcrumbs {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Responsive: Portrait tablets and up */
|
/* Responsive: Portrait tablets and up */
|
||||||
|
@ -96,12 +112,18 @@ body {
|
||||||
|
|
||||||
h3.resumesection {
|
h3.resumesection {
|
||||||
background-color: #999999;
|
background-color: #999999;
|
||||||
font-family: "Hack", monospace;
|
font-family: 'Hack', monospace;
|
||||||
color: #FFFFFF;
|
color: #ffffff;
|
||||||
|
font-size: 16px;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
h3.subsection {
|
||||||
|
background-color: #eee;
|
||||||
|
font-family: 'Hack', monospace;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
|
|
||||||
}
|
}
|
||||||
.job ul li {
|
.job ul li {
|
||||||
line-height: 12pt;
|
line-height: 12pt;
|
||||||
|
@ -110,15 +132,24 @@ h3.resumesection {
|
||||||
#porthead {
|
#porthead {
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
padding-top: 6px;
|
padding-top: 6px;
|
||||||
|
|
||||||
}
|
}
|
||||||
.titletitle {
|
.titletitle {
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
|
padding-right: 6px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin: 0 0 10px;
|
||||||
}
|
}
|
||||||
.techskills {
|
.techskills {
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
}
|
}
|
||||||
|
.summary {
|
||||||
|
padding-left: 6px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-size: 12pt;
|
||||||
|
border-bottom: 1px solid #e5e5e5;
|
||||||
|
}
|
||||||
.job {
|
.job {
|
||||||
font-size: 14pt;
|
font-size: 14pt;
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
|
@ -127,7 +158,8 @@ h3.resumesection {
|
||||||
}
|
}
|
||||||
.jobtitle {
|
.jobtitle {
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
margin-top: 0px; padding-top: 0px;
|
margin-top: 0px;
|
||||||
|
padding-top: 0px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +167,8 @@ h3.resumesection {
|
||||||
.jobskillslist {
|
.jobskillslist {
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
margin-top: -12px; padding-top: 0px;
|
margin-top: -12px;
|
||||||
|
padding-top: 0px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
|
@ -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