...
 
Commits (2)
[submodule "pandoc-templates"]
path = pandoc-templates
url = git@github.com:jgm/pandoc-templates.git
MIT License
Copyright (c) 2011-2018 Michael White
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SRC = $(wildcard *.md)
PDFS=$(SRC:.md=.pdf)
HTML=$(SRC:.md=.html)
LATEX_TEMPLATE=./pandoc-templates/default.latex
all: clean $(PDFS) $(HTML)
pdf: clean $(PDFS)
html: clean $(HTML)
%.html: %.md
python resume.py html --no-gravatar < $< | pandoc -t html -c resume.css -o public/index.html
%.pdf: %.md $(LATEX_TEMPLATE)
python resume.py tex < $< | pandoc $(PANDOCARGS) --variable subparagraph --template=$(LATEX_TEMPLATE) -H header.tex -o public/resume.pdf
ifeq ($(OS),Windows_NT)
# on Windows
RM = cmd //C del
else
# on Unix
RM = rm -f
endif
clean:
$(RM) public/*.html public/*.pdf
$(LATEX_TEMPLATE):
git submodule update --init
#!/bin/sh
docker run -it -v ${PWD}:/resume there4/markdown-resume md2resume html -t swissen -o index index.md public
wkhtmltopdf public/index.html public/resume.pdf
\usepackage[top=1in, bottom=1in, left=1in, right=1in]{geometry}
\usepackage{tgpagella}
\ifxetex
\usepackage{xeCJK}
\setCJKmainfont{WenQuanYi Zen Hei}
%\setmainfont[Mapping=tex-text]{TeX Gyre Pagella}
\fi
\usepackage{titlesec}
\titleformat{\section}{\huge\bfseries}{\thesection}{1em}{}
\titlespacing{\section}{0pt}{-2em}{1em}
\titleformat{\subsection}{\large\bfseries\MakeUppercase}{\thesubsection}{1em}{}
%\usepackage{multicol}
\pagestyle{empty}
\hyphenation{Media-Wiki}
\renewcommand{\labelitemi}{}
\renewcommand{\labelitemii}{\raise .5ex\hbox{\tiny$\blacktriangleright$}}
% from http://tex.stackexchange.com/a/29796/16139
\newsavebox{\zerobox}
\newenvironment{nospace}
{\par\edef\theprevdepth{\the\prevdepth}\nointerlineskip
\setbox\zerobox=\vtop to 0pt\bgroup
\hrule height0pt\kern\dimexpr\baselineskip-\topskip\relax
}
{\par\vss\egroup\ht\zerobox=0pt \wd\zerobox=0pt \dp\zerobox=0pt
\box\zerobox}
# Gordyn Hall
## Software Engineer, Security Researcher
> [Download PDF](resume.pdf)
> [gordon@leastauthority.com](gordon@leastauthority.com)
------
### Profile {#profile}
Senior software engineer and security researcher specializing in peer-to-peer
protocols, distributed ledger technology, applied cryptography, and anonymizing
systems. Free software activist and author of
[Kadence](https://kadence.gitlab.io),
[ORC](https://orcproject.gitlab.io),
[Granax](https://allcomputersarebroken.gitlab.io/granax), and
[many others](https://gitlab.com/allcomputersarebroken).
-------
### Technical {#technical}
* Node.js/JavaScript
* Rust
* Python
* C++
* Electron
* Shell
* MongoDB
* LevelDB
* Docker
* Git
------
### Experience {#experience}
Least Authority
: *Security Researcher, Software Engineer*
__2017-Present__
Contributor to the Tahoe-LAFS free software project. Security auditor for
various blockchain and distributed projects.
Chia Network
: *Senior Software Engineer*
__2018__
Research and development of the Chia networking and peer protocol.
Storj Labs
: *Software Engineering Lead*
__2015-2017__
Performed extensive research and testing related to distributed system
design. Key contributer to the Storj whitepaper (version 2). Authored the
Storj protocol and the core library that implements it. Community leadership
support, developer presense and engagement, core maintainer of many free
software packages. Hiring, onboarding, and support of the engineering team.
Evangelism, speaking engagements at LibrePlanet and NodeSummit.
ChangeTip
: *Senior Software Engineer*
__2015__
Developed key components of a social bitcoin micropayments platform.
Coordinated with partners on techincal integrations. Company later acquihired
by AirBnB.
BitPay
: *Software Engineering Lead*
__2013-2015__
Leadership of the engineering team responsible for research and development
projects. Developed critical features for the first bitcoin payment
processing platform for merchants (which is still the leading provider).
Authored and contributed to many free software projects. Speaking engagements
at ConnectJS and Atlanta Node.js Meetups
------
### Advisory
Iagon
: *Technical Advisor*
__2018-Present__
Phantasma
: *Technical Advisor*
__2018-Present__
Verady
: *Technical Advisor*
__2017-Present__
Fluence Labs
: *Technical Advisor*
__2017-Present__
Counterpoint Hackerpace
: *Co-Founder, Director*
__2015-Present__
------
### Footer {#footer}
Gordyn Hall -- [https://gitlab.com/allcomputersarebroken](https://gitlab.com/allcomputersarebroken)
------
Subproject commit 7fed34ab85d9c89b7f17707f7e97b4daa75276fb
This diff is collapsed.
body {
background: url(https://gumdrop.life/bg.gif) center center repeat #000;
color: #f8f8f2;
font-family: Verdana, sans-serif;
}
#container {
margin: auto;
width: 7.5in;
padding: .5in;
background: #000;
opacity: 0.8;
border: 24px solid #f8f8f2;
}
#contact {
float: right;
text-align: right;
}
#contact p {
margin: .5em;
}
img {
padding: 4px;
border: 1px solid #ccc;
background: #fff;
}
a {
text-decoration: none;
color: #ff79c6;
}
a:hover {
text-decoration: underline;
}
h1 {
margin-top: 0;
}
h2 {
margin-top: 0;
}
ul {
list-style-type: none;
}
ul li ul {
list-style-type: disc;
margin-bottom: 2em;
}
li {
margin-top: 0em;
}
ul li ul li {
margin: .5em;
}
No preview for this file type
Gordyn Hall
===========
Software Engineer / Security Researcher
gordy[at]gumdrop.life
Profile
-------
Seasoned software engineer and security researcher specializing in peer-to-peer
protocols, distributed ledger technology, applied cryptography, and anonymizing
systems. Human rights and privacy activist and author of
[ORC](https://orcproject.gitlab.io),
[Kadence](https://kadence.gitlab.io),
[Granax](https://gumdrop.gitlab.io/granax), and
[many others](https://gitlab.com/gumdrop).
Work Experience
---------------
* **Least Authority**
*Security Researcher*, 2017 - Present
- Contributor to the Tahoe-LAFS free software project
- Security auditor for various blockchain and DLT projects
* **Verady**
*Technical Advisor*, 2017 - Present
* **Fluence Labs**
*Technical Advisor*, 2017 - Present
* **Phantasma**
*Technical Advisor*, 2018 - Present
* **Chia Network**
*Senior Software Engineer*, 2018
- Research and development of the Chia networking and peer protocol
* **Storj Labs**
*Lead Engineer*, 2015 - 2017
- Research and testing related to distributed system design
- Key contributer to the Storj whitepaper (version 2)
- Authored the Storj protocol and the core library that implements it
- Community leadership support, developer presense and engagement
- Core maintainer of many free software packages
- Hiring, onboarding, and support of the engineering team
- Evangelism, speaking engagements at LibrePlanet and NodeSummit
* **ChangeTip**
*Senior Software Engineer*, 2015
- Developed key components of a social bitcoin micropayments platform
- Coordinated with partners on techincal integration
* **BitPay**
*Product Development Team Lead*, 2013 - 2015
- Leadership of the engineering team responsible for research and development projects
- Developed critical features for the first bitcoin payment processing platform for merchants
- Authored and contributed to many free software projects
- Speaking engagements at ConnectJS and Atlanta Node.js Meetups
Skills
------
* Node.js/JavaScript
* Rust
* Python
* C++
* MongoDB
* Docker
* Git
# encoding: utf-8
"""
resume.py is a pre-processor for Markdown resumes, targeting the pandoc
document processor.
Pandoc extended Markdown supports embedded HTML (like all compliant Markdown
parser) and a subset of LaTeX, but when outputting LaTeX any unrecognized
LaTeX commands will simply be passed through.
This means you can keep your resume in pure markdown and define pre-processing
functions that do different things with different parts of the input depending
on the target output format.
Currently, the main feature is extraction of contact details. They are
expected to begin on the fourth line, following the header and a blank line,
and extend until the next blank line. Lines with bullets (•) will be split
into separate lines.
Michael White
=============
72 Bower St. #1 • Medford, MA, 02155
617-899-1621
You can then define a function for an output format like this:
def tex(lines, contact_lines, *args):
'''
Returns the pre-processed Markdown output suitable for tex processing,
as a string.
lines -- a list of lines, without the contact lines
contact_lines -- the extracted contact lines
args -- any extra command-line arguments
'''
And finally run it like this:
python resume.py tex < resume.md
"""
import hashlib
import sys
import re
GRAVATAR = "http://www.gravatar.com/avatar/{hash}?s=200"
class Processor(object):
handlers = {}
def register(self, fn):
self.handlers[fn.__name__] = fn
return fn
def process(self, format, lines, contact_lines, *args):
try:
handler = self.handlers[format]
except KeyError:
raise Exception("Unknown format: %s" % format)
return handler(lines, contact_lines, *args)
processor = Processor()
@processor.register
def tex(lines, contact_lines, *args):
def sub(pattern, repl, string, **kwargs):
"""Replacement for re.sub that doesn't replace pattern it's inside the
first latex command argument brackets. Kind of a hack."""
flags = kwargs.pop('flags', 0) | re.X | re.M
num_groups = re.compile(pattern, flags).groups
pattern = r"""
(^|}{) # beginning of line or second argument
([^{}\n\r]*) # disallow { and }
%s
([^{}\n\r]*)
""" % pattern
repl = re.sub(r"\\(\d)",
lambda m: r"\%d" % (int(m.group(1)) + 2), repl)
return re.sub(pattern, r"\1\2%s\%d" % (repl, num_groups + 3), string,
flags=flags, **kwargs)
# pandoc doesn't seem to support markdown inside latex blocks, so we're
# just going to hardcode the two most common link formats for now so people
# can put links in their contact info
def replace_links(line):
line = re.sub(r"<([^:]+@[^:]+?)>", r"\href{mailto:\1}{\1}", line)
line = re.sub(r"<(http.+?)>", r"\url{\1}", line)
line = re.sub(r"<(https.+?)>", r"\url{\1}", line)
return re.sub(r"\[([^\]]+)\]\(([^\)]+)\)", r"\href{\2}{\1}", line)
contact_lines = "\n\n".join(map(replace_links, contact_lines))
# replacements to apply to the text in contact_lines, because it won't be
# processed by pandoc
replace = {
'~': r"\\textasciitilde{}"
}
escape = ['#']
for search in replace:
contact_lines = sub(search, replace[search], contact_lines)
for c in escape:
contact_lines = sub(r'([^\\])\%s' % c, r'\1\%s' % c, contact_lines)
lines.insert(0, "\\begin{nospace}\\begin{flushright}\n\\vspace{-2em}" +
contact_lines +
"\n\\end{flushright}\\end{nospace}\n")
return "".join(lines)
@processor.register
def html(lines, contact_lines, *args):
untex = ['LaTeX']
for word in untex:
# yuck
replace = lambda l: l.replace(r"\%s" % word, word)
lines = list(map(replace, lines))
contact_lines = list(map(replace, contact_lines))
gravatar = None
for line in contact_lines:
if '@' in line and '--no-gravatar' not in args:
gravatar = GRAVATAR.format(
hash=hashlib.md5(line.lower().strip('<>').encode('utf-8')).hexdigest())
break
if gravatar is not None:
contact_lines.insert(0, "<img src='{}' />".format(gravatar))
lines.insert(0, "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><meta http-equiv=\"Content-Style-Type\" content=\"text/css\" /><title></title><style type=\"text/css\">code{white-space: pre;}</style><link rel=\"stylesheet\" href=\"resume.css\" type=\"text/css\" /></head><body><div id='container'><div id='contact'>%s</div>\n" %
("<p>" + "</p><p>".join(contact_lines) + "</p>"))
lines.insert(1, "<div>")
lines.append("</div></body></html>")
return "".join(lines)
def main():
try:
format = sys.argv[1]
except IndexError:
raise Exception("No format specified")
if '-h' in sys.argv or '--help' in sys.argv:
sys.stderr.write(
"Usage: python resume.py tex|html [--no-gravatar] < INPUT.md\n")
raise SystemExit
lines = sys.stdin.readlines()
contact_lines = []
for line in lines[3:]:
lines.remove(line)
parts = [x.strip() for x in line.split("•")]
if parts == ['']:
break
contact_lines.extend(parts)
print(processor.process(format, lines, contact_lines, *sys.argv[1:]))
if __name__ == '__main__':
main()