Makefile for PDF and HTML
This commit is contained in:
parent
4a14118b5e
commit
09570e3d68
14 changed files with 665 additions and 186 deletions
9
Makefile
9
Makefile
|
|
@ -2,8 +2,11 @@
|
||||||
|
|
||||||
html: index.html
|
html: index.html
|
||||||
|
|
||||||
index.html: resume.tex
|
index.html: resume.tex res.cls resume.cfg style.css
|
||||||
pandoc resume.tex -s --metadata title="Bastian Gruber - CV" -o index.html
|
make4ht -f html5 -c resume.cfg resume.tex
|
||||||
|
sed -i 's|<link href=.resume\.css.[^>]*>|<link href="style.css" rel="stylesheet" type="text/css" />|; s|<title></title>|<title>Bastian Gruber - CV</title>|' resume.html
|
||||||
|
mv resume.html index.html
|
||||||
|
rm -f resume.css
|
||||||
|
|
||||||
pdf: resume.pdf
|
pdf: resume.pdf
|
||||||
|
|
||||||
|
|
@ -11,6 +14,6 @@ resume.pdf: resume.tex res.cls
|
||||||
pdflatex resume.tex
|
pdflatex resume.tex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f index.html resume.aux resume.log resume.dvi
|
rm -f index.html resume.aux resume.log resume.dvi resume.html resume.css resume.4ct resume.4tc resume.idv resume.lg resume.tmp resume.xref
|
||||||
|
|
||||||
all: html pdf
|
all: html pdf
|
||||||
|
|
|
||||||
328
index.html
328
index.html
|
|
@ -1,177 +1,159 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
<html lang='en-US' xml:lang='en-US'>
|
||||||
<head>
|
<head> <title>Bastian Gruber - CV</title>
|
||||||
<meta charset="utf-8" />
|
<meta charset='utf-8' />
|
||||||
<meta name="generator" content="pandoc" />
|
<meta content='TeX4ht (https://tug.org/tex4ht/)' name='generator' />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
<meta content='width=device-width,initial-scale=1' name='viewport' />
|
||||||
<title>Bastian Gruber - CV</title>
|
<link href="style.css" rel="stylesheet" type="text/css" />
|
||||||
<style>
|
<meta content='resume.tex' name='src' />
|
||||||
html {
|
</head><body>
|
||||||
color: #1a1a1a;
|
<div class='resume'> <!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-1'><colgroup id='TBL-1-1g'><col id='TBL-1-1' /></colgroup><tr id='TBL-1-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-12'>Bastian Gruber</span> </td></tr><tr id='TBL-1-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-2-1' style='white-space:nowrap; text-align:left;'> </td>
|
||||||
background-color: #fdfdfd;
|
</tr><tr id='TBL-1-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-1-3-1' style='white-space:nowrap; text-align:left;'> </td></tr></table> </div>
|
||||||
}
|
<table class='center-addresses'><tr><td class='first-address'><!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-2'><colgroup id='TBL-2-1g'><col id='TBL-2-1' /></colgroup><tr id='TBL-2-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-10'>Professional </span> </td>
|
||||||
body {
|
</tr><tr id='TBL-2-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-2-1' style='white-space:nowrap; text-align:left;'>LinkedIn: linkedin.com/in/bastiangruber </td>
|
||||||
margin: 0 auto;
|
</tr><tr id='TBL-2-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-3-1' style='white-space:nowrap; text-align:left;'>Project: rustwebdevelopment.com </td>
|
||||||
max-width: 36em;
|
</tr><tr id='TBL-2-4-' style='vertical-align:baseline;'><td class='td00' id='TBL-2-4-1' style='white-space:nowrap; text-align:left;'>E-Mail: gruberbastian@me.com </td></tr></table> </div></td><td class='second-address'><!-- tex4ht:inline --><div class='tabular'> <table class='tabular' id='TBL-3'><colgroup id='TBL-3-1g'><col id='TBL-3-1' /></colgroup><tr id='TBL-3-1-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-1-1' style='white-space:nowrap; text-align:left;'><span class='cmbx-10'>Code </span> </td>
|
||||||
padding-left: 50px;
|
</tr><tr id='TBL-3-2-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-2-1' style='white-space:nowrap; text-align:left;'>GitHub: github.com/gruberb </td>
|
||||||
padding-right: 50px;
|
</tr><tr id='TBL-3-3-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-3-1' style='white-space:nowrap; text-align:left;'>Code: code.novanexus.ca </td></tr><tr id='TBL-3-4-' style='vertical-align:baseline;'><td class='td00' id='TBL-3-4-1' style='white-space:nowrap; text-align:left;'>Website: bastiangruber.ca </td>
|
||||||
padding-top: 50px;
|
</tr></table> </div></td></tr></table>
|
||||||
padding-bottom: 50px;
|
<h4 class='sectionHead' id='summary'><a id='x1-10000'></a><div class='centerline'> SUMMARY </div></h4><div class='section'>
|
||||||
hyphens: auto;
|
<!-- l. 55 --><p class='noindent'>Senior Rust engineer and published author (”Rust Web Development” - Manning) with 15+ years building scalable
|
||||||
overflow-wrap: break-word;
|
backend systems. Currently contributing to Firefox at Mozilla, shipping code to hundreds of millions of users.
|
||||||
text-rendering: optimizeLegibility;
|
Founded Rust&Tell Berlin, the largest Rust meetup globally.
|
||||||
font-kerning: normal;
|
</p>
|
||||||
}
|
</div><h4 class='sectionHead' id='skills'><a id='x1-20000'></a><div class='centerline'> SKILLS </div></h4><div class='section'>
|
||||||
@media (max-width: 600px) {
|
<!-- l. 68 --><p class='noindent'><span class='cmbx-10'>Languages: </span>Rust, Python, TypeScript, JavaScript, Go <br class='newline' /><span class='cmbx-10'>Frontend: </span>React, Angular, Vue.js <br class='newline' /><span class='cmbx-10'>Backend: </span>Rust (Actix, Warp, Axum), Python (FastAPI), Node.js, Go <br class='newline' /><span class='cmbx-10'>Patterns: </span>REST, GraphQL, gRPC, async Rust, distributed systems (P2P) <br class='newline' /><span class='cmbx-10'>Infrastructure: </span>AWS, Google Cloud, Docker, Kubernetes, CI/CD, Grafana <br class='newline' /><span class='cmbx-10'>Domains: </span>Systems programming, Firefox, FFI, protocol implementation, IoT, blockchain
|
||||||
body {
|
</p>
|
||||||
font-size: 0.9em;
|
</div><h4 class='sectionHead' id='professional-experience'><a id='x1-30000'></a><div class='centerline'> PROFESSIONAL EXPERIENCE </div></h4><div class='section'>
|
||||||
padding: 12px;
|
<!-- l. 87 --><p class='noindent'><span class='cmsl-10'>Senior Software Engineer - Full-time </span>July 2024 - Now
|
||||||
}
|
<br class='newline' />Mozilla, Remote <br class='newline' />Contributing to Firefox (desktop and mobile) shipped to hundreds of millions of users. All work is open source.
|
||||||
h1 {
|
</p>
|
||||||
font-size: 1.8em;
|
<ul class='itemize1'>
|
||||||
}
|
<li class='itemize'>Leading the Image Service project: designing and implementing a cross-team service to provide favicons
|
||||||
}
|
and images to Firefox Desktop and mobile
|
||||||
@media print {
|
</li>
|
||||||
html {
|
<li class='itemize'>Contributor to UniFFI, Mozilla’s multi-language bindings generator for Rust, enabling Rust code to
|
||||||
background-color: white;
|
be called from Kotlin (Android), Swift (iOS), Python, and JavaScript (Desktop)
|
||||||
}
|
</li>
|
||||||
body {
|
<li class='itemize'>Implemented OHTTP (Oblivious HTTP) support in application-services, enabling privacy-preserving
|
||||||
background-color: transparent;
|
API requests across Firefox Desktop, Android, and iOS
|
||||||
color: black;
|
</li>
|
||||||
font-size: 12pt;
|
<li class='itemize'>Building and maintaining the Push notification service for Firefox (async Rust backend handling
|
||||||
}
|
millions of concurrent connections)
|
||||||
p, h2, h3 {
|
</li>
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
<li class='itemize'>Contributing directly to Firefox (mozilla-central): shipping Rust and C++ code to Desktop
|
||||||
}
|
</li>
|
||||||
h2, h3, h4 {
|
<li class='itemize'>Maintaining Merino, the web service powering Firefox Suggest with Python/FastAPI
|
||||||
page-break-after: avoid;
|
</li>
|
||||||
}
|
<li class='itemize'>Creating internal Rust learning resources and leading ”Rusty Fridays” sessions for engineers</li></ul>
|
||||||
}
|
<!-- l. 100 --><p class='noindent'><span class='cmsl-10'>Senior Systems Engineer, Team Lead - Full-time </span>April 2023 - June 2024
|
||||||
p {
|
<br class='newline' />Toposware, Remote <br class='newline' />Developing a Peer-to-Peer distributed network, with high throughput and low latency. Part of the core team,
|
||||||
margin: 1em 0;
|
consisting out of 4 people. Implementing the protocol and the services in-house. Debugging of production issues,
|
||||||
}
|
implementing the core protocol, re-wrote the CLI, led benchmark initiatives, set up part of the CI/CD flow and
|
||||||
a {
|
Grafana dashboards. </p>
|
||||||
color: #1a1a1a;
|
<ul class='itemize1'>
|
||||||
}
|
<li class='itemize'>Increased the throughput of a node 10x
|
||||||
a:visited {
|
</li>
|
||||||
color: #1a1a1a;
|
<li class='itemize'>Re-wrote the CLI to add configuration and robustness, better user guidance
|
||||||
}
|
</li>
|
||||||
img {
|
<li class='itemize'>Led a team of 3 engineers for an internal benchmark project
|
||||||
max-width: 100%;
|
</li>
|
||||||
}
|
<li class='itemize'>Implemented load testing for part of the codebase
|
||||||
svg {
|
</li>
|
||||||
height: auto;
|
<li class='itemize'>Connected external EVM chains to the core network</li></ul>
|
||||||
max-width: 100%;
|
<!-- l. 111 --><p class='noindent'><span class='cmsl-10'>Senior Software Engineer - Full-time </span>August 2022 - February 2023
|
||||||
}
|
<br class='newline' />Centrifuge, Remote <br class='newline' />Part of the protocol team implementing the DeFi application on top of Substrate. Working in a self-governed
|
||||||
h1, h2, h3, h4, h5, h6 {
|
organization, leading the documentation efforts around Rust and the protocol implementation. </p>
|
||||||
margin-top: 1.4em;
|
<ul class='itemize1'>
|
||||||
}
|
<li class='itemize'>Implemented the auto-generation of the online documentation with every PR
|
||||||
h5, h6 {
|
</li>
|
||||||
font-size: 1em;
|
<li class='itemize'>Enabled mutating of money pools in the protocol
|
||||||
font-style: italic;
|
</li>
|
||||||
}
|
<li class='itemize'>Implemented client facing APIs on top of the money fund pools
|
||||||
h6 {
|
</li>
|
||||||
font-weight: normal;
|
<li class='itemize'>Co-authored RFCs to enhance the protocol</li></ul>
|
||||||
}
|
|
||||||
ol, ul {
|
<!-- l. 121 --><p class='noindent'><span class='cmsl-10'>Author of ”Rust Web Development” </span>October 2020 - December 2022
|
||||||
padding-left: 1.7em;
|
<br class='newline' />Manning Publications, Remote <br class='newline' />Writing the book ”Rust Web Development”. Research, writing and marketing the book in partnership with
|
||||||
margin-top: 1em;
|
Manning. </p>
|
||||||
}
|
<ul class='itemize1'>
|
||||||
li > ol, li > ul {
|
<li class='itemize'>Published technical book on building web services with Rust
|
||||||
margin-top: 0;
|
</li>
|
||||||
}
|
<li class='itemize'>Created comprehensive tutorials covering async Rust, web frameworks, and deployment
|
||||||
blockquote {
|
</li>
|
||||||
margin: 1em 0 1em 1.7em;
|
<li class='itemize'>Book available worldwide through Manning Publications</li></ul>
|
||||||
padding-left: 1em;
|
<!-- l. 130 --><p class='noindent'><span class='cmsl-10'>Sr. Solutions Architect (Professional Services) - Full-time </span>June 2020 - August 2022
|
||||||
border-left: 2px solid #e6e6e6;
|
<br class='newline' />Twilio Inc., Remote <br class='newline' />Second Solutions Architect hired for the new EMEA Professional Services team. Enabled enterprise customers to
|
||||||
color: #606060;
|
integrate Twilio APIs through architecture design, code reviews, and hands-on implementation support.
|
||||||
}
|
</p>
|
||||||
code {
|
<ul class='itemize1'>
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
<li class='itemize'>Technical Lead for Fortune 500 client engagements, from architecture to delivery
|
||||||
font-size: 85%;
|
</li>
|
||||||
margin: 0;
|
<li class='itemize'>Built reusable integration patterns and deliverables adopted across EMEA team
|
||||||
hyphens: manual;
|
</li>
|
||||||
}
|
<li class='itemize'>Established technical review processes and best practices for customer implementations
|
||||||
pre {
|
</li>
|
||||||
margin: 1em 0;
|
<li class='itemize'>Involved in hiring, onboarding, and scaling the Professional Services team</li></ul>
|
||||||
overflow: auto;
|
<!-- l. 140 --><p class='noindent'><span class='cmsl-10'>Systems Engineer - Contract </span>August 2019 - May 2020
|
||||||
}
|
<br class='newline' />Kraken Digital Currency Exchange, Remote (San Francisco)<br class='newline' />Part of the first Rust team of the company, replacing the core trading engine with Rust. Worked alongside 12 highly
|
||||||
pre code {
|
experienced Software Developers from all over the world. Refactor code from PHP to Rust, wrote new features in
|
||||||
padding: 0;
|
Rust in a well-tested highly secure manner. </p>
|
||||||
overflow: visible;
|
<ul class='itemize1'>
|
||||||
overflow-wrap: normal;
|
<li class='itemize'>Re-wrote several PHP services in Rust to increase the throughput 100fold
|
||||||
}
|
</li>
|
||||||
.sourceCode {
|
<li class='itemize'>Wrote new services in Rust from the ground up
|
||||||
background-color: transparent;
|
</li>
|
||||||
overflow: visible;
|
<li class='itemize'>Cross-communication with different teams and the CTO</li></ul>
|
||||||
}
|
<!-- l. 149 --><p class='noindent'><span class='cmsl-10'>Rust Developer - Freelance </span>March 2019 - July 2019
|
||||||
hr {
|
<br class='newline' />Self Employed, Berlin/Toronto <br class='newline' />Took time to deep-dive into Rust, founded the Rust&Tell Berlin MeetUp, contributed to Rust core and created
|
||||||
background-color: #1a1a1a;
|
learning paths for NodeJS developers transitioning to Rust. </p>
|
||||||
border: none;
|
<ul class='itemize1'>
|
||||||
height: 1px;
|
<li class='itemize'>Founded and organized the monthly ”Rust & Tell Berlin” meetup (now largest Rust meetup globally)
|
||||||
margin: 1em 0;
|
</li>
|
||||||
}
|
<li class='itemize'>Contributed to Rust core and various Rust libraries
|
||||||
table {
|
</li>
|
||||||
margin: 1em 0;
|
<li class='itemize'>Created Rust learning resources for NodeJS developers</li></ul>
|
||||||
border-collapse: collapse;
|
<!-- l. 158 --><p class='noindent'><span class='cmsl-10'>Sr. Software Engineer - Freelance </span>March 2016 - February 2019
|
||||||
width: 100%;
|
<br class='newline' />OSRAM, Körber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin) <br class='newline' />Freelance consultant for enterprise clients. Focus on microservices architecture, IoT platforms, and frontend
|
||||||
overflow-x: auto;
|
development. </p>
|
||||||
display: block;
|
<ul class='itemize1'>
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
<li class='itemize'>Built authentication infrastructure for OSRAM’s large-scale IoT platform (Node.js, Go, Lua)
|
||||||
}
|
</li>
|
||||||
table caption {
|
<li class='itemize'>First engineering hire at Körber Digital; established tech stack and real-time data pipelines on AWS
|
||||||
margin-bottom: 0.75em;
|
</li>
|
||||||
}
|
<li class='itemize'>Tech Lead at Avenga; enabled Scrum processes and refactored codebase into microservices
|
||||||
tbody {
|
</li>
|
||||||
margin-top: 0.5em;
|
<li class='itemize'>Migrated legacy PHP systems to Node.js microservices with Docker at GIATA
|
||||||
border-top: 1px solid #1a1a1a;
|
</li>
|
||||||
border-bottom: 1px solid #1a1a1a;
|
<li class='itemize'>Built in-house analytics dashboards and ad platforms at Glispa with AngularJS
|
||||||
}
|
</li>
|
||||||
th {
|
<li class='itemize'>Mentored teams on Scrum adoption and modern JavaScript practices</li></ul>
|
||||||
border-top: 1px solid #1a1a1a;
|
<!-- l. 170 --><p class='noindent'><span class='cmsl-10'>Software Engineer - Full-time </span>August 2015 - February 2016
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
<br class='newline' />smartB Energy Management GmbH, Berlin <br class='newline' />Worked in a small agile team creating an application for business owners to monitor energy consumption.
|
||||||
}
|
</p>
|
||||||
td {
|
<ul class='itemize1'>
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
<li class='itemize'>Full-stack development with JavaScript and Python
|
||||||
}
|
</li>
|
||||||
header {
|
<li class='itemize'>Heavy use of pair programming and TDD practices</li></ul>
|
||||||
margin-bottom: 4em;
|
<!-- l. 178 --><p class='noindent'><span class='cmsl-10'>Software Engineer - Freelance </span>March 2015 - July 2015
|
||||||
text-align: center;
|
<br class='newline' />blogfoster GmbH, Berlin <br class='newline' />First developer hired to rewrite existing PHP/Backbone application using NodeJS and React. </p>
|
||||||
}
|
<ul class='itemize1'>
|
||||||
#TOC li {
|
<li class='itemize'>Built the first version of the ad marketplace for this young startup
|
||||||
list-style: none;
|
</li>
|
||||||
}
|
<li class='itemize'>Mapped out architecture with CTO; implemented TDD practices</li></ul>
|
||||||
#TOC ul {
|
<!-- l. 186 --><p class='noindent'><span class='cmsl-10'>Frontend Developer - Full-time </span>February 2014 - March 2015
|
||||||
padding-left: 1.3em;
|
<br class='newline' />Dalia Research, Berlin <br class='newline' />First and sole frontend developer at 8-person startup. </p>
|
||||||
}
|
<ul class='itemize1'>
|
||||||
#TOC > ul {
|
<li class='itemize'>Built survey platform and analytics dashboards in AngularJS
|
||||||
padding-left: 0;
|
</li>
|
||||||
}
|
<li class='itemize'>Translated business requirements into product features across all browsers and devices</li></ul>
|
||||||
#TOC a:not(:hover) {
|
</div><h4 class='sectionHead' id='education'><a id='x1-40000'></a><div class='centerline'> EDUCATION </div></h4><div class='section'>
|
||||||
text-decoration: none;
|
<!-- l. 198 --><p class='noindent'><span class='cmsl-10'>Bachelor of Science, Computer Science </span>September 2010 - February 2014
|
||||||
}
|
<br class='newline' />TH Ingolstadt<br class='newline' />Scholarship from Allianz Deutschland AG to study Computer Science, fully funded and with trainings in Scrum,
|
||||||
code{white-space: pre-wrap;}
|
Java, PL/I and mainframe systems on the side.
|
||||||
span.smallcaps{font-variant: small-caps;}
|
</p>
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
</div></div>
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header id="title-block-header">
|
|
||||||
<h1 class="title">Bastian Gruber - CV</h1>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
6
resume.4ct
Normal file
6
resume.4ct
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
\expandafter\ifx\csname doTocEntry\endcsname\relax \expandafter\endinput\fi
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax
|
||||||
|
\par
|
||||||
5
resume.4tc
Normal file
5
resume.4tc
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
\expandafter\ifx\csname doTocEntry\endcsname\relax \expandafter\endinput\fi
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-10000}{QQ2-1-1}{\centerline {SUMMARY}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-20000}{QQ2-1-2}{\centerline {SKILLS}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-30000}{QQ2-1-3}{\centerline {PROFESSIONAL EXPERIENCE}}}{1}\relax
|
||||||
|
\doTocEntry\tocsection{0}{\csname a:TocLink\endcsname{1}{x1-40000}{QQ2-1-4}{\centerline {EDUCATION}}}{5}\relax
|
||||||
3
resume.cfg
Normal file
3
resume.cfg
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
\Preamble{xhtml,html5}
|
||||||
|
\begin{document}
|
||||||
|
\EndPreamble
|
||||||
BIN
resume.dvi
BIN
resume.dvi
Binary file not shown.
BIN
resume.idv
Normal file
BIN
resume.idv
Normal file
Binary file not shown.
164
resume.lg
Normal file
164
resume.lg
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
htfcss: cmsl font-style: oblique;
|
||||||
|
htfcss: cmbx font-weight: bold;
|
||||||
|
htfcss: cmbxsl font-weight: bold; font-style: oblique;
|
||||||
|
htfcss: cmbx font-weight: bold;
|
||||||
|
htfcss: cmbxsl font-weight: bold; font-style: oblique;
|
||||||
|
htfcss: cmtt font-family: monospace,monospace;
|
||||||
|
File: resume.html
|
||||||
|
File: resume.css
|
||||||
|
File: resume.tmp
|
||||||
|
Css: p{margin-top:0;margin-bottom:0}
|
||||||
|
Css: p.indent{text-indent:0;}
|
||||||
|
Css: p + p{margin-top:1em;}
|
||||||
|
Css: p + div, p + pre {margin-top:1em;}
|
||||||
|
Css: div + p, pre + p {margin-top:1em;}
|
||||||
|
Css: a { overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; hyphens: auto; }
|
||||||
|
Css: @media print {div.crosslinks {visibility:hidden;}}
|
||||||
|
Css: table.tabular{border-collapse: collapse; border-spacing: 0;}
|
||||||
|
Css: a img { border-top: 0; border-left: 0; border-right: 0; }
|
||||||
|
Font_Css("4"): .small-caps{font-variant: small-caps; }
|
||||||
|
Font_Css("10"): .htf-cmbx {font-weight: bold; font-style:normal;}
|
||||||
|
Font_Css("12"): .htf-calligraphy {font-family:cursive}
|
||||||
|
Font_Css("14"): .htf-italic {font-style: italic;}
|
||||||
|
Font_Css("16"): .htf-bold {font-weight: bold;}
|
||||||
|
Font_Css("12"): .htf-calligraphy-bold {font-family:cursive ; font-weight: bold; }
|
||||||
|
Css: center { margin-top:1em; margin-bottom:1em; }
|
||||||
|
Css: td center { margin-top:0em; margin-bottom:0em; }
|
||||||
|
Css: .Canvas { position:relative; }
|
||||||
|
Css: img.math{vertical-align:middle;}
|
||||||
|
Css: div.par-math-display, div.math-display{text-align:center;}
|
||||||
|
Css: body{ margin:1em auto; max-width:80ch; padding:0 .62em; }
|
||||||
|
Css: h1,h2,h3,h4,h5 { line-height:1.2; }
|
||||||
|
Css: @media print{ body{ max-width:none } }
|
||||||
|
Css: .partHead, .likepartHead { font-size: 2em; }
|
||||||
|
Css: .chapterHead, .likechapterHead { font-size: 1.7411em; }
|
||||||
|
Css: .sectionHead, .likesectionHead { font-size: 1.5157em; }
|
||||||
|
Css: .subsectionHead, .likesubsectionHead { font-size: 1.3195em; }
|
||||||
|
Css: .subsubsectionHead, .likesubsubsectionHead { font-size: 1.1487em; }
|
||||||
|
Css: @media (prefers-color-scheme: dark) { img[src^="resume"]{filter: invert(1); } }
|
||||||
|
Css: body { background-color: Canvas; color: CanvasText; color-scheme: light dark; }
|
||||||
|
Css: li p.indent { text-indent: 0em }
|
||||||
|
Css: li p:first-child{ margin-top:0em; }
|
||||||
|
Css: li p:last-child, li div:last-child { margin-bottom:0.5em; }
|
||||||
|
Css: li p:first-child{ margin-bottom:0; }
|
||||||
|
Css: li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; }
|
||||||
|
Css: .enumerate1 {list-style-type:decimal;}
|
||||||
|
Css: .enumerate2 {list-style-type:lower-alpha;}
|
||||||
|
Css: .enumerate3 {list-style-type:lower-roman;}
|
||||||
|
Css: .enumerate4 {list-style-type:upper-alpha;}
|
||||||
|
Css: div.newtheorem { margin-bottom: 2em; margin-top: 2em;}
|
||||||
|
Css: div.newtheorem .head{font-weight: bold;}
|
||||||
|
Css: .obeylines-h,.obeylines-v {white-space: nowrap; }
|
||||||
|
Css: div.obeylines-v p { margin-top:0; margin-bottom:0; }
|
||||||
|
Css: .overline{ text-decoration:overline; }
|
||||||
|
Css: .overline img{ border-top: 1px solid black; }
|
||||||
|
Css: td.displaylines {text-align:center; white-space:nowrap;}
|
||||||
|
Css: .centerline {text-align:center;}
|
||||||
|
Css: .rightline {text-align:right;}
|
||||||
|
Css: pre.verbatim {font-family: monospace,monospace; text-align:left; clear:both; }
|
||||||
|
Css: .fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
|
||||||
|
Css: div.fbox {display:table}
|
||||||
|
Css: div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
|
||||||
|
Css: div.minipage{width:100%;}
|
||||||
|
Css: div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;}
|
||||||
|
Css: div.center div {text-align: left;}
|
||||||
|
Css: div.flushright, div.flushright div.flushright {text-align: right;}
|
||||||
|
Css: div.flushright div {text-align: left;}
|
||||||
|
Css: div.flushleft {text-align: left;}
|
||||||
|
Css: .underline{ text-decoration:underline; }
|
||||||
|
Css: .underline img{ border-bottom: 1px solid black; margin-bottom:1pt; }
|
||||||
|
Css: .framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
|
||||||
|
Css: .framebox-c {text-align:center;}
|
||||||
|
Css: .framebox-l {text-align:left;}
|
||||||
|
Css: .framebox-r {text-align:right;}
|
||||||
|
Css: span.thank-mark{ vertical-align: super }
|
||||||
|
Css: span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; }
|
||||||
|
Css: code.verb{font-family:monospace,monospace;}
|
||||||
|
Css: div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; }
|
||||||
|
Css: table.tabular td p{margin-top:0em;}
|
||||||
|
Css: table.tabular {margin-left: auto; margin-right: auto;}
|
||||||
|
Css: td p:first-child{ margin-top:0em; }
|
||||||
|
Css: td p:last-child{ margin-bottom:0em; }
|
||||||
|
Css: div.td00{ margin-left:0pt; margin-right:0pt; }
|
||||||
|
Css: div.td01{ margin-left:0pt; margin-right:5pt; }
|
||||||
|
Css: div.td10{ margin-left:5pt; margin-right:0pt; }
|
||||||
|
Css: div.td11{ margin-left:5pt; margin-right:5pt; }
|
||||||
|
Css: table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; }
|
||||||
|
Css: td.td00{ padding-left:0pt; padding-right:0pt; }
|
||||||
|
Css: td.td01{ padding-left:0pt; padding-right:5pt; }
|
||||||
|
Css: td.td10{ padding-left:5pt; padding-right:0pt; }
|
||||||
|
Css: td.td11{ padding-left:5pt; padding-right:5pt; }
|
||||||
|
Css: table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; }
|
||||||
|
Css: .hline hr, .cline hr{ height : 0px; margin:0px; }
|
||||||
|
Css: .hline td, .cline td{ padding: 0; }
|
||||||
|
Css: .hline hr, .cline hr{border:none;border-top:1px solid black;}
|
||||||
|
Css: .hline {border-top: 1px solid black;}
|
||||||
|
Css: .hline + .vspace:last-child{display:none;}
|
||||||
|
Css: .tabbing-right {text-align:right;}
|
||||||
|
Css: div.float, div.figure {margin-left: auto; margin-right: auto;}
|
||||||
|
Css: div.float img {text-align:center;}
|
||||||
|
Css: div.figure img {text-align:center;}
|
||||||
|
Css: .marginpar,.reversemarginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;}
|
||||||
|
Css: .marginpar p,.reversemarginpar p{margin-top:0.4em; margin-bottom:0.4em;}
|
||||||
|
Css: .reversemarginpar{float:left;}
|
||||||
|
Css: table.equation {width:100%;}
|
||||||
|
Css: .equation td{text-align:center; }
|
||||||
|
Css: td.equation { margin-top:1em; margin-bottom:1em; }
|
||||||
|
Css: td.equation-label { width:5%; text-align:center; }
|
||||||
|
Css: td.eqnarray4 { width:5%; white-space: normal; }
|
||||||
|
Css: td.eqnarray2 { width:5%; }
|
||||||
|
Css: table.eqnarray-star, table.eqnarray {width:100%;}
|
||||||
|
Css: div.eqnarray{text-align:center;}
|
||||||
|
Css: div.array {text-align:center;}
|
||||||
|
Css: div.pmatrix {text-align:center;}
|
||||||
|
Css: table.pmatrix {width:100%;}
|
||||||
|
Css: span.pmatrix img{vertical-align:middle;}
|
||||||
|
Css: div.pmatrix {text-align:center;}
|
||||||
|
Css: table.pmatrix {width:100%;}
|
||||||
|
Css: span.bar-css {text-decoration:overline;}
|
||||||
|
Css: img.cdots{vertical-align:middle;}
|
||||||
|
Css: .partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;}
|
||||||
|
Css: .index-item, .index-subitem, .index-subsubitem {display:block}
|
||||||
|
Css: div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center; margin-top: 0.5rem;}
|
||||||
|
Css: div.caption span.id{font-weight: bold; white-space: nowrap; }
|
||||||
|
Css: h1.partHead{text-align: center}
|
||||||
|
Css: p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; }
|
||||||
|
Css: p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; }
|
||||||
|
Css: .subsubsectionHead, .likesubsubsectionHead { font-size: 1em; }
|
||||||
|
Css: .paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;}
|
||||||
|
Css: .subparagraphHead, .likesubparagraphHead { font-weight: bold;}
|
||||||
|
Css: .verse{white-space:nowrap; margin-left:2em}
|
||||||
|
Css: div.maketitle {text-align:center;}
|
||||||
|
Css: h2.titleHead{text-align:center;}
|
||||||
|
Css: div.maketitle{ margin-bottom: 2em; }
|
||||||
|
Css: div.author, div.date {text-align:center;}
|
||||||
|
Css: div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; }
|
||||||
|
Css: div.author{white-space: nowrap;}
|
||||||
|
Css: div.abstract p {margin-left:5%; margin-right:5%;}
|
||||||
|
Css: div.abstract {width:100%;}
|
||||||
|
Css: .abstracttitle{text-align:center;margin-bottom:1em;}
|
||||||
|
Css: .subsectionToc, .likesubsectionToc {margin-left:1em;}
|
||||||
|
Css: .subsubsectionToc, .likesubsubsectionToc {margin-left:2em;}
|
||||||
|
Css: .paragraphToc, .likeparagraphToc {margin-left:3em;}
|
||||||
|
Css: .subparagraphToc, .likesubparagraphToc {margin-left:4em;}
|
||||||
|
Css: figure.float, div.figure {margin-left: auto; margin-right: auto;}
|
||||||
|
Css: figure.figure {text-align:center;}
|
||||||
|
Css: figcaption.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center;}
|
||||||
|
Css: figcaption.caption span.id{font-weight: bold; white-space: nowrap; }
|
||||||
|
Css: p + figcaption, img + figcaption{margin-top: 1em;}
|
||||||
|
Css: .abstract{margin:1em;}
|
||||||
|
Css: table.tabbing {width:100%; margin-top:1em;}
|
||||||
|
Css: td.tabbing {width:33%;}
|
||||||
|
Css: div.section {margin-left:3em;}
|
||||||
|
Css: .center-addresses {width:100%}
|
||||||
|
Css: .line-address {text-align:right;}
|
||||||
|
Css: table.section td{ vertical-align:top;}
|
||||||
|
Css: td.section {padding-right:2em; width:20%;}
|
||||||
|
Css: table.section {margin-top:1em;}
|
||||||
|
Css: .position table {width:100%;}
|
||||||
|
--- characters ---
|
||||||
|
Font("cmr","10","10","100")
|
||||||
|
Font("cmtt","10","10","100")
|
||||||
|
Font("cmbx","12","12","100")
|
||||||
|
Font("cmbx","10","10","100")
|
||||||
|
Font("cmsl","10","10","100")
|
||||||
110
resume.log
Normal file
110
resume.log
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2026/dev/Arch Linux) (preloaded format=pdflatex 2026.1.20) 20 JAN 2026 16:26
|
||||||
|
entering extended mode
|
||||||
|
restricted \write18 enabled.
|
||||||
|
%&-line parsing enabled.
|
||||||
|
**resume.tex
|
||||||
|
(./resume.tex
|
||||||
|
LaTeX2e <2024-11-01> patch level 2
|
||||||
|
L3 programming layer <2025-01-18>
|
||||||
|
(./res.cls
|
||||||
|
Document Style `res' <26 Sep 89>.
|
||||||
|
Document Class: res 2000/05/19 v1.4b Resume class
|
||||||
|
(/usr/share/texmf-dist/tex/latex/base/article.cls
|
||||||
|
Document Class: article 2024/06/29 v1.4n Standard LaTeX document class
|
||||||
|
(/usr/share/texmf-dist/tex/latex/base/size10.clo
|
||||||
|
File: size10.clo 2024/06/29 v1.4n Standard LaTeX file (size option)
|
||||||
|
)
|
||||||
|
\c@part=\count196
|
||||||
|
\c@section=\count197
|
||||||
|
\c@subsection=\count198
|
||||||
|
\c@subsubsection=\count199
|
||||||
|
\c@paragraph=\count266
|
||||||
|
\c@subparagraph=\count267
|
||||||
|
\c@figure=\count268
|
||||||
|
\c@table=\count269
|
||||||
|
\abovecaptionskip=\skip49
|
||||||
|
\belowcaptionskip=\skip50
|
||||||
|
\bibindent=\dimen141
|
||||||
|
)
|
||||||
|
No auxiliary output files.
|
||||||
|
|
||||||
|
\tabular@text=\toks17
|
||||||
|
\tabular@head=\toks18
|
||||||
|
\tabular@tail=\toks19
|
||||||
|
\@ta=\toks20
|
||||||
|
\undefined@token=\toks21
|
||||||
|
\sectionwidth=\dimen142
|
||||||
|
\sectionskip=\skip51
|
||||||
|
\resumewidth=\dimen143
|
||||||
|
\@columnwidth=\dimen144
|
||||||
|
\c@numberofcolumns=\count270
|
||||||
|
) (/usr/share/texmf-dist/tex/latex/psnfss/helvet.sty
|
||||||
|
Package: helvet 2020/03/25 PSNFSS-v9.3 (WaS)
|
||||||
|
|
||||||
|
(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty
|
||||||
|
Package: keyval 2022/05/29 v1.15 key=value parser (DPC)
|
||||||
|
\KV@toks@=\toks22
|
||||||
|
))
|
||||||
|
(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
|
||||||
|
File: l3backend-pdftex.def 2024-05-08 L3 backend support: PDF output (pdfTeX)
|
||||||
|
\l__color_backend_stack_int=\count271
|
||||||
|
\l__pdf_internal_box=\box52
|
||||||
|
)
|
||||||
|
|
||||||
|
LaTeX Warning: Unused global option(s):
|
||||||
|
[10pt].
|
||||||
|
|
||||||
|
No file resume.aux.
|
||||||
|
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 30.
|
||||||
|
LaTeX Font Info: ... okay on input line 30.
|
||||||
|
LaTeX Font Info: External font `cmex10' loaded for size
|
||||||
|
(Font) <7> on input line 46.
|
||||||
|
LaTeX Font Info: External font `cmex10' loaded for size
|
||||||
|
(Font) <5> on input line 46.
|
||||||
|
|
||||||
|
|
||||||
|
[1
|
||||||
|
|
||||||
|
{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts
|
||||||
|
/enc/dvips/cm-super/cm-super-ts1.enc}]
|
||||||
|
|
||||||
|
[2]
|
||||||
|
|
||||||
|
[3]
|
||||||
|
***********
|
||||||
|
LaTeX2e <2024-11-01> patch level 2
|
||||||
|
L3 programming layer <2025-01-18>
|
||||||
|
***********
|
||||||
|
)
|
||||||
|
Here is how much of TeX's memory you used:
|
||||||
|
605 strings out of 475171
|
||||||
|
10850 string characters out of 5767095
|
||||||
|
404915 words of memory out of 5000000
|
||||||
|
23670 multiletter control sequences out of 15000+600000
|
||||||
|
560438 words of font info for 41 fonts, out of 8000000 for 9000
|
||||||
|
14 hyphenation exceptions out of 8191
|
||||||
|
49i,8n,52p,364b,200s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
||||||
|
</usr/share/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/
|
||||||
|
texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb></usr/share/texmf-dist/fon
|
||||||
|
ts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texmf-dist/fonts/type1/public
|
||||||
|
/amsfonts/cm/cmsl10.pfb></usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm
|
||||||
|
1000.pfb>
|
||||||
|
Output written on resume.pdf (3 pages, 81198 bytes).
|
||||||
|
PDF statistics:
|
||||||
|
40 PDF objects out of 1000 (max. 8388607)
|
||||||
|
24 compressed objects within 1 object stream
|
||||||
|
0 named destinations out of 1000 (max. 500000)
|
||||||
|
1 words of extra memory for PDF output out of 10000 (max. 10000000)
|
||||||
|
|
||||||
BIN
resume.pdf
BIN
resume.pdf
Binary file not shown.
50
resume.tex
50
resume.tex
|
|
@ -118,6 +118,15 @@ Part of the protocol team implementing the DeFi application on top of Substrate.
|
||||||
\item Co-authored RFCs to enhance the protocol
|
\item Co-authored RFCs to enhance the protocol
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
{\sl Author of "Rust Web Development"} \hfill October 2020 - December 2022 \\
|
||||||
|
Manning Publications, Remote \\
|
||||||
|
Writing the book "Rust Web Development". Research, writing and marketing the book in partnership with Manning.
|
||||||
|
\begin{itemize} \itemsep -2pt
|
||||||
|
\item Published technical book on building web services with Rust
|
||||||
|
\item Created comprehensive tutorials covering async Rust, web frameworks, and deployment
|
||||||
|
\item Book available worldwide through Manning Publications
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
{\sl Sr. Solutions Architect (Professional Services) - Full-time} \hfill June 2020 - August 2022 \\
|
{\sl Sr. Solutions Architect (Professional Services) - Full-time} \hfill June 2020 - August 2022 \\
|
||||||
Twilio Inc., Remote \\
|
Twilio Inc., Remote \\
|
||||||
Second Solutions Architect hired for the new EMEA Professional Services team. Enabled enterprise customers to integrate Twilio APIs through architecture design, code reviews, and hands-on implementation support.
|
Second Solutions Architect hired for the new EMEA Professional Services team. Enabled enterprise customers to integrate Twilio APIs through architecture design, code reviews, and hands-on implementation support.
|
||||||
|
|
@ -128,25 +137,52 @@ Second Solutions Architect hired for the new EMEA Professional Services team. En
|
||||||
\item Involved in hiring, onboarding, and scaling the Professional Services team
|
\item Involved in hiring, onboarding, and scaling the Professional Services team
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
{\sl Systems Engineer - Contract} \hfill September 2019 - May 2020 \\
|
{\sl Systems Engineer - Contract} \hfill August 2019 - May 2020 \\
|
||||||
Kraken Digital Currency Exchange, Remote (San Francisco)\\
|
Kraken Digital Currency Exchange, Remote (San Francisco)\\
|
||||||
Part of the first Rust team of the company, replacing the core trading engine with Rust. Worked alongside 12 highly experienced Software Developers from all over the world. Refactor code from PHP to Rust, wrote new features in Rust in a well-tested highly secure manner.
|
Part of the first Rust team of the company, replacing the core trading engine with Rust. Worked alongside 12 highly experienced Software Developers from all over the world. Refactor code from PHP to Rust, wrote new features in Rust in a well-tested highly secure manner.
|
||||||
\begin{itemize}
|
\begin{itemize} \itemsep -2pt
|
||||||
\item Re-wrote several PHP services in Rust to increase the throughput 100fold
|
\item Re-wrote several PHP services in Rust to increase the throughput 100fold
|
||||||
\item Wrote new services in Rust from the ground up
|
\item Wrote new services in Rust from the ground up
|
||||||
\item Cross-communication with different teams and the CTO
|
\item Cross-communication with different teams and the CTO
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
{\sl Sr. Software Engineer - Freelance} \hfill February 2016 - February 2019 \\
|
{\sl Rust Developer - Freelance} \hfill March 2019 - July 2019 \\
|
||||||
OSRAM, K\"orber Digital, ERGO Group, GIATA (Berlin) \\
|
Self Employed, Berlin/Toronto \\
|
||||||
|
Took time to deep-dive into Rust, founded the Rust\&Tell Berlin MeetUp, contributed to Rust core and created learning paths for NodeJS developers transitioning to Rust.
|
||||||
|
\begin{itemize} \itemsep -2pt
|
||||||
|
\item Founded and organized the monthly "Rust \& Tell Berlin" meetup (now largest Rust meetup globally)
|
||||||
|
\item Contributed to Rust core and various Rust libraries
|
||||||
|
\item Created Rust learning resources for NodeJS developers
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
{\sl Sr. Software Engineer - Freelance} \hfill March 2016 - February 2019 \\
|
||||||
|
OSRAM, K\"orber Digital, Avenga, ERGO Group, GIATA, PaperHive, Glispa (Berlin) \\
|
||||||
Freelance consultant for enterprise clients. Focus on microservices architecture, IoT platforms, and frontend development.
|
Freelance consultant for enterprise clients. Focus on microservices architecture, IoT platforms, and frontend development.
|
||||||
\begin{itemize} \itemsep -2pt
|
\begin{itemize} \itemsep -2pt
|
||||||
\item Built authentication infrastructure for OSRAM's large-scale IoT platform (Node.js, Go, Lua)
|
\item Built authentication infrastructure for OSRAM's large-scale IoT platform (Node.js, Go, Lua)
|
||||||
\item First engineering hire at K\"orber Digital; established tech stack and real-time data pipelines on AWS
|
\item First engineering hire at K\"orber Digital; established tech stack and real-time data pipelines on AWS
|
||||||
|
\item Tech Lead at Avenga; enabled Scrum processes and refactored codebase into microservices
|
||||||
\item Migrated legacy PHP systems to Node.js microservices with Docker at GIATA
|
\item Migrated legacy PHP systems to Node.js microservices with Docker at GIATA
|
||||||
|
\item Built in-house analytics dashboards and ad platforms at Glispa with AngularJS
|
||||||
\item Mentored teams on Scrum adoption and modern JavaScript practices
|
\item Mentored teams on Scrum adoption and modern JavaScript practices
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
{\sl Software Engineer - Full-time} \hfill August 2015 - February 2016 \\
|
||||||
|
smartB Energy Management GmbH, Berlin \\
|
||||||
|
Worked in a small agile team creating an application for business owners to monitor energy consumption.
|
||||||
|
\begin{itemize} \itemsep -2pt
|
||||||
|
\item Full-stack development with JavaScript and Python
|
||||||
|
\item Heavy use of pair programming and TDD practices
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
{\sl Software Engineer - Freelance} \hfill March 2015 - July 2015 \\
|
||||||
|
blogfoster GmbH, Berlin \\
|
||||||
|
First developer hired to rewrite existing PHP/Backbone application using NodeJS and React.
|
||||||
|
\begin{itemize} \itemsep -2pt
|
||||||
|
\item Built the first version of the ad marketplace for this young startup
|
||||||
|
\item Mapped out architecture with CTO; implemented TDD practices
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
{\sl Frontend Developer - Full-time} \hfill February 2014 - March 2015 \\
|
{\sl Frontend Developer - Full-time} \hfill February 2014 - March 2015 \\
|
||||||
Dalia Research, Berlin \\
|
Dalia Research, Berlin \\
|
||||||
First and sole frontend developer at 8-person startup.
|
First and sole frontend developer at 8-person startup.
|
||||||
|
|
|
||||||
2
resume.tmp
Normal file
2
resume.tmp
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
/* css.sty */
|
||||||
8
resume.xref
Normal file
8
resume.xref
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
\:CrossWord{)F1F-}{resume.html}{1}%
|
||||||
|
\:CrossWord{)M1x0}{;}{1}%
|
||||||
|
\:CrossWord{)M2x0}{;}{1}%
|
||||||
|
\:CrossWord{)M3x0}{;}{1}%
|
||||||
|
\:CrossWord{)Qx1-10000}{1}{1}%
|
||||||
|
\:CrossWord{)Qx1-20000}{1}{1}%
|
||||||
|
\:CrossWord{)Qx1-30000}{1}{1}%
|
||||||
|
\:CrossWord{)Qx1-40000}{1}{5}%
|
||||||
160
style.css
Normal file
160
style.css
Normal file
|
|
@ -0,0 +1,160 @@
|
||||||
|
/* CV Styles */
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
|
||||||
|
html {
|
||||||
|
color: #1a1a1a;
|
||||||
|
background-color: #fdfdfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 750px;
|
||||||
|
padding: 40px 50px;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
body { font-size: 14px; padding: 20px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body { max-width: none; padding: 20px; font-size: 11pt; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Name header */
|
||||||
|
.cmbx-12 {
|
||||||
|
font-size: 28px;
|
||||||
|
font-weight: 600;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide empty rows in name table */
|
||||||
|
.resume > .tabular:first-child table tr:not(:first-child) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Contact info */
|
||||||
|
.center-addresses {
|
||||||
|
width: 100%;
|
||||||
|
margin: 15px 0 30px 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-addresses td {
|
||||||
|
padding: 0 20px;
|
||||||
|
vertical-align: top;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.first-address {
|
||||||
|
text-align: right;
|
||||||
|
border-right: 1px solid #ddd;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.second-address {
|
||||||
|
text-align: left;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.center-addresses td {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.first-address {
|
||||||
|
border-right: none;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-addresses .cmbx-10 {
|
||||||
|
font-weight: 600;
|
||||||
|
color: #333;
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Section headers */
|
||||||
|
.sectionHead {
|
||||||
|
margin: 35px 0 15px 0;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
border-bottom: 2px solid #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sectionHead .centerline {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Section content */
|
||||||
|
div.section {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Job titles */
|
||||||
|
.cmsl-10 {
|
||||||
|
font-weight: 600;
|
||||||
|
font-style: normal;
|
||||||
|
color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bold text */
|
||||||
|
.cmbx-10 {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lists */
|
||||||
|
ul.itemize1 {
|
||||||
|
margin: 8px 0 25px 0;
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.itemize {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Paragraphs */
|
||||||
|
p {
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.noindent {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove extra spacing from tables */
|
||||||
|
.tabular {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.tabular {
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Links */
|
||||||
|
a {
|
||||||
|
color: #0066cc;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Line breaks styling */
|
||||||
|
br.newline {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue