diff --git a/Makefile b/Makefile index 5d8d9eb..7478d9a 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,18 @@ content := $(wildcard content/*.md themes/even/sass/*.scss themes/even/static/* themes/even/templates/*.html themes/even/templates/categories/*.html themes/even/templates/shortcodes/*.html themes/even/templates/tags/*.html) -build: content/.built +build: content/.built static/pdf/resume-jeremy-wall.pdf all: build deploy content/.built: $(content) - zola build -o public/ + nix-shell -p zola --command "zola build -o public/" touch content/.built +static/pdf/resume-jeremy-wall.pdf: resume/resume.sil resume/resume.lua + mkdir -p static/pdf/ + mkdir -p ~/.local/share/fonts + cp resume/.fonts/* ~/.local/share/fonts/ + nix-shell -p sile --command "sile -o $@ resume/resume.sil" + publish: build cd public gsutil -m rsync -d -r public gs://jeremy.marzhillstudios.com/ diff --git a/resume/.fonts/GentiumBookPlus-Bold.ttf b/resume/.fonts/GentiumBookPlus-Bold.ttf new file mode 100755 index 0000000..c92e6b6 Binary files /dev/null and b/resume/.fonts/GentiumBookPlus-Bold.ttf differ diff --git a/resume/.fonts/GentiumBookPlus-BoldItalic.ttf b/resume/.fonts/GentiumBookPlus-BoldItalic.ttf new file mode 100755 index 0000000..a7b05f2 Binary files /dev/null and b/resume/.fonts/GentiumBookPlus-BoldItalic.ttf differ diff --git a/resume/.fonts/GentiumBookPlus-Italic.ttf b/resume/.fonts/GentiumBookPlus-Italic.ttf new file mode 100755 index 0000000..f6485ee Binary files /dev/null and b/resume/.fonts/GentiumBookPlus-Italic.ttf differ diff --git a/resume/.fonts/GentiumBookPlus-Regular.ttf b/resume/.fonts/GentiumBookPlus-Regular.ttf new file mode 100755 index 0000000..0d3c0ef Binary files /dev/null and b/resume/.fonts/GentiumBookPlus-Regular.ttf differ diff --git a/resume/.fonts/GentiumPlus-Bold.ttf b/resume/.fonts/GentiumPlus-Bold.ttf new file mode 100755 index 0000000..1a8764e Binary files /dev/null and b/resume/.fonts/GentiumPlus-Bold.ttf differ diff --git a/resume/.fonts/GentiumPlus-BoldItalic.ttf b/resume/.fonts/GentiumPlus-BoldItalic.ttf new file mode 100755 index 0000000..64c97b7 Binary files /dev/null and b/resume/.fonts/GentiumPlus-BoldItalic.ttf differ diff --git a/resume/.fonts/GentiumPlus-Italic.ttf b/resume/.fonts/GentiumPlus-Italic.ttf new file mode 100755 index 0000000..ddbcac6 Binary files /dev/null and b/resume/.fonts/GentiumPlus-Italic.ttf differ diff --git a/resume/.fonts/GentiumPlus-Regular.ttf b/resume/.fonts/GentiumPlus-Regular.ttf new file mode 100755 index 0000000..4a35c31 Binary files /dev/null and b/resume/.fonts/GentiumPlus-Regular.ttf differ diff --git a/resume/resume.lua b/resume/resume.lua new file mode 100644 index 0000000..d78e4c0 --- /dev/null +++ b/resume/resume.lua @@ -0,0 +1,151 @@ +-- Copyright 2021 Jeremy Wall +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. + +local plain = SILE.require("plain", "classes") +local resume = plain { id = resume } + +SILE.require("packages/url") +SILE.require("packages/pdf") +SILE.require("packages/rules") + +-- Setup our settings. +SILE.settings.declare({ + parameter = "resume.author", + default = "", + type = "string", + help = "The author of this resume" +}) + +SILE.settings.declare({ + parameter = "resume.email", + default = "", + type = "string", + help = "Resume Author email address", +}) + +SILE.settings.declare({ + parameter = "resume.site", + default = "", + type = "string", + help = "Resume Author website", +}) + +SILE.settings.declare({ + parameter = "resume.keywords", + default = "", + type = "string", + help = "Resume keywords", +}) + +SILE.settings.set("document.parindent", SILE.nodefactory.glue()) + +local simpletable = SILE.require("packages/simpletable") +simpletable.init(SILE.documentState.documentClass, {tableTag = "table", trTag = "tr", tdTag = "td"}) + +resume:declareFrame("content", { + left = "20%pw", + right = "80%pw", + top = "10%ph", + bottom = "10%ph", +}) + +resume.pageTemplate.firstContentFrame = resume.pageTemplate.frames["content"] + +SILE.registerCommand("resume", function(opts, content) + local author = SILE.settings.get("resume.author") + if author == "" then + SILE.warn("resume.author was empty. Author info will be missing.") + else + SILE.call("pdf:metadata", {key="Author", val=author}, "") + end + local keywords = SILE.settings.get("resume.keywords") + if keywords == "" then + SILE.warn("resume.keywords was empty. site keywords will be missing.") + else + SILE.call("pdf:metadata", {key="Keywords", val=keywords}, "") + end + local email = SILE.settings.get("resume.email") + if email == "" then + SILE.warn("resume.email was empty. Email info will be missing.") + end + local site = SILE.settings.get("resume.site") + if site == "" then + SILE.warn("resume.site was empty. site info will be missing.") + end + + SILE.call("section", {}, function() + SILE.typesetter:typeset(author) + end) + + SILE.call("table", {}, function() + SILE.call("tr", {}, function() + SILE.call("td", {}, function() + SILE.call("bold", {}, function() + SILE.typesetter:typeset("Email: ") + end) + end) + SILE.call("td", {}, function() + SILE.call("email", {src=email}) + end) + end) + SILE.call("tr", {}, function() + SILE.call("td", {}, function() + SILE.call("bold", {}, function() + SILE.typesetter:typeset("Site: ") + end) + end) + SILE.call("td", {}, function() + SILE.call("psite") + end) + end) + end) + + SILE.process(content) +end) + +SILE.registerCommand("email", function(opts, content) + if opts["src"] then + SILE.call("href", {src="mailto:" .. opts["src"]}, opts["src"]) + else + SILE.error("src attribute is required") + end +end) + +SILE.registerCommand("site", function(opts, content) + if opts["src"] then + SILE.call("href", {src="https://" .. opts["src"]}, opts["src"]) + end +end) + +SILE.registerCommand("psite", function(opts, content) + local site = SILE.settings.get("resume.site") + if site == "" then + SILE.warn("resume.site was empty. site info will be missing.") + end + SILE.call("site", {src=site}, "") +end) + +-- TODO(jwall): Bullet could be way better than it currently is. +resume.registerCommands = function() + plain.registerCommands() + SILE.doTexlike([[% +\define[command=section]{\font[size=3em]{\process} \bigskip}% +\define[command=subsection]{\bigskip \font[size=2em]{\process} \bigskip}% +\define[command=bold]{\font[style=bold]{\process}}% +\define[command=para]{\process \medskip}% +\define[command=bullet]{* \process}% +]]) +end + +return resume \ No newline at end of file diff --git a/resume/resume.sil b/resume/resume.sil new file mode 100644 index 0000000..46c4c39 --- /dev/null +++ b/resume/resume.sil @@ -0,0 +1,214 @@ +\begin[papersize=letter, class=resume]{document} + +\set[parameter=resume.author, value="Jeremy Wall"] +\set[parameter=resume.site, value="jeremy.marzhillstudios.com"] +\set[parameter=resume.email, value=jeremy@marzhillstudios.com] +\set[parameter=resume.keywords, value="java,javascript,typescript,python,perl,clojure,rust,go,c#,haskell,erlang,programming,resume"] + +\begin{resume} + +\subsection{About Me} + +\para{ +I am a self taught coder with a love for languages and good +design. I've been working in the industry for a little more than 10 +years. I've been learning and coding in the open source community for +far longer than that though. From hacking personal customizations in +\href[src=http://blender.org]{Blender}, to coding my own website, to +writing about various languages and technologies on that site. I've +been an active part of the programming community for more than 20 +years. +} + +\para{ +I'm passionate about the tools used in the craft of software +development. Build systems, Test frameworks, Editors/IDE's all +fascinate me and I'm constantly looking for new ways to streamline and +improve the process of software construction. } + +\subsection{Notable Personal Projects} + +\bullet{UCG a Configuration format compiler at \site[src=github.com/zaphar/ucg]} + +\bullet{Rust ICMP Socket library at +\site[src=github.com/zaphar/icmp_socket]} + +\bullet{Parsing combinator library at +\site[src=github.com/zaphar/abortable_parser]} + +\bullet{Network quality exporter for prometheus at +\site[src=github.com/zaphar/durnitisp]} + +\bullet{Original author of C# support for +\site[src=bazel.io/] at \site[src=github.com/bazelbuild/rules_dotnet]} + +\bullet{One of the only people to provide a pull example for the + libgit2 rust bindings at + \href[src=https://github.com/rust-lang/git2-rs/blob/master/examples/pull.rs]{pull.rs on github}} + +\medskip +\para{You can see the rest of my personal coding projects on +\site[src=github.com/zaphar]}. + +\bigskip +\fullrule +\bigskip \goodbreak + +\section{Employment} + +\subsection{GoHealth, Inc - VP of Engineering 2021 - Present} + + \para{I was promoted to VP of Engineering during my 5th year and helped to drive + processes for technology adoption, security and compliance. My areas of oversight + were our new Customer Retention stack, Shared Services, Tech Support, + and Data Engineering.} + +\subsection{GoHealth, Inc - Principal Engineer 2016 - 2021} + +% Figure out how to indent this entire paragraph + + \para{I joined GoHealth to help them as they moved toward a more agile model + in the SDLC. They were beginning to embrace Continuous Integration and + Continuous Delivery. My responsibilites as Principal Engineer were to:} + + - Mentor other developers + + - Provide technical direction for old and legacy applications + + - Help to form and refine their processes around development, releases and QA. + + - Help to foster a strong engineering culture. + \bigskip + + \para{Shortly after joining GoHealth I also took on the management of a newly + forming SRE team. Helping to bootstrap that team and give guidance on best + practices for managing new and old deployments of applications in the GoHealth + platform. I was also given oversight of the data engineering group around 4 years into my + tenure as a Principal there.} + +\subsection{VAE, Inc. - Senior Architect 2014 - 2016} + + \para{The software stack we used at VAE was C# running on both Mono and + .Net runtimes. It is a suite of network engineering tools used by + Network Engineers and Network Operations to manage and view the + current state of their network. While there I helped to:} + + - Develop software engineering processes. + + - Integrate tooling to ensure software quality. + + - Provide high level design guidance for products. + + - Mentor junior developers. +\bigskip + +\subsection{Google - Software engineer 2008 - 2014} + + \para{I was part of the DoubleClick acquisition by Google and continued working on + the Google Affiliate Network product for the first two years. Wrote most of + the code to migrate our data to Google infrastructure and datastores. + Launched the first integrations with Google systems.} + + \para{I then worked on the Project Hosting product on https://code.google.com/p/. + This product has since been discontinued by Google.} + + \para{After Project hosting I moved into the Web Server team for the + Search Page. I worked on tooling for the templating language and + CSS/Javascript/HTML management. While there I worked on integrating + a CSS compiler for the Templating engine. This support greatly + improved the experience of styling search features and controlling + the impact of CSS on a page.} + + \para{I also worked on evaluating the HTML5 Web Compoenents standards to + see how they might improve the search page. This required reading + the W3C standards, prototyping templating engine support for them, + and running some experiments on the front page.} + + \para{Pretty much all the technology at Google is custom but relies + heavily on non-relational distributed datastores, and highly + scalable distributed architectures.} + +\subsection{Doubleclick/Performics Software Engineer 2007 -} + + \para{Worked on the affiliate ad product for Doubleclick/Performics in several + different initiatives. The web stack was Linux, Apache, ModPerl and used + DB2/Oracle/MySQL for the database. While there I helped to:} + + - Champion and prioritize tasks for a migration from an IBM + DB2 database to an Oracle Database + + - Code and setup a unit test infrastructure for javascript development. + + - Design and write a UI framework to improve development speed + and maintainability of frontends to the reporting API. + +\subsection{Healthcom - SubContractor 2007} + + \para{Worked on a health device information tracking service. The system recieved + health information from various remote devices in patients homes. It tracked + the data and events and graphed them for the healthcare providers. It also + alerted based off of certain criteria for the data.} + + \para{The system was written in Perl and consumed web services, ftp uploads, + and encrypted network connections to gather the data. The data was stored in + Postgresql. The web stack was Apache and Perl on Windows.} + +\fullrule +\bigskip \goodbreak + +\section{Technologies} + +\para{This is an incomplete list of the technologies I've had experience with just touching +the high points. I'm a generalist who goes deep in a few areas and with an emphasis on +maintainability and longevity of the systems or code I'm involved with.} + +\subsection{Non Relational Datastores} + +\bullet{CouchBase} + +\bullet{MongoDB} + +\bullet{Bigtable}\bigskip + +\subsection{Relational Databases} + +\bullet{DB2} + +\bullet{Oracle} + +\bullet{Postgres} + +\bullet{Mysql} + +\bullet{SQL Server}\bigskip + +\subsection{Languages} + +\para{I know a fairly wide variety of languages not all of which I could use +in production settings. Learning and even creating languages is something +of a hobby for me. A partial list is here.} + +\bullet{Rust} + +\bullet{Go} + +\bullet{Erlang} + +\bullet{UCG} + +\bullet{Javascript} + +\bullet{Typescript} + +\bullet{Java} + +\bullet{Julia} + +\bullet{Python} + +\bullet{C#} + +\bullet{C} + +\end{resume} +\end{document} \ No newline at end of file diff --git a/static/pdf/resume-jeremy-wall.pdf b/static/pdf/resume-jeremy-wall.pdf old mode 100755 new mode 100644 index a400f31..0ce531b Binary files a/static/pdf/resume-jeremy-wall.pdf and b/static/pdf/resume-jeremy-wall.pdf differ