setmetatable({resume=[=[
US Cell: (669) 260-0953
GitHub: http://github.com/gvvaughan
Email: gary@vaughan.pe, gary@gnu.org
Citizenship: British
US Residence: Cupertino, CA 95014
I am not actively seeking new positions right now, but I'm always open to learn about new and interesting opportunities to exercise and deepen my engineering and programming skills, and work together with smart ambitious people on exciting projects.
My career has been built around **Software Build Tools**, **Compilers** and **Software Portability**, more recently leaning towards **DevOps**, **CI** & **CD**, as well as modernizing and improving the architecture of legacy code. Additionally I have enjoyed spending a lot of my spare time writing, maintaining and contributing to **Free Software** so far as work allows. I'm especially interested in **BDD** and **Functional Style Programming** as demonstrated by many of my GitHub projects listed below, but I always like learning more about algorithms, data structures and programming languages.
Before earning permanent residency of the USA for my current role, I spent a decade as a perpetual traveler, working remotely while moving from country to country each time a tourist visa expired, completing three and a half circuits of the planet so far.
_1 Infinite Loop, Cupertino, CA 95014 T: (408) 996 1010_
Maintaining **Jenkins** continuous integration processes for _Xcode_, **clang** and **swiftlang** delivering multiple internal daily releases; regression testing of compilers, SDKs and IDE by managing automated builds and installs all of macOS, iOS, tvOS and watchOS on multiple devices. Development and maintenance of novel software automations in **Python** and **Bash**.
_986 W. Lake St. Suite 108, Roselle, IL 60172 T: +1 800 372 7476_
Infrastructure, implementation, integration and packaging of ~1400 Free Software applications and libraries for current and legacy commercial Unix operating systems including **AIX**, **HPUX**, **IRIX**, **Linux**, **Solaris** and **Tru64 Unix** - each using the native compiler toolchains and packaging tools. "Redhat for mainframe computers"
_New Millennium Investments Inc, Mahe, Seychelles T: +61 8 94675745_
Managing the entire public facing side of this small company, along with new media advertising. Developing and testing **high-frequency trading algorithms** for commodities and forex trading 'bots.
_(No longer in business)_
Wrote and delivered a **30 hour course** on **GNU/Linux** forensics and the **GNU compiler tool-chain**.
_Malvern Technology Centre, St Andrews Road, Malvern, UK T: +44 1684 894000_
Received developed security vetting for **UK DV Clearance**, and additional codeword security clearances for above top-secret military projects.
Research papers and prototypes in **Python**, primarily for data management and security.
Since moved to: _Porton Down, Salisbury, Wiltshire, UK T: +44 1980 613121_
Received **UK SC Clearance**.
Maintaining and enhancing systems for fusion, plotting and geospatial visualisation of classified SIGINT (Signals Intelligence) data in **C** and **C++**.
_(Since acquired by CGI-group UK, and formerly Aethos Communications Ltd.)_
Network and Telecoms Application Development on **HPUX**.
Since renamed: _G4S, Alexandra Way, Ashchurch, Gloucestershire, UK T: +44 870 4117700_
Authored the _Group 4_ C coding standards documentation to pass their **ISO9001 audit**.
_Buckholt Drive, Warndon, Worcester, UK T: +44 20 33205000_
Rewriting a legacy document editor and processing system using **Informix RDB** and **C**.
]=]},
{--[[
This HTML page is a Lua quine! You can select all, copy and run through a Lua
interpreter, and then save the regenerated the HTML source (styling and markup
included) where you can look at it again in your browser... and repeat.
It's just a toy though: A better engineered solution for a generalised Markdown
parser would be to build a parse tree from the ASCII source text, and pass
that to a templated HTML generator. ...or get one from LuaRocks! ]]--
__index = {
css = [[
body {background:#fdf6e3; color:#586e75; line-height:1.4;
font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;}
@media screen { body {font-size:14px; margin:auto; width:80%;}
.hide {color:#fdf6e3;} .muted {color:#ddd8d5;}
pre {background:#ddd8d5; border:1px solid #586e75;}
a:hover {background:#ddd8d5; text-decoration:underline;}
}
@media print { body {font-size:12px; margin:3%; width:94%;}
.hide,.muted {display:none;} h4 {page-break-before:always;}
li a:link:after, li a:visited:after {content:" (" attr(href) ") ";
font-size:90%;text-decoration:underline;} }
p, pre {margin-left:2em;}
pre {font-size:12px; padding:0.5em; overflow-x:auto;}
a {color:#268bd2; font-weight:bold; text-decoration:none; outline:0;}
br {line-height:0;} h1,h4 {color:#b58900; font-size:200%;}
h2 {color:#2aa198; margin-top:0;} h3 {color:#859900; margin-top:0;}
]],
-- Ordered maps of match-pattern -> replacement-text.
entities = {{['&']='&'}, {['<']='<'}, {['>']='>'}},
subs = {
{['\n\n'] = '\n</p>\n<p>\n'},
{['<p>%s*(#+)(.-)%s*</p>'] = function(h, s)
return table.concat({#h > 1 and '<br/>' or '',
'<h', tostring(#h), '><span class="muted">',
h, '</span>', s, '</h', tostring(#h), '>'
})
end
},
{['\n *%*%s*(.-)%s*\n'] =
'\n<ul>\n\t<li><span class="hide">* </span>%1</li>\n</ul>\n'},
{['</ul>\n<ul>\n'] = ''},
{['\n ([^\n]+)\n'] = '\n<pre>\n%1\n</pre>\n'},
{['</pre>%s*<pre>\n'] = ' '},
-- 2 spaces will expand twice to preserve 4 space indent for the quine!
{['<pre>\n'] = '<pre>\n '},
{['(%*%*)(.-)%*%*'] = '<span class="muted">%1</span>' ..
'<strong>%2</strong><span class="muted">%1</span>'},
{['(_)(.-)_'] = '<span class="muted">%1</span>' ..
'<em>%2</em><span class="muted">%1</span>'},
{['(`)(.-)`'] = '<span class="muted">%1</span>' ..
'<code>%2</code><span class="muted">%1</span>'},
{['%[(.-)%]%((.-)%)'] = '<a href="%2">%1</a>'},
},
-- A higher order function!
mapsubst = function(self, orderdict, str, f)
for _, item in ipairs(orderdict) do str = f(str, item) end
return str
end,
-- Pattern replacement helpers.
subst = function(self, text)
return self:mapsubst(self.entities, text, function(str, item)
-- Applied once to avoid making nested entity expansions.
return str:gsub(next(item))
end)
end,
render = function(self, text)
return self:mapsubst(self.subs, self:subst(text), function(str, item)
-- Applied twice to find overlapping matches.
return str:gsub(next(item)):gsub(next(item))
end)
end,
},
-- Entry point: slurp and split myself, do substitutions, and output.
__call = function(self)
io.input(arg[0])
print(table.concat({
'<html lang="en">', '<head>', '<title>Gary V. Vaughan</title>',
'<style type="text/css">', self.css, '</style>',
'<link href="prism.css" rel="stylesheet" type="text/css">',
'</head>', '<body>',
'<p class="muted">setmetatable({resume=[=[',
self:render('\n\n' .. self.resume), '<p class="muted">]=]},</p>',
'<pre><code class="language-lua">' ..
self:subst(io.read'*a':gsub('^.-%]=]}, ', ''):gsub('%)%(%)%s*$', '')) ..
'</code></pre>', '<p class="muted">)()</p>',
-- This is cheating, but source code requires syntax highlighting!
'<script src="prism.js"></script>', '</body>', '</html>',
}, '\n'))
end,
}
)()