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:
Monty Taylor 2024-01-20 09:57:18 -08:00
parent 51a94f25dd
commit c9344ec266
20 changed files with 3369 additions and 9691 deletions

6
.eslintrc.json Normal file
View File

@ -0,0 +1,6 @@
{
"extends": "next/core-web-vitals",
"rules": {
"react/no-unescaped-entities": "off"
}
}

53
.gitignore vendored
View File

@ -1,33 +1,36 @@
# Logs
logs
*.log
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# Runtime data
pids
*.pid
*.seed
# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# testing
/coverage
# Coverage directory used by tools like istanbul
coverage
# next.js
/.next/
/out/
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# production
/build
# node-waf configuration
.lock-wscript
# misc
.DS_Store
*.pem
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
# local env files
.env*.local
# IDE things
.idea
*.iml
dist
.publish
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

5
.prettierrc Normal file
View File

@ -0,0 +1,5 @@
{
"trailingComma": "es5",
"semi": false,
"singleQuote": true
}

View File

@ -18,16 +18,9 @@
parent: build-javascript-deployment
success-url: "http://site.{build.uuid}.{tenant.name}.zuul-preview.opendev.org/"
vars:
js_build_command: package
javascript_content_dir: dist
- job:
name: inaugust-publish-website
parent: build-javascript-deployment
vars:
js_build_command: package
javascript_content_dir: dist
post-run: playbooks/publish.yaml
node_version: 18
js_build_command: build
javascript_content_dir: out
- job:
name: inaugust-publish-javascript-to-netlify
@ -85,8 +78,9 @@
parent: inaugust-publish-javascript-to-netlify
vars:
netlify_site_id: 61580c77-b0fe-42c7-acec-c92d4cd1729c
javascript_content_dir: dist
js_build_command: package
node_version: 18
js_build_command: build
javascript_content_dir: out
secrets:
- secret: inaugust-netlify-auth
name: netlify_auth
@ -101,5 +95,4 @@
- inaugust-build-website
post:
jobs:
- inaugust-publish-website
- inaugust-publish-netlify

View File

@ -4,6 +4,8 @@ My website, blog posts and conference talks
If you're interested in my presentations, you can go look at them here:
http://inaugust.com/talks
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
Building
--------
@ -17,9 +19,9 @@ The following commands will get you started:
# This will create a local webhost, serving all of your presentations.
# It will autodetect changes and refresh any applicable pages.
yarn start
yarn dev
# This will build the content in the ``dist`` directory
yarn run package
# This will build the content in the ``out`` directory
yarn build
.. _yarn: https://yarnpkg.com/en/docs/install

View File

@ -1,397 +0,0 @@
(function initializeGulp () {
'use strict';
var fs = require('fs');
var cheerio = require('cheerio');
var rimraf = require('rimraf');
var gulp = require('gulp');
var git = require('gulp-git');
var filter = require('gulp-filter');
var less = require('gulp-less');
var data = require('gulp-data');
var change = require('gulp-change');
var webserver = require('gulp-webserver');
var streamqueue = require('streamqueue');
var ignore = require('gulp-ignore');
var prompt = require('gulp-prompt');
var handlebars = require('gulp-compile-handlebars');
var rename = require('gulp-rename');
var dir = {
'dist': './dist',
'src': './src'
};
// List of file paths.
var paths = {
'html': dir.src + '/**/*.html',
'index': dir.src + '/index.hbs',
'css': dir.src + '/css/**/*.css',
'js': dir.src + '/js/**/*.js',
'keybase': dir.src + '/keybase.txt',
'talks': dir.src + '/talks',
'talkindex': dir.src + '/talks/index.hbs',
'posts': dir.src + '/posts',
'images': [
dir.src + '/**/*.png',
dir.src + '/**/*.gif',
dir.src + '/**/*.jpg',
dir.src + '/**/*.jpeg',
dir.src + '/**/*.svg'
]
};
// The current package.json file.
var packageJson = require('./package.json');
/**
* The handlebars configuration object.
*/
var handlebarsConfig = {
helpers: {
'datetime': function (object) {
return object.toLocaleDateString();
}
}
};
/**
* This method parses through discovered presentations, reads their
* html metadata, and returns an array of that metadata.
*/
function buildPresentationManifest () {
var presentations = [];
var files = fs.readdirSync(paths.talks);
for (var i = 0; i < files.length; i++) {
var file = paths.talks + '/' + files[i];
try {
var stat = fs.statSync(file);
var $ = cheerio.load(fs.readFileSync(file));
presentations.push({
'title': $("head title").text(),
'description': $("head meta[name='description']").attr('content'),
'mtime': stat.mtime,
'path': 'talks/' + files[i].replace('.hbs', '.html')
});
} catch (e) {
// Do nothing
}
}
presentations.sort(function (a, b) {
return a.mtime >= b.mtime ? 1 : -1;
});
return presentations;
}
/**
* This method parses through discovered posts, reads their
* html metadata, and returns an array of that metadata.
*/
function buildPostManifest () {
var posts = [];
var files = fs.readdirSync(paths.posts);
for (var i = 0; i < files.length; i++) {
var file = paths.posts + '/' + files[i];
try {
var stat = fs.statSync(file);
var $ = cheerio.load(fs.readFileSync(file));
posts.push({
'title': $("head title").text(),
'description': $("head meta[name='description']").attr('content'),
'mtime': stat.mtime,
'path': 'posts/' + files[i].replace('.hbs', '.html')
});
} catch (e) {
// Do nothing
}
}
posts.sort(function (a, b) {
return a.mtime >= b.mtime ? 1 : -1;
});
return posts;
}
function performTemplateChange(content) {
var file = dir.src + '/layout/post.hbs';
var stat = fs.statSync(file);
return fs.readFileSync(file, {'encoding': 'utf-8'});
}
function performTalkTemplateChange(content) {
var file = dir.src + '/layout/talk.hbs';
var stat = fs.statSync(file);
return fs.readFileSync(file, {'encoding': 'utf-8'});
}
/**
* Clean the output directory.
*
* @param {Function} cb callback.
* @return {*} A gulp stream that performs this action.
*/
gulp.task('clean', function (cb) {
rimraf(dir.dist, cb);
});
/**
* Build the static file structure from our dependencies.
*/
gulp.task('package:libs', function (cb) {
var resolveBootstrap = gulp.src(
'./node_modules/bootstrap/dist/css/bootstrap.css')
.pipe(gulp.dest(dir.dist + '/css'));
var resolveCSS = gulp.src(
'./node_modules/@fortawesome/fontawesome-free/css/*')
.pipe(filter('*.css'))
.pipe(gulp.dest(dir.dist + '/css'));
var resolveFonts = gulp.src(
'./node_modules/@fortawesome/fontawesome-free/webfonts/*')
.pipe(filter(['*.otf', '*.eot', '*.svg', '*.ttf', '*.woff', '*.woff2']))
.pipe(gulp.dest(dir.dist + '/fonts'));
// Reveal.js is a special snowflake.
var resolveReveal = gulp.src('./node_modules/reveal.js/*/**/*.*',
{'base': './node_modules/reveal.js/'})
.pipe(ignore(['**/test/**', '*.js']))
.pipe(filter([
'**/*.js',
'**/*.css',
'**/*.eot',
'**/*.ttf',
'**/*.woff'
]))
.pipe(gulp.dest(dir.dist));
streamqueue({'objectMode': true},
resolveBootstrap,
resolveCSS,
resolveReveal,
resolveFonts);
cb()
});
/**
* Package all images.
*/
gulp.task('package:images', function () {
return gulp.src(paths.images, {'base': dir.src})
.pipe(gulp.dest(dir.dist));
});
/**
* Package keybase static files.
*/
gulp.task('package:keybase', function () {
return gulp.src(paths.keybase, {'base': dir.src})
.pipe(gulp.dest(dir.dist));
});
/**
* Package all css.
*/
gulp.task('package:css', function () {
return gulp.src(paths.css, {'base': dir.src})
.pipe(gulp.dest(dir.dist));
});
/**
* Package all js.
*/
gulp.task('package:js', function () {
return gulp.src(paths.js, {'base': dir.src})
.pipe(gulp.dest(dir.dist));
});
/**
* Package the handlebars files.
*/
gulp.task('package:talkindex', function () {
var templateData = {
'presentations': buildPresentationManifest(),
'author': packageJson.author
};
// Automatically build the site list.
return gulp.src(dir.src + '/talks.hbs', {'base': dir.src})
.pipe(handlebars(templateData, handlebarsConfig))
.pipe(rename(function (path) {
path.extname = ".html";
}))
.pipe(gulp.dest(dir.dist));
});
/**
* Package the handlebars files.
*/
gulp.task('package:postindex', function () {
var templateData = {
'posts': buildPostManifest(),
'author': packageJson.author
};
// Automatically build the site list.
return gulp.src(dir.src + '/index.hbs', {'base': dir.src})
.pipe(handlebars(templateData, handlebarsConfig))
.pipe(rename(function (path) {
path.extname = ".html";
}))
.pipe(gulp.dest(dir.dist));
});
gulp.task('package:posts', function () {
var templateData = {
'author': packageJson.author
};
// Automatically build the site list.
return gulp.src(dir.src + '/posts/*.hbs', {'base': dir.src})
.pipe(data(function(file) {
var stat = fs.statSync(file.path);
var $ = cheerio.load(fs.readFileSync(file.path));
return {
'title': $("head title").text(),
'description': $("head meta[name='description']").attr('content'),
'body': $("body").html(),
}}))
.pipe(change(performTemplateChange))
.pipe(handlebars(templateData, handlebarsConfig))
.pipe(rename(function (path) {
path.extname = ".html";
}))
.pipe(gulp.dest(dir.dist));
});
gulp.task('package:talks', function () {
var templateData = {
'author': packageJson.author
};
// Automatically build the site list.
return gulp.src(dir.src + '/talks/*.hbs', {'base': dir.src})
.pipe(data(function(file) {
var stat = fs.statSync(file.path);
var $ = cheerio.load(fs.readFileSync(file.path));
var newpath = file.clone();
return {
'title': $("head title").text(),
'description': $("head meta[name='description']").attr('content'),
'body': $("body").html(),
'path': newpath.relative.replace('.hbs', '.html'),
}}))
.pipe(change(performTalkTemplateChange))
.pipe(handlebars(templateData, handlebarsConfig))
.pipe(rename(function (path) {
path.extname = ".html";
}))
.pipe(gulp.dest(dir.dist));
});
/**
* Copy the HTML files into the dist folder.
*/
gulp.task('package:html', function () {
return gulp.src(paths.html, {'base': dir.src})
.pipe(gulp.dest(dir.dist));
});
/**
* This task builds a new presentation from the base presentation template.
*/
gulp.task('new', function () {
var templateData = {
author: packageJson.author
};
var destinationFolder = '';
return gulp.src(dir.src + '/template/index.hbs')
.pipe(prompt.prompt([
{
type: 'input',
name: 'folderName',
message: 'Presentation Folder Name (/^[a-z][a-z_]+$/):',
validate: function (value) {
var result = value.match(/^([a-z][a-z_]+)$/);
return result !== null;
}
},
{
type: 'input',
name: 'title',
message: 'Presentation Title:'
},
{
type: 'input',
name: 'description',
message: 'Presentation Description:'
},
{
type: 'input',
name: 'event',
message: 'First presented at:'
},
{
type: 'input',
name: 'event',
message: 'First presented on (date):'
}],
function (res) {
destinationFolder = res.folderName;
templateData.presentation = {
'title': res.title,
'description': res.description,
'event': res.event
}
}))
.pipe(handlebars(templateData, handlebarsConfig))
.pipe(rename(function (path) {
path.dirname += '/' + destinationFolder;
path.basename = "index";
path.extname = ".html";
}))
.pipe(gulp.dest(dir.src))
.pipe(git.add());
});
/**
* Package the entire site into the dist folder.
*/
gulp.task('package', gulp.series('package:html',
'package:talks', 'package:talkindex',
'package:posts', 'package:postindex',
'package:libs', 'package:keybase',
'package:images', 'package:css', 'package:js'));
/**
* Start a local server and serve the application code. This is
* equivalent to opening index.html in a browser.
*
* @return {*} A gulp stream that performs this action.
*/
gulp.task('serve', function () {
gulp.watch(paths.html, gulp.series('package:html'));
gulp.watch(paths.images, gulp.series('package:images'));
gulp.watch(paths.talks, gulp.series('package:talks'));
gulp.watch(dir.src + '/talks/*.hbs', gulp.series('package:talks'));
gulp.watch(paths.css, gulp.series('package:css'));
gulp.watch(paths.js, gulp.series('package:js'));
gulp.watch(paths.posts, gulp.series('package:posts'));
gulp.watch(paths.index, gulp.series('package:posts'));
return gulp.src(dir.dist)
.pipe(webserver({
'livereload': true,
'open': true
}));
});
})();

7
jsconfig.json Normal file
View File

@ -0,0 +1,7 @@
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}

6
next.config.mjs Normal file
View File

@ -0,0 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
};
export default nextConfig;

View File

@ -1,14 +1,13 @@
{
"name": "presentations",
"version": "1.0.0",
"description": "My convention presentations.",
"main": "index.html",
"name": "inaugust.com",
"version": "2.0.0",
"private": true,
"scripts": {
"start": "gulp serve",
"prestart": "gulp package",
"new": "gulp new",
"package": "gulp package"
"dev": "next dev",
"build": "next build",
"start": "next start",
"format": "prettier --write 'src/**/*'",
"lint": "next lint"
},
"author": {
"name": "Monty Taylor",
@ -16,32 +15,20 @@
"url": "http://inaugust.com"
},
"license": "CC-BY 4.0",
"repository": "https://opendev.org/inaugust/inaugust.com",
"dependencies": {
"@fortawesome/fontawesome-free": "^5.2.0",
"bootstrap": "^3.3.5",
"font-mfizz": "^2.4.1",
"modernizr": "^3.6.0",
"reveal.js": "^3.7.0"
"@emotion/react": "^11.11.3",
"@emotion/styled": "^11.11.0",
"@fontsource/roboto": "^5.0.8",
"@mui/icons-material": "^5.15.6",
"@mui/material": "^5.15.6",
"next": "14.1.0",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"cheerio": "^0.19.0",
"gulp": "^4.0.0",
"gulp-change": "^1.0.0",
"gulp-compile-handlebars": "0.6.1",
"gulp-data": "^1.2.0",
"gulp-filter": "^3.0.0",
"gulp-git": "^2.8.0",
"gulp-ignore": "^1.2.1",
"gulp-less": "^3.0.3",
"gulp-prompt": "^0.1.2",
"gulp-rename": "^1.2.2",
"gulp-webserver": "^0.9.1",
"netlify-cli": "^2.58.0",
"rimraf": "^2.4.2",
"streamqueue": "^1.1.0"
},
"repository": "https://opendev.org/inaugust/inaugust.com",
"engines": {
"yarn": ">= 1.0.0"
"eslint": "^8",
"eslint-config-next": "14.1.0",
"prettier": "^3.2.4"
}
}

View File

@ -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/"

View File

@ -1,8 +0,0 @@
{
"m.homeserver": {
"base_url": "https://mordred.ems.host"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
}

View File

@ -1,3 +0,0 @@
{
"m.server": "mordred.ems.host:443"
}

98
src/app/globals.css Normal file
View File

@ -0,0 +1,98 @@
:root {
--max-width: 1100px;
--border-radius: 12px;
--font-mono: Hack, monospace;
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 255, 255, 255;
--background-end-rgb: 255, 255, 255;
--primary-glow: conic-gradient(
from 180deg at 50% 50%,
#16abff33 0deg,
#0885ff33 55deg,
#54d6ff33 120deg,
#0071ff33 160deg,
transparent 360deg
);
--secondary-glow: radial-gradient(
rgba(255, 255, 255, 1),
rgba(255, 255, 255, 0)
);
--tile-start-rgb: 239, 245, 249;
--tile-end-rgb: 228, 232, 233;
--tile-border: conic-gradient(
#00000080,
#00000040,
#00000030,
#00000020,
#00000010,
#00000010,
#00000080
);
--callout-rgb: 238, 240, 241;
--callout-border-rgb: 172, 175, 176;
--card-rgb: 180, 185, 188;
--card-border-rgb: 131, 134, 135;
}
@media (prefers-color-scheme: dark) {
:root {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
--primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
--secondary-glow: linear-gradient(
to bottom right,
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0.3)
);
--tile-start-rgb: 2, 13, 46;
--tile-end-rgb: 2, 5, 19;
--tile-border: conic-gradient(
#ffffff80,
#ffffff40,
#ffffff30,
#ffffff20,
#ffffff10,
#ffffff10,
#ffffff80
);
--callout-rgb: 20, 20, 20;
--callout-border-rgb: 108, 108, 108;
--card-rgb: 100, 100, 100;
--card-border-rgb: 200, 200, 200;
}
}
* {
box-sizing: border-box;
}
html,
body {
max-width: 100vw;
overflow-x: hidden;
}
body {
color: rgb(var(--foreground-rgb));
background: linear-gradient(
to bottom,
transparent,
rgb(var(--background-end-rgb))
)
rgb(var(--background-start-rgb));
}
@media (prefers-color-scheme: dark) {
html {
color-scheme: dark;
}
}

14
src/app/layout.js Normal file
View File

@ -0,0 +1,14 @@
import './globals.css'
export const metadata = {
title: 'Monty Taylor',
description: "Monty Taylor's Tech Resume",
}
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}

25
src/app/page.js Normal file
View File

@ -0,0 +1,25 @@
import CssBaseline from '@mui/material/CssBaseline'
import Container from '@mui/material/Container'
import Box from '@mui/material/Box'
import styles from './page.module.css'
// Let's fix the styles later
import './resume.html/mordred.css'
export default function Home() {
return (
<>
<CssBaseline />
<Container maxWidth="xl">
<div className="jumbotron">
<h1>Monty Taylor</h1>
</div>
<Box>Things you may or may not care or not care about.</Box>
<Box>
It should be obvious, but I may be reworking what is going on here.
</Box>
</Container>
</>
)
}

232
src/app/page.module.css Normal file
View File

@ -0,0 +1,232 @@
.main {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
padding: 6rem;
min-height: 100vh;
}
.description {
display: inherit;
justify-content: inherit;
align-items: inherit;
font-size: 0.85rem;
max-width: var(--max-width);
width: 100%;
z-index: 2;
font-family: var(--font-mono);
}
.description a {
display: flex;
justify-content: center;
align-items: center;
gap: 0.5rem;
}
.description p {
position: relative;
margin: 0;
padding: 1rem;
background-color: rgba(var(--callout-rgb), 0.5);
border: 1px solid rgba(var(--callout-border-rgb), 0.3);
border-radius: var(--border-radius);
}
.code {
font-weight: 700;
font-family: var(--font-mono);
}
.grid {
display: grid;
grid-template-columns: repeat(4, minmax(25%, auto));
max-width: 100%;
width: var(--max-width);
}
.card {
padding: 1rem 1.2rem;
border-radius: var(--border-radius);
background: rgba(var(--card-rgb), 0);
border: 1px solid rgba(var(--card-border-rgb), 0);
transition:
background 200ms,
border 200ms;
}
.card span {
display: inline-block;
transition: transform 200ms;
}
.card h2 {
font-weight: 600;
margin-bottom: 0.7rem;
}
.card p {
margin: 0;
opacity: 0.6;
font-size: 0.9rem;
line-height: 1.5;
max-width: 30ch;
text-wrap: balance;
}
.center {
display: flex;
justify-content: center;
align-items: center;
position: relative;
padding: 4rem 0;
}
.center::before {
background: var(--secondary-glow);
border-radius: 50%;
width: 480px;
height: 360px;
margin-left: -400px;
}
.center::after {
background: var(--primary-glow);
width: 240px;
height: 180px;
z-index: -1;
}
.center::before,
.center::after {
content: '';
left: 50%;
position: absolute;
filter: blur(45px);
transform: translateZ(0);
}
.logo {
position: relative;
}
/* Enable hover only on non-touch devices */
@media (hover: hover) and (pointer: fine) {
.card:hover {
background: rgba(var(--card-rgb), 0.1);
border: 1px solid rgba(var(--card-border-rgb), 0.15);
}
.card:hover span {
transform: translateX(4px);
}
}
@media (prefers-reduced-motion) {
.card:hover span {
transform: none;
}
}
/* Mobile */
@media (max-width: 700px) {
.content {
padding: 4rem;
}
.grid {
grid-template-columns: 1fr;
margin-bottom: 120px;
max-width: 320px;
text-align: center;
}
.card {
padding: 1rem 2.5rem;
}
.card h2 {
margin-bottom: 0.5rem;
}
.center {
padding: 8rem 0 6rem;
}
.center::before {
transform: none;
height: 300px;
}
.description {
font-size: 0.8rem;
}
.description a {
padding: 1rem;
}
.description p,
.description div {
display: flex;
justify-content: center;
position: fixed;
width: 100%;
}
.description p {
align-items: center;
inset: 0 0 auto;
padding: 2rem 1rem 1.4rem;
border-radius: 0;
border: none;
border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
background: linear-gradient(
to bottom,
rgba(var(--background-start-rgb), 1),
rgba(var(--callout-rgb), 0.5)
);
background-clip: padding-box;
backdrop-filter: blur(24px);
}
.description div {
align-items: flex-end;
pointer-events: none;
inset: auto 0 0;
padding: 2rem;
height: 200px;
background: linear-gradient(
to bottom,
transparent 0%,
rgb(var(--background-end-rgb)) 40%
);
z-index: 1;
}
}
/* Tablet and Smaller Desktop */
@media (min-width: 701px) and (max-width: 1120px) {
.grid {
grid-template-columns: repeat(2, 50%);
}
}
@media (prefers-color-scheme: dark) {
.vercelLogo {
filter: invert(1);
}
.logo {
filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
}
}
@keyframes rotate {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0deg);
}
}

View File

@ -1,3 +1,5 @@
@import url('https://cdn.jsdelivr.net/npm/hack-font@3/build/web/hack-subset.css');
.browsehappy {
margin: 0.2em 0;
background: #ccc;
@ -5,10 +7,11 @@
padding: 0.2em 0;
}
/* Space out content a bit */
/* Space out content a bit
body {
padding-bottom: 20px;
}
*/
/* Everything but the jumbotron gets side spacing for mobile first views */
.header,
@ -23,7 +26,7 @@ body {
border-bottom: 1px solid #e5e5e5;
}
/* Make the masthead heading the same height as the navigation */
/* Make the masthead heading the same height as the navigation */
.header h3 {
margin-top: 0;
margin-bottom: 0;
@ -42,11 +45,20 @@ body {
margin: 30px 0;
}
a {
color: #337ab7;
text-decoration: none;
}
/* Main marketing message and sign up button */
.jumbotron {
text-align: center;
border-bottom: 1px solid #e5e5e5;
font-family: "Hack", monospace;
font-family: 'Hack', monospace;
background-color: #eee;
padding-top: 32px;
padding-bottom: 32px;
margin-bottom: 12px;
}
.jumbotron .btn {
@ -54,24 +66,28 @@ body {
padding: 14px 24px;
}
.jumbotron h1 {
margin-top: 20px;
margin-bottom: 10px;
font-size: 62px;
}
/* Supporting marketing content */
.marketing {
margin: 40px 0;
}
.markerting > p + h4 {
margin-top: 28px;
}
margin-top: 28px;
}
@media print {
.footer {
display: none;
}
.breadcrumbs {
display: none;
}
.footer {
display: none;
}
.breadcrumbs {
display: none;
}
}
/* Responsive: Portrait tablets and up */
@ -95,39 +111,55 @@ body {
}
h3.resumesection {
background-color: #999999;
font-family: "Hack", monospace;
color: #FFFFFF;
font-size: 14px;
text-align: center;
margin-bottom: 6px;
background-color: #999999;
font-family: 'Hack', monospace;
color: #ffffff;
font-size: 16px;
text-align: center;
margin-bottom: 6px;
}
h3.subsection {
background-color: #eee;
font-family: 'Hack', monospace;
font-size: 14px;
text-align: center;
margin-bottom: 6px;
}
.job ul li {
line-height: 12pt;
font-size: 10pt;
}
#porthead {
padding-left: 8px;
padding-top: 6px;
#porthead {
padding-left: 8px;
padding-top: 6px;
}
.titletitle {
padding-left: 6px;
padding-right: 6px;
}
p {
margin: 0 0 10px;
}
.techskills {
padding-left: 6px;
font-size: 12pt;
}
.summary {
padding-left: 6px;
margin-bottom: 12px;
font-size: 12pt;
border-bottom: 1px solid #e5e5e5;
}
.job {
font-size:14pt;
font-size: 14pt;
padding-left: 6px;
margin-bottom: 0px;
padding-bottom: 0px;
}
.jobtitle {
font-size: 12pt;
margin-top: 0px; padding-top: 0px;
margin-top: 0px;
padding-top: 0px;
margin-bottom: 10px;
margin-left: 10px;
}
@ -135,7 +167,8 @@ h3.resumesection {
.jobskillslist {
font-size: 8pt;
font-style: italic;
margin-top: -12px; padding-top: 0px;
margin-top: -12px;
padding-top: 0px;
margin-bottom: 10px;
margin-left: 10px;
}

853
src/app/resume.html/page.js Normal file
View File

@ -0,0 +1,853 @@
import CssBaseline from '@mui/material/CssBaseline'
import Container from '@mui/material/Container'
import Box from '@mui/material/Box'
import './mordred.css'
export default function Resume() {
return (
<>
<CssBaseline />
<Container maxWidth="xl">
<div className="jumbotron">
<h1>Monty Taylor</h1>
<ul className="lead">
<li>+1 206 471 3749 </li>
<li>mordred@inaugust.com </li>
<li>
<a href="https://matrix.to/#/@mordred:waterwanders.com">
@mordred:waterwanders.com
</a>{' '}
</li>
<li>
<a href="https://keybase.io/mordred">keybase.io/mordred</a>{' '}
</li>
</ul>
</div>
<div className="techskills">
SRE, Open Source Executive, and Free Software Hacker. Expert in Cloud
Computing, Large Scale Systems, CI/CD.
</div>
<h3 className="resumesection">
<span className="titletitle">Links and Media</span>
</h3>
<div className="techskills">
<a href="https://en.wikipedia.org/wiki/Monty_Taylor">
Wikipedia: Monty_Taylor
</a>
</div>
<div className="techskills">
<a href="http://www.businessinsider.com/most-important-people-in-cloud-computing-2014-4#no-22-hps-monty-taylor-changing-how-big-companies-build-clouds-18">
Infoworld: The 39 Most Important People in Cloud Computing
</a>
</div>
<div className="techskills">
<a href="https://www.wired.com/2013/04/new-hackers-taylor">
Wired: Why Open Source Software is like Burning Man (only better)
</a>
</div>
<div className="techskills">
<a href="https://medium.com/@Jay_Jamison/that-kind-of-blew-my-mind-aka-missing-monty-taylor-dfba9594310f#.wu7a5zyu8">
Jay Jamison: The kind of blew my mind
</a>
</div>
<h3 className="resumesection">
<span className="titletitle">Work History</span>
</h3>
<div className="techskills">
<div className="job">
<p>Oracle</p>
<p className="jobtitle">Architect, OCI Substrate: Seattle, WA</p>
<p className="jobskillslist">2020-present</p>
<ul>
<li>
Architect responsible for the Substrate, the underlying
infrastructure on top of which OCI is deployed.
</li>
<li>
Designed and implemented both processes and systems for managing
the intersection of the capacity needed by service teams and the
hardware BOM ordered for standing up new regions.
</li>
<li>
Drove multiple programs related to shrinking a cloud designed
for hyperscale into ever smaller physical footprints.
</li>
<li>
Coordinated activities on behalf of the Compute Organization
related to modernizing deployment automation.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">OpenStack</span>
<span className="titledate">2010-2020</span>
</h3>
<div className="summary">
By the time I left in 2020, OpenStack was one of the fastest-growing
open-source communities in the world. It was forecast to have a
global market revenue of $5.63 billion USD in 2020 and $6.73 billion
USD in 2021. As one of the project founders I wore enumerable hats,
including but not limited to working in leadership positions for
several of the corporations involved in the 501(c)6 non-profit
Foundation that acts as caretaker of the project, in technical
leadership positions within the open source project, and on the
Board of Directors of the Foundation.
</div>
<div className="job">
<p>Red Hat</p>
<p className="jobtitle">
Member of Technical Staff, Office of the CTO: Remote
</p>
<p className="jobskillslist">2016-2020</p>
<ul>
<li>
Drove strategy related to CI/CD for the Ansible ecosystem.
</li>
<li>Led development team focused on developing Zuul.</li>
<li>Participated in the SRE responsibilities for OpenDev.</li>
<li>
Coordinated with Ansible organization on product related efforts
around Zuul.
</li>
</ul>
</div>
<div className="job">
<p>IBM</p>
<p className="jobtitle">
Distinguished Engineer / Director of Engineering
</p>
<p className="jobskillslist">2015-2016</p>
<ul>
<li>
Led OpenStack Innovation team focused on CI/CD and scaling of
OpenStack for Public Cloud.
</li>
<li>Led development team focused on developing Zuul.</li>
<li>Participated in the SRE responsibilities for OpenDev.</li>
</ul>
</div>
<div className="job">
<p>Hewlett-Packard</p>
<p className="jobtitle">
Distinguished Technologist / Director of Engineering
</p>
<p className="jobskillslist">2011-2015</p>
<ul>
<li>
Staffed and led the OpenDev SRE team. Grew community consensus
of the need for broader staffing and succeeded in achieving
divestiture of the team from being a single-company team.
</li>
<li>
Led teams focused on CI and CD of OpenStack for both Public and
Private cloud products
</li>
<li>
Managed coopetition between hundreds of competing and
collaborating companies, both directly in the form of influence
and interpersonal relationships, and through implementation of
systems to ensure level playing fields.
</li>
<li>
Grew two separate teams in parallel, one internal and one
external. Each went from 2 to ~50 over a two year period.
</li>
<li>
Drove partnerships and customer engagements related to OpenStack
externally. Represented OpenStack internally to engineering
organizations across Business Units.
</li>
<li>
Staffed for and achieved technical leadership and recognition
for HP in OpenStack. Based on C-Suite requests housed over half
of the OpenStack Technical Committee and several Projet Team
Leads within my team. Drove HP to be the top overall contributor
to OpenStack.
</li>
<li>
Oversaw the creation of TripleO, which was the basis of HP
Helion and is now the foundation of Red Hat's RHSOP OpenStack
product line.
</li>
<li>Oversaw the creation of Ironic and Bifrost.</li>
<li>Oversaw the creation of Zuul.</li>
<li>Oversaw the stabalization of Keystone.</li>
</ul>
</div>
<div className="job">
<p>Rackspace Cloud</p>
<p className="jobtitle">System Architect: Remote</p>
<p className="jobskillslist">2010-2011</p>
<ul>
<li>
Helped start the OpenStack project (see creation line on
<a href="https://launchpad.net/openstack">
https://launchpad.net/openstack
</a>
, it's a fun bit of history).
</li>
<li>
Designed and implemented the development process and the systems
to support it. Instituted the concept of "gated commits" where
code only landed if if was code reviewed and all automated tests
passed. Under this system, from Day Zero of the project, no
developer had, or has ever had, direct push access.
</li>
<li>
Founded the SRE function responsible for running all of the
tooling and systems needed to support the OpenStack project.
</li>
<li>
Laid ground work for scaling the developer ecosystem from ~40
developers to this high water mark of 2500 in any given six
month period.
</li>
<li>
Coordinated with varying and competing interests from teams at
Rackspace, NASA and Canonical.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">Open Source</span>
</h3>
<div className="summary">
As Open Source has taken over the industry, work directly on
constituent projects and associated non-profit organizations has
become paramount.
</div>
<div className="job">
<p>OpenStack Foundation Board of Directors</p>
<p className="jobtitle">Individual Member</p>
<p className="jobskillslist">2012-2016,2018-2020</p>
<ul>
<li>
Oversaw business, legal, product and branding concerns
representing the Individual Members of the Foundation.
</li>
</ul>
</div>
<div className="job">
<p>
<a href="https://opendev.org">OpenDev</a>
</p>
<p className="jobtitle">Founder, SRE, Core Team Member</p>
<p className="jobskillslist">2010-present</p>
<ul>
<li>
Founded OpenDev, which started as the OpenStack Infrastructure
team. Responsible for development, operation and scaling of all
of the support systems for the development of the OpenStack
project.
</li>
<li>
Provided initial product management. Expanded that role to be a
collaboratively driven group product vision.
</li>
<li>
Built and operated world's largest Open Source CI
infrastructure, supporting 2500 developers world wide, landing
10k changes per month and consuming approximately 20k cloud
servers per day.
</li>
<li>
Oversaw the creation of Zuul, Nodepool, Storyboard, git-review,
pbr, elastic-recheck and countless other systems
</li>
<li>
Wrote shade library, which became openstacksdk, to drive
multi-cloud interoperability and orchestration issues found in
production.
</li>
<li>
Ansible core contributor and owner of OpenStack and Puppet
modules
</li>
</ul>
</div>
<div className="job">
<p>
<a href="https://zuul-ci.org">Zuul</a>
</p>
<p className="jobtitle">Co-founder, Maintainer</p>
<p className="jobskillslist">2012-present</p>
<ul>
<li>Co-founder of Zuul, a project gating system.</li>
<li>
Oversaw product development and project growth, including
corporate resource sponsorship.
</li>
<li>
Provided technical marketing worldwide via conference
interactions.
</li>
</ul>
</div>
<div className="job">
<p>
<a href="https://www.python.org/psf/members/#fellows">
Python Software Foundation
</a>
</p>
<p className="jobtitle">Fellow</p>
<p className="jobskillslist">2012-present</p>
</div>
<div className="job">
<p>OpenStack Technical Committee Member</p>
<p className="jobskillslist">2012-2017</p>
<ul>
<li>Oversaw technical governance of the OpenStack project.</li>
<li>
Grew project and organization from 50 to 2500 contributors.
</li>
</ul>
</div>
<div className="job">
<p>OpenStack Project Policy Board Member</p>
<p className="jobskillslist">2011-2012</p>
<ul>
<li>
Oversaw overall governance of OpenStack in the days before the
Foundation was established.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">Non-profit</span>
</h3>
<div className="job">
<p>
<a href="https://nolakittenfoster.org/">Nola Kitten Foster</a>
</p>
<p className="jobtitle">
Founder, Vice-President, Secretary: New Orleans, LA
</p>
<p className="jobskillslist">2020-present</p>
<ul>
<li>
Founded a non-profit New Orleans based foster nursery for young
kittens. Work with local animal shelters as well as TNR
programs.
</li>
</ul>
</div>
<div className="job">
<p>NYU</p>
<p className="jobtitle">Adjunct Professor, ITP: New York, NY</p>
<p className="jobskillslist">2016</p>
<ul>
<li>
Taught course on "Lighting Without the Board" - focusing on
custom programmatic control of lighting and overview of lighting
design.
</li>
<li>Guest lectures on Privacy in the Digitial Age.</li>
</ul>
</div>
<div className="job">
<p>Camp Pot Luck</p>
<p className="jobtitle">Founder, General Manager</p>
<p className="jobskillslist">2010-2014</p>
<ul>
<li>
Started and ran a Burning Man Theme Camp focused on feeding
people.
</li>
<li>Provided dinners for roughly 150 people per day.</li>
<li>
Managed budget and infrastructure needs, such as fresh and grey
water, electrical, structural, kitchen creation, plumbing and
camp membership.
</li>
</ul>
</div>
<div className="job">
<p>The Satori Group</p>
<p className="jobtitle">Company Member</p>
<p className="jobskillslist">2009-2011</p>
<ul>
<li>
Member of collaborative theatre ensemble focused on
consensus-oriented new work generation. If this seems irrelevant
on a tech resume, please note the time period, and then the time
period where we founded OpenStack on a system of leaderless
group consensus.
</li>
<li>
Designed and implemented electrical refit of company space to
create a general purpose performance venue.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">The MySQL Years</span>
<span className="titledate">2005-2010</span>
</h3>
<div className="summary">
Working at MySQL was the first (but not last) time I was part of the
largest Open Source acquisition in history. As the world's most
popular Open Source database, our clients included basically
everyone. After the Sun acquisition we were allowed to fork the
primary product and work on re-thinking the internals, because Sun.
</div>
<div className="job">
<p>Rackspace</p>
<p className="jobtitle">System Architect: Remote</p>
<p className="jobskillslist">
C++, Python, Drizzle, Linux, OSX, Solaris
</p>
<ul>
<li>
Core developer on{' '}
<a href="http://launchpad.net/drizzle">Drizzle</a>: a modern
fork of MySQL for the Cloud
</li>
<li>Wrangled Drizzle build and plugin sub-systems.</li>
<li>
Managed and owned Drizzle coding standards and C++
standardization.
</li>
<li>
Authored{' '}
<a href="http://launchpad.net/pandora-build">pandora-build</a> -
A set of simple and robust autotools macros.
</li>
<li>Worked on Bazaar and Rackspace Cloud plugins for Hudson</li>
</ul>
</div>
<div className="job">
<p>Sun Microsystems</p>
<p className="jobtitle">Staff Engineer: Remote (Seattle, WA)</p>
<p className="jobskillslist">
C++, Drizzle, MySQL, Linux, OSX, Solaris
</p>
<ul>
<li>
Core developer on{' '}
<a href="http://launchpad.net/drizzle">Drizzle</a>: a modern
fork of MySQL for the Cloud
</li>
<li>Wrangled Drizzle build and plugin sub-systems.</li>
<li>
Managed and owned Drizzle coding standards and C++
standardization.
</li>
<li>Drizzle "Captain" - primary community code liason.</li>
<li>
Authored{' '}
<a href="http://launchpad.net/pandora-build">pandora-build</a> -
A set of simple and robust autotools macros.
</li>
<li>
Authored{' '}
<a href="http://launchpad.net/drizzle-interface">
drizzle-interface
</a>{' '}
- Bindings to libdrizzle.
</li>
<li>
Authored{' '}
<a href="http://launchpad.net/gearman-interface">
gearman-interface
</a>{' '}
- Bindings to libgearman.
</li>
</ul>
</div>
<div className="job">
<p>MySQL</p>
<p className="jobtitle">
Senior Consultant: Remote (Seattle, WA / Stockholm, Sweden)
</p>
<p className="jobskillslist">
MySQL, MySQL Cluster, Heartbeat, DRBD, Linux, C++, C#, Python,
Java, PHP, Ruby
</p>
<ul>
<li>
Solutions Architect for top 10 web properties, telcos and gaming
companies.
</li>
<li>Expert in High Availability and Clustering Solutions.</li>
<li>
Authored{' '}
<a href="http://launchpad.net/ndb-bindings">NDB/Bindings</a> -
Wrappers for MySQL Cluster NDB API in Java, Python, Ruby, C#,
Perl and Lua.
</li>
<li>Member of the MySQL Debian Packaging team.</li>
<li>
Technical owner of MySQL/Linbit relationship related to DRBD.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">Startups</span>
<span className="titledate">1999-2011</span>
</h3>
<div className="job">
<p>Import Brasileira, LLC</p>
<p className="jobtitle">Founder: Seattle, WA</p>
<ul>
<li>Imported high quality Brazilian Cachaça.</li>
<li>
Won double-gold at the 2011 San Francisco International Spirits
Competition.
</li>
</ul>
</div>
<div className="job">
<p>StageFiles</p>
<p className="jobtitle">Founder / Partner: Remote</p>
<p className="jobskillslist">
Plone, Python, mod_python, TurboGears, Debian/Ubuntu GNU/Linux
</p>
<ul>
<li>Started, ran and managed company.</li>
<li>
Designed and developed a web-based portfolio system for
Theatrical Design.
</li>
</ul>
</div>
<div className="job">
<p>In August Productions</p>
<p className="jobtitle">Founder, CEO</p>
<p className="jobskillslist">
Python, Zope, elisp, LaTeX, exim, ZODB, GTK, Glade, Cyrus, SASL,
SquirrelMail, Apache, Debian GNU/Linux, Debian Packaging
</p>
<ul>
<li>
Started and managed small business concerns, including hiring,
payroll and billing.
</li>
<li>
Designed an extensible theatrical lighting control system.
</li>
<li>Wrote a typesetting system for theatre scripts.</li>
<li>Co-developed automated email and web hosting system.</li>
<em>Clients included:</em>
<div className="job">
<p>Washington Mutual: Seattle, WA</p>
<p className="jobskillslist">
C#, Python, LaTeX, Python, Subversion, Apache2, Tomcat,
Solaris, Windows XP
</p>
<ul>
<li>
Developed LaTeX based reporting solution for Loan Prepayment
Modeling. Yes, someone paid me to work on LaTeX!
</li>
<li>
Provided system support including administration and system
design.
</li>
</ul>
</div>
<div className="job">
<p>Monster.com: Boston, MA</p>
<p className="jobskillslist">
Zope, Python, DTML, C#, SQL Server, Perforce, Windows 2000
</p>
<ul>
<li>
Took over a Zope-based system for managing Job Content
written by external contractors who had left.
</li>
<li>
Single point of contact for Zope related issues for the
organization.
</li>
</ul>
</div>
<div className="job">
<p>Tahinis Mediterranean Bistro, Bar Harbor, ME: Remote</p>
<p className="jobskillslist">
Plone, Python, Javascript, CSS, Debian GNU/Linux
</p>
<ul>
<li>Created an Online menu system for restaurants.</li>
<li>
Completely missed the now obvious opportunity to have become
Seamless or DoorDash.
</li>
</ul>
</div>
<div className="job">
<p>North Carolina State University: Remote</p>
<p className="jobskillslist">
Zope, Python, mod-perl, Javascript, CSS, Apache, Debian
GNU/Linux, Solaris
</p>
<ul>
<li>
Created a system to help students write better lab reports.
</li>
<li>
Created a system to protect copywritten works used in course
materials.
</li>
<li>
Worked on web-based system to translate Western Characters
into Hindi.
</li>
</ul>
</div>
<div className="job">
<p>Cox Interactive Media: Atlanta, GA</p>
<p className="jobskillslist">
Zope, Python, Oracle, PL/SQL, Java, Solaris
</p>
<ul>
<li>
Implemented a Content Management System in a combination of
Zope and Java Stored Procedures.
</li>
<li>
Marvelled at the fact that it took 3 solid days to install
Oracle. sssh, don't let Oracle hear me say that!
</li>
</ul>
</div>
<div className="job">
<p>Thingamy: Oslo, Norway</p>
<p className="jobskillslist">Python</p>
<ul>
<li>
Wrote a tool to migrate data from legacy database to ZODB.
</li>
</ul>
</div>
<div className="job">
<p>Alexander Consulting: London, England</p>
<p className="jobskillslist">Zope</p>
<ul>
<li>Provided solution assessment for proposed CRM System.</li>
</ul>
</div>
<div className="job">
<p>iuveno: Ingolstadt, Germany</p>
<p className="jobskillslist">
Zope, Python, LDAP, IMAP, SuSE GNU/Linux, ZEO
</p>
<ul>
<li>
Worked on a web-based CRM system that interfaced Palm
Pilots.
</li>
</ul>
</div>
<div className="job">
<p>MTNI: Atlanta, GA</p>
<p className="jobskillslist">Python</p>
<ul>
<li>
Developed a Python library implementation of RFC 1861 -
SNPP.
</li>
</ul>
</div>
</ul>
<div className="job">
<p>HRSmart</p>
<p className="jobtitle">
Senior System Administrator: Dallas, TX
</p>
<p className="jobskillslist">
Apache, MySQL, Debian GNU/Linux, dirvish, Exim, Debian Packaging
</p>
<ul>
<li>
Administered Debian GNU/Linux, Apache and MySQL servers.
</li>
</ul>
</div>
<div className="job">
<p>Information Innovation</p>
<p className="jobtitle">
Information Artist / Lead Developer: Amsterdam, The Netherlands
</p>
<p className="jobskillslist">
Perl, MySQL, Apache, Zope, Python, RedHat GNU/Linux, Solaris,
MacOS X
</p>
<ul>
<li>
Led development efforts for web-based strategic intelligence
product.
</li>
<li>
Designed and developed Internet news-feed reading and
processing system. 20 years before AI/ML. As a set of Perl
scripts. Because 1999.
</li>
<li>
Architected internal company systems for messaging and
Intranet.
</li>
</ul>
</div>
<h3 className="subsection">
<span className="titletitle">Pre-Y2K Enterprise</span>
<span className="titledate">1995-1999</span>
</h3>
<div className="job">
<p>Branch Bank and Trust</p>
<p className="jobtitle">
Enterprise Management Systems Analyst: Wilson, NC
</p>
<p className="jobskillslist">
Tivoli, Perl, ksh, AIX, Windows, Samba
</p>
<ul>
<li>
Wrote and maintained Perl and shell scripts for Tivoli system
automation.
</li>
<li>
Used Samba to automate bootstrapping of Tivoli Endpoind
systems in remote bank branch locations on Windows
workstations from an AIX box. If you want a really fun story,
ask me about this one.
</li>
</ul>
</div>
<div className="job">
<p>Best Consulting: Group Health Cooperative</p>
<p className="jobtitle">Consultant: Seattle, WA</p>
<p className="jobskillslist">
Perl, ksh, Sybase, T-SQL, Stored Procedures, Solaris
</p>
<ul>
<li>
Wrote code to update and manage Data Warehouse Common
Dimensions tables.
</li>
<li>
Used Perl Typeglobs that I could not possibly read today to
build a SQL generation system. One should never use Typeglobs,
except for the times when one should. Although I cannot
justify it today, I was able to successfully defend the use to
Mark-Jason Dominus on the first Perl Whirl Geek Cruise, so I
feel confident today that 1998 me wasn't completely off his
rocker.
</li>
<li>Understood enough Perl to know how to use Typeglobs.</li>
</ul>
</div>
<div className="job">
<p>EDS: Russell Stover Candies, Kansas City, MO</p>
<p className="jobtitle">Information Analyst</p>
<p className="jobskillslist">Perl, ksh, Sybase, T-SQL, AIX</p>
<ul>
<li>
Administered systems and performed DBA tasks supporting a 24x7
manufacturing and candy shipping environment.
</li>
<li>
Implemented a full GNU distribution in SMIT packages on to of
AIX.
</li>
<li>
Implemented a fully automated provisioning system for
installing and managing a fleet of AIX systems in remote
warehouse and factory locations. Today you might consider this
config managment.
</li>
<li>
Maintained an inherited barcode scanning system that involved
RF scanner guns running DOS, that telnetted to an AIX box
running a curses menu application that fed data into a 4G
database running on a Windows NT server. Remotely.
</li>
<li>
Was promised unlimited candy during interview, only to arrive
on first day to discover that the floor of geeks had eaten too
much candy and the policy had been revoked.
</li>
</ul>
</div>
<div className="job">
<p>Fujitsu Network Communications, Dallas, TX</p>
<p className="jobtitle">UNIX Admin/Support</p>
<p className="jobskillslist">AIX, C, Framemaker SDK, ksh</p>
<ul>
<li>
Provided system and user support for Desktop AIX systems used
by the tech writing team.
</li>
</ul>
</div>
<div className="job">
<p>IBM, Raleigh, NC</p>
<p className="jobtitle">UNIX Admin/Support</p>
<p className="jobskillslist">MVS, AIX, C, ksh</p>
<ul>
<li>
Provided system administration and AIX support for the TCP
Performance Testing on MVS.
</li>
</ul>
</div>
</div>
</div>
</Container>
</>
)
}

View File

@ -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.
Its 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>

10562
yarn.lock

File diff suppressed because it is too large Load Diff