commit 9cfe02a5b59fa5d6329f0660755f74b051268ca0 Author: Tyler Hampton Date: Fri Sep 8 23:27:44 2023 -0700 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97e7f6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.idea +*.log +tmp/ + + +resume.aux +resume.log +texput.log diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a424a72 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +## +# Resume +# +# @file +# @version 0.1 + +.PHONY: sections +CC = xelatex + +resume.pdf: clean + $(CC) resume.tex + okular resume.pdf + +coverletter.pdf: clean + $(CC) coverletter.tex + +build: clean + dagger run go run ci/main.go + +clean: + rm -rf *.pdf *.aux *.log +# end diff --git a/README.md b/README.md new file mode 100644 index 0000000..62299b3 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# My Resume + +This resume is a LaTeX template heavily based on [AwesomeCV](https://github.com/posquit0/Awesome-CV). It has been modified slightly to better support pointing to custom hrefs and better break support for long sections. + +Feel free to use the code for this but please don't use my resume for anything nefarious. + +# Building + +## Dependencies + +* `xelatex` +* GNU Make + +The two Nix packages I have installed are: + +``` sh +gnumake +texlive.combined.scheme-full +``` + +## Shell + +The default make target is to produce the resume. + +``` +make +``` + +From there, you can open up and review the PDF. I'll either use Emacs or Okular. + +## Dagger and Docker + +There is also a Dagger pipeline for generating a resume. + +``` sh +dagger run go run ci/main.go +``` + +--- diff --git a/awesome-cv.cls b/awesome-cv.cls new file mode 100644 index 0000000..1e7d7aa --- /dev/null +++ b/awesome-cv.cls @@ -0,0 +1,793 @@ +%% Start of file `awesome-cv.cls'. +% Awesome CV Class File +% +% This class has been downloaded from: +% https://github.com/posquit0/Awesome-CV +% +% Author: +% Claud D. Park +% http://www.posquit0.com +% +% Notes: +% 1) This class file defines the structure and layout of the template file (cv.tex, resume.tex). +% 2) It has been written in such a way that under most circumstances you +% should not need to edit it. +% +% Class license: +% LPPL v1.3c (http://www.latex-project.org/lppl) +% + + +%------------------------------------------------------------------------------- +% Identification +%------------------------------------------------------------------------------- +\ProvidesClass{awesome-cv}[2017/02/05 v1.6.1 Awesome Curriculum Vitae Class] +\NeedsTeXFormat{LaTeX2e} + + +%------------------------------------------------------------------------------- +% Class options +% +% (need to be done before the external package loading, for example because +% we need \paperwidth, \paperheight and \@ptsize to be defined before loading +% geometry and fancyhdr) +%------------------------------------------------------------------------------- +% Options for draft or final +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +% Inherit options of article +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{article} +} +\ProcessOptions\relax +\LoadClass{article} + + +%------------------------------------------------------------------------------- +% 3rd party packages +%------------------------------------------------------------------------------- +% Needed to make fixed length table +\RequirePackage{array} +% Needed to handle list environment +\RequirePackage{enumitem} +% Needed to handle text alignment +\RequirePackage{ragged2e} +% Needed to configure page layout +\RequirePackage{geometry} +% Needed to make header & footer efficiently +\RequirePackage{fancyhdr} +% Needed to manage colors +\RequirePackage{xcolor} +% Needed to use \ifxetex-\else-\fi statement +\RequirePackage{ifxetex} +% Needed to use \if-\then-\else statement +\RequirePackage{xifthen} +% Needed to strip chars from telephone number +\RequirePackage{xstring} +% Needed to use a toolbox of programming tools +\RequirePackage{etoolbox} +% Needed to change line spacing in specific environment +\RequirePackage{setspace} +% Needed to manage fonts +\RequirePackage[quiet]{fontspec} +% To support LaTeX quoting style +\defaultfontfeatures{Ligatures=TeX} +% Needed to manage math fonts +\RequirePackage{unicode-math} +% Needed to use icons from font-awesome +\RequirePackage{fontawesome5} +\RequirePackage{roboto} +\RequirePackage[default,opentype]{sourcesanspro} +% Needed for the photo ID +\RequirePackage[skins]{tcolorbox} +% Needed to deal a paragraphs +\RequirePackage{parskip} +% Needed to deal hyperlink +\RequirePackage[hidelinks,unicode,pdfpagelabels=false]{hyperref} +\hypersetup{% + pdftitle={}, + pdfauthor={}, + pdfsubject={}, + pdfkeywords={} +} +% Solves issues Warning: File `cv.out' has changed +\RequirePackage{bookmark} + +%------------------------------------------------------------------------------- +% Configuration for directory locations +%------------------------------------------------------------------------------- +% Configure an optional directory location for fonts(default: 'fonts/') +% Not required anymore but left in place for backward compatability. +\newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}} + +%------------------------------------------------------------------------------- +% Configuration for layout +%------------------------------------------------------------------------------- +%% Page Layout +% Configure page margins with geometry +\geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm} + +%% Header & Footer +% Set offset to each header and footer +\fancyhfoffset{0em} +% Remove head rule +\renewcommand{\headrulewidth}{0pt} +% Clear all header & footer fields +\fancyhf{} +% Enable if you want to make header or footer using fancyhdr +\pagestyle{fancy} + + +%------------------------------------------------------------------------------- +% Configuration for colors +%------------------------------------------------------------------------------- +% Gray-scale colors +\definecolor{white}{HTML}{FFFFFF} +\definecolor{black}{HTML}{000000} +\definecolor{darkgray}{HTML}{333333} +\definecolor{gray}{HTML}{5D5D5D} +\definecolor{lightgray}{HTML}{999999} +% Basic colors +\definecolor{green}{HTML}{C2E15F} +\definecolor{orange}{HTML}{FDA333} +\definecolor{purple}{HTML}{D3A4F9} +\definecolor{red}{HTML}{FB4485} +\definecolor{blue}{HTML}{6CE0F1} +% Text colors +\definecolor{darktext}{HTML}{414141} +\colorlet{text}{darkgray} +\colorlet{graytext}{gray} +\colorlet{lighttext}{lightgray} +\colorlet{sectiondivider}{gray} +% Awesome colors +\definecolor{awesome-emerald}{HTML}{00A388} +\definecolor{awesome-skyblue}{HTML}{0395DE} +\definecolor{awesome-red}{HTML}{DC3522} +\definecolor{awesome-pink}{HTML}{EF4089} +\definecolor{awesome-orange}{HTML}{FF6138} +\definecolor{awesome-nephritis}{HTML}{27AE60} +\definecolor{awesome-concrete}{HTML}{95A5A6} +\definecolor{awesome-darknight}{HTML}{131A28} +\colorlet{awesome}{awesome-red} + +% Boolean value to switch section color highlighting +\newbool{acvSectionColorHighlight} +\setbool{acvSectionColorHighlight}{true} + +% Awesome section color +\def\@sectioncolor#1#2#3{% + \ifbool{acvSectionColorHighlight}{{\color{awesome}#1#2#3}}{#1#2#3}% +} + + +%------------------------------------------------------------------------------- +% Configuration for fonts +%------------------------------------------------------------------------------- +\newcommand*{\headerfont}{\roboto} +\newcommand*{\headerfontlight}{\robotolight} +\newcommand*{\footerfont}{\sourcesanspro} +\newcommand*{\bodyfont}{\sourcesanspro} +\newcommand*{\bodyfontlight}{\sourcesansprolight} + +%------------------------------------------------------------------------------- +% Configuration for styles +%------------------------------------------------------------------------------- +% Configure styles for each CV elements +% For fundamental structures +\newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}} +\newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}} +\newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}} +\newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}} +\newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}} +\newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}} +\newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}} +\newcommand*{\sectionstyle}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} +\newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}} +\newcommand*{\paragraphstyle}{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text}} + +% For elements of entry +\newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} +\newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}} + +% For elements of subentry +\newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}} +\newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} +\newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}} + +% For elements of honor +\newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} +\newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} +\newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} + +% For elements of skill +\newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}} + +% For elements of the cover letter +\newcommand*{\lettersectionstyle}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} +\newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}} +\newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}} +\newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} +\newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}} +\newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} +\newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}} + + +%------------------------------------------------------------------------------- +% Commands for personal information +%------------------------------------------------------------------------------- +% Define photo ID +% Usage: \photo[circle|rectangle,edge|noedge,left|right]{} +\newcommand{\photo}[2][circle,edge,left]{% + \def\@photo{#2} + \@for\tmp:=#1\do{% + \ifthenelse{\equal{\tmp}{circle} \or \equal{\tmp}{rectangle}}% + {\let\@photoshape\tmp}{}% + \ifthenelse{\equal{\tmp}{edge} \or \equal{\tmp}{noedge}}% + {\let\@photoedge\tmp}{}% + \ifthenelse{\equal{\tmp}{left} \or \equal{\tmp}{right}}% + {\let\@photoalign\tmp}{}% + }% +} +\def\@photoshape{circle} +\def\@photoedge{edge} +\def\@photoalign{left} + +% Define writer's name +% Usage: \name{}{} +% Usage: \firstname{} +% Usage: \lastname{} +% Usage: \familyname{} +\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} +\newcommand*{\firstname}[1]{\def\@firstname{#1}} +\newcommand*{\lastname}[1]{\def\@lastname{#1}} +\newcommand*{\familyname}[1]{\def\@lastname{#1}} +\def\@familyname{\@lastname} + +% Define writer's address +% Usage: \address{
} +\newcommand*{\address}[1]{\def\@address{#1}} + +% Define writer's position +% Usage: \position{} +\newcommand*{\position}[1]{\def\@position{#1}} + +% Defines writer's mobile (optional) +% Usage: \mobile{} +\newcommand*{\mobile}[1] +{ + \def\@mobile{#1} + \def\@teluri{tel:\@mobile} + % Strip unwanted characters + \StrDel{\@teluri}{ }[\@teluri]% + \StrDel{\@teluri}{-}[\@teluri]% + \StrDel{\@teluri}{(}[\@teluri]% + \StrDel{\@teluri}{)}[\@teluri]% +} + +% Defines writer's email (optional) +% Usage: \email{} +\newcommand*{\email}[1]{\def\@email{#1}} + +% Defines writer's date of birth (optional) +% Usage: \dateofbirth{} +\newcommand*{\dateofbirth}[1]{\def\@dateofbirth{#1}} + +% Defines writer's homepage (optional) +% Usage: \homepage{} +\newcommand*{\homepage}[1]{\def\@homepage{#1}} + +% Defines writer's github (optional) +% Usage: \github{} +\newcommand*{\github}[1]{\def\@github{#1}} + +% Defines writer's gitlab (optional) +% Usage: \gitlab{} +\newcommand*{\gitlab}[1]{\def\@gitlab{#1}} + +% Defines writer's bitbucket (optional) +% Usage: \bitbucket{} +\newcommand*{\bitbucket}[1]{\def\@bitbucket{#1}} + +% Defines writer's stackoverflow profile (optional) +% Usage: \stackoverflow{}{} +% e.g.https://stackoverflow.com/users/123456/sam-smith +% would be \stackoverflow{123456}{sam-smith} +\newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}} + +% Defines writer's linked-in (optional) +% Usage: \linkedin{} +\newcommand*{\linkedin}[1]{\def\@linkedin{#1}} + +% Defines writer's orcid (optional) +% Usage: \orcid{} +\newcommand*{\orcid}[1]{\def\@orcid{#1}} + +% Defines writer's twitter (optional) +% Usage: \twitter{} +\newcommand*{\twitter}[1]{\def\@twitter{#1}} + +% Defines writer's Mastodon (optional) +% Usage: \mastodon{}{} +\newcommand*{\mastodon}[2]{\def\@mastodoninstance{#1}\def\@mastodonname{#2}} + +% Defines writer's resarchgate (optional) +% Usage: \researchgate{} +\newcommand*{\researchgate}[1]{\def\@researchgate{#1}} + +% Defines writer's skype (optional) +% Usage: \skype{} +\newcommand*{\skype}[1]{\def\@skype{#1}} + +% Defines writer's reddit (optional) +% Usage: \reddit{} +\newcommand*{\reddit}[1]{\def\@reddit{#1}} + +% Defines writer's xing (optional) +% Usage: \xing{} +\newcommand*{\xing}[1]{\def\@xing{#1}} + +% Defines writer's medium profile (optional) +% Usage: \medium{} +\newcommand*{\medium}[1]{\def\@medium{#1}} + +% Defines writer's kaggle (optional) +% Usage: \kaggle{} +\newcommand*{\kaggle}[1]{\def\@kaggle{#1}} + +% Defines writer's google scholar profile (optional) +% Usage: \googlescholar{}{} +% e.g.https://scholar.google.co.uk/citations?user=wpZDx1cAAAAJ +% would be \googlescholar{wpZDx1cAAAAJ}{Name-to-display-next-icon} +% If 'googlescholar-name' is not provided than it defaults to +% '\firstname \lastname' +\newcommand*{\googlescholar}[2]{% + \def\@googlescholarid{#1}% + \ifthenelse{\equal{#2}{}}{% + \def\@googlescholarname{\@firstname~\@lastname}% + }{% + \def\@googlescholarname{#2}% + }% +} + +% Defines writer's extra information (optional) +% Usage: \extrainfo{} +\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}} + +% Defines writer's quote (optional) +% Usage: \quote{} +\renewcommand*{\quote}[1]{\def\@quote{#1}} + +% Defines recipient's information (cover letter only) +% Usage: \recipient{}{} +% Usage: \recipientname{} +% Usage: \recipientaddress{} +\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}} +\newcommand*{\recipientname}[1]{\def\@recipientname{#1}} +\newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}} + +% Defines the title for letter (cover letter only, optional) +% Usage: \lettertitle{} +\newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}} + +% Defines the date for letter (cover letter only) +% Usage: \letterdate{<date>} +\newcommand*{\letterdate}[1]{\def\@letterdate{#1}} + +% Defines a message of opening for letter (cover letter only) +% Usage: \letteropening{<message>} +\newcommand*{\letteropening}[1]{\def\@letteropening{#1}} + +% Defines a message of closing for letter (cover letter only) +% Usage: \letterclosing{<message>} +\newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}} + +% Defines an enclosure for letter (cover letter only, optional) +% Usage: \letterenclosure[<enclosure name>]{<enclosure>} +\newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}} +\newcommand*{\letterenclosure}[2][]{% + % if an optional argument is provided, use it to redefine \enclname + \ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}} + \def\@letterenclosure{#2} +} + + +%------------------------------------------------------------------------------- +% Commands for extra +%------------------------------------------------------------------------------- +%% Define helper macros a user can change easily +% Header +\newcommand{\acvHeaderNameDelim}{\space} +\newcommand{\acvHeaderAfterNameSkip}{.4mm} +\newcommand{\acvHeaderAfterPositionSkip}{.4mm} +\newcommand{\acvHeaderAfterAddressSkip}{-.5mm} +\newcommand{\acvHeaderIconSep}{\space} +\newcommand{\acvHeaderSocialSep}{\quad\textbar\quad} +\newcommand{\acvHeaderAfterSocialSkip}{6mm} +\newcommand{\acvHeaderAfterQuoteSkip}{5mm} + +% Others +\newcommand{\acvSectionTopSkip}{-0.1mm} +\newcommand{\acvSectionContentTopSkip}{1.5mm} + + +%------------------------------------------------------------------------------- +% Commands for utilities +%------------------------------------------------------------------------------- +% Use to align an element of tabular table +\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} + +% Use to draw horizontal line with specific thickness +\def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@} + +% Use to execute conditional statements by checking empty string +\newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}} + + +%------------------------------------------------------------------------------- +% Commands for elements of CV structure +%------------------------------------------------------------------------------- +% Define a header for CV +% Usage: \makecvheader +\newcommand*{\makecvheader}[1][C]{% + \newcommand*{\drawphoto}{% + \ifthenelse{\isundefined{\@photo}}{}{% + \newlength{\photodim} + \ifthenelse{\equal{\@photoshape}{circle}}% + {\setlength{\photodim}{1.3cm}}% + {\setlength{\photodim}{1.8cm}}% + \ifthenelse{\equal{\@photoedge}{edge}}% + {\def\@photoborder{darkgray}}% + {\def\@photoborder{none}}% + \begin{tikzpicture}% + \node[\@photoshape, draw=\@photoborder, line width=0.3mm, inner sep=\photodim, fill overzoom image=\@photo] () {}; + \end{tikzpicture} + }% + } + \newlength{\headertextwidth} + \newlength{\headerphotowidth} + \ifthenelse{\isundefined{\@photo}}{ + \setlength{\headertextwidth}{\textwidth} + \setlength{\headerphotowidth}{0cm} + }{% + \setlength{\headertextwidth}{0.76\textwidth} + \setlength{\headerphotowidth}{0.24\textwidth} + }% + \begin{minipage}[c]{\headerphotowidth}% + \ifthenelse{\equal{\@photoalign}{left}}{\raggedright\drawphoto}{} + \end{minipage} + \begin{minipage}[c]{\headertextwidth} + \ifthenelse{\equal{#1}{L}}{\raggedright}{\ifthenelse{\equal{#1}{R}}{\raggedleft}{\centering}} + \headerfirstnamestyle{\@firstname}\headerlastnamestyle{{}\acvHeaderNameDelim\@lastname}% + \\[\acvHeaderAfterNameSkip]% + \ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\[\acvHeaderAfterPositionSkip]}}% + \ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\[\acvHeaderAfterAddressSkip]}}% + \headersocialstyle{% + \newbool{isstart}% + \setbool{isstart}{true}% + \ifthenelse{\isundefined{\@mobile}}% + {}% + {% + \href{\@teluri}{\faMobile\acvHeaderIconSep\@mobile}% + \setbool{isstart}{false}% + }% + \ifthenelse{\isundefined{\@email}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{mailto:\@email}{\faEnvelope\acvHeaderIconSep\@email}% + }% + \ifthenelse{\isundefined{\@dateofbirth}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + % \mbox prevents wrapping of elements% + \mbox{\faBirthdayCake\acvHeaderIconSep\@dateofbirth}% + }% + \ifthenelse{\isundefined{\@homepage}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://\@homepage}{\faHome\acvHeaderIconSep\@homepage}% + }% + \ifthenelse{\isundefined{\@github}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://git.howdoicomputer.lol/\@github}{\faGithubSquare\acvHeaderIconSep\@github}% + }% + \ifthenelse{\isundefined{\@gitlab}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://gitlab.com/\@gitlab}{\faGitlab\acvHeaderIconSep\@gitlab}% + }% + \ifthenelse{\isundefined{\@bitbucket}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://bitbucket.com/\@bitbucket}{\faBitbucket\acvHeaderIconSep\@bitbucket}% + }% + \ifthenelse{\isundefined{\@stackoverflowid}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://stackoverflow.com/users/\@stackoverflowid}{\faStackOverflow\acvHeaderIconSep\@stackoverflowname}% + }% + \ifthenelse{\isundefined{\@linkedin}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://www.linkedin.com/in/\@linkedin}{\faLinkedin\acvHeaderIconSep\@linkedin}% + }% + \ifthenelse{\isundefined{\@orcid}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://orcid.org/\@orcid}{\faOrcid\acvHeaderIconSep\@orcid}% + }% + \ifthenelse{\isundefined{\@twitter}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://twitter.com/\@twitter}{\faTwitter\acvHeaderIconSep\@twitter}% + }% + \ifthenelse{\isundefined{\@mastodonname}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://\@mastodoninstance/@\@mastodonname}{\faMastodon\acvHeaderIconSep\@mastodonname}% + }% + \ifthenelse{\isundefined{\@skype}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \faSkype\acvHeaderIconSep\@skype% + }% + \ifthenelse{\isundefined{\@reddit}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://www.reddit.com/user/\@reddit}{\faReddit\acvHeaderIconSep\@reddit}% + }% + \ifthenelse{\isundefined{\@researchgate}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://www.researchgate.net/profile/\@researchgate}{\faResearchgate\acvHeaderIconSep\@researchgate}% + }% + \ifthenelse{\isundefined{\@xing}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://www.xing.com/profile/\@xing}{\faXingSquare\acvHeaderIconSep\@xing} + }% + \ifthenelse{\isundefined{\@medium}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://medium.com/@\@medium}{\faMedium\acvHeaderIconSep\@medium}% + }% + \ifthenelse{\isundefined{\@kaggle}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://kaggle.com/\@kaggle}{\faKaggle\acvHeaderIconSep\@kaggle}% + }% + \ifthenelse{\isundefined{\@googlescholarid}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \href{https://scholar.google.com/citations?user=\@googlescholarid}{\faGraduationCap\acvHeaderIconSep\@googlescholarname}% + }% + \ifthenelse{\isundefined{\@extrainfo}}% + {}% + {% + \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% + \@extrainfo% + }% + } \\[\acvHeaderAfterSocialSkip]% + \ifthenelse{\isundefined{\@quote}}% + {}% + {\headerquotestyle{\@quote\\}\vspace{\acvHeaderAfterQuoteSkip}}% + \end{minipage}% + \begin{minipage}[c]{\headerphotowidth}% + \ifthenelse{\equal{\@photoalign}{right}}{\raggedleft\drawphoto}{} + \end{minipage} +} + +% Define a footer for CV +% Usage: \makecvfooter{<left>}{<center>}{<right>} +\newcommand*{\makecvfooter}[3]{% + \fancyfoot{} + \fancyfoot[L]{\footerstyle{#1}} + \fancyfoot[C]{\footerstyle{#2}} + \fancyfoot[R]{\footerstyle{#3}} +} + +% Define a section for CV +% Usage: \cvsection{<section-title>} +\newcommand{\cvsection}[1]{% + \vspace{\acvSectionTopSkip} + \sectionstyle{#1} + \phantomsection + \color{sectiondivider}\vhrulefill{0.9pt} +} + +% Define a subsection for CV +% Usage: \cvsubsection{<subsection-title>} +\newcommand{\cvsubsection}[1]{% + \vspace{\acvSectionContentTopSkip} + \vspace{-3mm} + \subsectionstyle{#1} + \phantomsection +} + +% Define a paragraph for CV +\newenvironment{cvparagraph}{% + \vspace{\acvSectionContentTopSkip} + \vspace{-3mm} + \paragraphstyle +}{% + \par + \vspace{2mm} +} + +% Define an environment for cventry +\newenvironment{cventries}{% + \vspace{\acvSectionContentTopSkip} + \begin{center} +}{% + \end{center} +} +% Define an entry of cv information +% Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>} +\newcommand*{\cventry}[5]{% + \vspace{-2.0mm} + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} + \ifempty{#2#3} + {\entrypositionstyle{#1} & \entrydatestyle{#4} \\} + {\entrytitlestyle{#2} & \entrylocationstyle{#3} \\ + \entrypositionstyle{#1} & \entrydatestyle{#4} \\} + \ifstrempty{#5} + {} + {\multicolumn{2}{L{\textwidth}}{\descriptionstyle{#5}} \\} + \end{tabular*}% +} + +% Define an environment for cvsubentry +\newenvironment{cvsubentries}{% + \begin{center} +}{% + \end{center} +} +% Define a subentry of cv information +% Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>} +\newcommand*{\cvsubentry}[4]{% + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} + \setlength\leftskip{0.2cm} + \subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}} + {\subentrydatestyle{#3}}{} + \ifthenelse{\equal{#1}{}} + {} + {\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\} + \ifthenelse{\equal{#4}{}} + {} + {\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\} + \end{tabular*} +} + +% Define an environment for cvhonor +\newenvironment{cvhonors}{% + \vspace{\acvSectionContentTopSkip} + \vspace{-2mm} + \begin{center} + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{\textwidth - 4.0cm} R{2.5cm}} +}{% + \end{tabular*} + \end{center} +} +% Define a line of cv information(honor, award or something else) +% Usage: \cvhonor{<position>}{<title>}{<location>}{<date>} +\newcommand*{\cvhonor}[4]{% + \honordatestyle{#4} & \honorpositionstyle{#1}\ifempty{#2}{}{,} \honortitlestyle{#2} & \honorlocationstyle{#3} \\ +} + +% Define an environment for cvskill +\newenvironment{cvskills}{% + \vspace{\acvSectionContentTopSkip} + \vspace{-2.0mm} + \begin{center} + \setlength\tabcolsep{1ex} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{\textwidth * \real{0.9}}} +}{% + \end{tabular*} + \end{center} +} +% Define a line of cv information(skill) +% Usage: \cvskill{<type>}{<skillset>} +\newcommand*{\cvskill}[2]{% + \skilltypestyle{#1} & \skillsetstyle{#2} \\ +} + +% Define an environment for cvitems(for cventry) +\newenvironment{cvitems}{% + \vspace{-4.0mm} + \begin{justify} + \begin{itemize}[leftmargin=2ex, nosep, noitemsep] + \setlength{\parskip}{0pt} + \renewcommand{\labelitemi}{\bullet} +}{% + \end{itemize} + \end{justify} + \vspace{-4.0mm} +} + + +%------------------------------------------------------------------------------- +% Commands for elements of Cover Letter +%------------------------------------------------------------------------------- +% Define an environment for cvletter +\newenvironment{cvletter}{% + \lettertextstyle +}{% +} + +% Define a section for the cover letter +% Usage: \lettersection{<section-title>} +\newcommand{\lettersection}[1]{% + \par\addvspace{2.5ex} + \phantomsection{} + \lettersectionstyle{#1} + \color{sectiondivider}\vhrulefill{0.9pt} + \par\nobreak\addvspace{0.4ex} + \lettertextstyle +} + +% Define a title of the cover letter +% Usage: \makelettertitle +\newcommand*{\makelettertitle}{% + \vspace{8.4mm} + \setlength\tabcolsep{0pt} + \setlength{\extrarowheight}{0pt} + \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} + \recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate} + \end{tabular*} + \begin{singlespace} + \recipientaddressstyle{\@recipientaddress} \\\\ + \end{singlespace} + \ifthenelse{\isundefined{\@lettertitle}} + {} + {\lettertitlestyle{\@lettertitle} \\} + \lettertextstyle{\@letteropening} +} + +% Define a closing of the cover letter +% Usage: \makeletterclosing +\newcommand*{\makeletterclosing}{% + \vspace{3.4mm} + \lettertextstyle{\@letterclosing} \\\\ + \letternamestyle{\@firstname\ \@lastname} + \ifthenelse{\isundefined{\@letterenclosure}} + {\\} + {% + \\\\\\ + \letterenclosurestyle{\@letterenclname: \@letterenclosure} \\ + } +} diff --git a/ci/main.go b/ci/main.go new file mode 100644 index 0000000..02aa743 --- /dev/null +++ b/ci/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "context" + "fmt" + "os" + + "dagger.io/dagger" +) + +func main() { + ctx := context.Background() + + client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stdout)) + if err != nil { + panic(err) + } + defer client.Close() + + src := client.Host().Directory(".") + tex := client.Container(). + From("mingc/latex"). + WithDirectory("/doc", src). + WithWorkdir("/doc"). + WithoutMount(".git"). + WithExec([]string{"make"}) + + _, err = tex.Export(ctx, "resume.pdf") + if err != nil { + panic(err) + } + + out, err := tex.Stdout(ctx) + if err != nil { + panic(err) + } + + fmt.Println(out) +} diff --git a/coverletter.tex b/coverletter.tex new file mode 100644 index 0000000..bafcc36 --- /dev/null +++ b/coverletter.tex @@ -0,0 +1,122 @@ +%!TEX TS-program = xelatex +%!TEX encoding = UTF-8 Unicode +% Awesome CV LaTeX Template for Cover Letter +% +% This template has been downloaded from: +% https://github.com/posquit0/Awesome-CV +% +% Authors: +% Claud D. Park <posquit0.bj@gmail.com> +% Lars Richter <mail@ayeks.de> +% +% Template license: +% CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) +% + + +%------------------------------------------------------------------------------- +% CONFIGURATIONS +%------------------------------------------------------------------------------- +% A4 paper size by default, use 'letterpaper' for US letter +\documentclass[11pt, a4paper]{awesome-cv} + +% Configure page margins with geometry +\geometry{left=1.4cm, top=.8cm, right=1.4cm, bottom=1.8cm, footskip=.5cm} + +% Color for highlights +% Awesome Colors: awesome-emerald, awesome-skyblue, awesome-red, awesome-pink, awesome-orange +% awesome-nephritis, awesome-concrete, awesome-darknight +\colorlet{awesome}{awesome-red} +% Uncomment if you would like to specify your own color +% \definecolor{awesome}{HTML}{CA63A8} + +% Colors for text +% Uncomment if you would like to specify your own color +% \definecolor{darktext}{HTML}{414141} +% \definecolor{text}{HTML}{333333} +% \definecolor{graytext}{HTML}{5D5D5D} +% \definecolor{lighttext}{HTML}{999999} +% \definecolor{sectiondivider}{HTML}{5D5D5D} + +% Set false if you don't want to highlight section with awesome color +\setbool{acvSectionColorHighlight}{true} + +% If you would like to change the social information separator from a pipe (|) to something else +\renewcommand{\acvHeaderSocialSep}{\quad\textbar\quad} + + +%------------------------------------------------------------------------------- +% PERSONAL INFORMATION +% Comment any of the lines below if they are not required +%------------------------------------------------------------------------------- +% Available options: circle|rectangle,edge/noedge,left/right +\name{Tyler}{Hampton} +\position{Site Reliability Engineer{\enskip\cdotp\enskip}DevOps Engineer{\enskip\cdotp\enskip}Platform Engineer} +\address{3883 Turqouise Way. Apt 2205. Oakland. CA 94609} + +\mobile{(+1) 424-259-2819} +\email{howdoicomputer@fastmail.com} +%\dateofbirth{January 1st, 1970} +\homepage{https://howdoicomputer.lol} +\github{howdoicomputer} +\linkedin{howdoicomputer} + +%------------------------------------------------------------------------------- +% LETTER INFORMATION +% All of the below lines must be filled out +%------------------------------------------------------------------------------- +% The company being applied to +\recipient + {Company Recruitment Team} + {Google Inc.\\1600 Amphitheatre Parkway\\Mountain View, CA 94043} +% The date on the letter, default is the date of compilation +\letterdate{\today} +% The title of the letter +\lettertitle{Job Application for Software Engineer} +% How the letter is opened +\letteropening{Dear Mr./Ms./Dr. LastName,} +% How the letter is closed +\letterclosing{Sincerely,} +% Any enclosures with the letter +\letterenclosure[Attached]{Curriculum Vitae} + + +%------------------------------------------------------------------------------- +\begin{document} + +% Print the header with above personal information +% Give optional argument to change alignment(C: center, L: left, R: right) +\makecvheader[R] + +% Print the footer with 3 arguments(<left>, <center>, <right>) +% Leave any of these blank if they are not needed +\makecvfooter + {\today} + {Claud D. Park~~~·~~~Cover Letter} + {} + +% Print the title with above letter information +\makelettertitle + +%------------------------------------------------------------------------------- +% LETTER CONTENT +%------------------------------------------------------------------------------- +\begin{cvletter} + +\lettersection{About Me} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ullamcorper neque sit amet lectus facilisis sed luctus nisl iaculis. Vivamus at neque arcu, sed tempor quam. Curabitur pharetra tincidunt tincidunt. Morbi volutpat feugiat mauris, quis tempor neque vehicula volutpat. Duis tristique justo vel massa fermentum accumsan. Mauris ante elit, feugiat vestibulum tempor eget, eleifend ac ipsum. Donec scelerisque lobortis ipsum eu vestibulum. Pellentesque vel massa at felis accumsan rhoncus. + +\lettersection{Why Google?} +Suspendisse commodo, massa eu congue tincidunt, elit mauris pellentesque orci, cursus tempor odio nisl euismod augue. Aliquam adipiscing nibh ut odio sodales et pulvinar tortor laoreet. Mauris a accumsan ligula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse vulputate sem vehicula ipsum varius nec tempus dui dapibus. Phasellus et est urna, ut auctor erat. Sed tincidunt odio id odio aliquam mattis. Donec sapien nulla, feugiat eget adipiscing sit amet, lacinia ut dolor. Phasellus tincidunt, leo a fringilla consectetur, felis diam aliquam urna, vitae aliquet lectus orci nec velit. Vivamus dapibus varius blandit. + +\lettersection{Why Me?} +Duis sit amet magna ante, at sodales diam. Aenean consectetur porta risus et sagittis. Ut interdum, enim varius pellentesque tincidunt, magna libero sodales tortor, ut fermentum nunc metus a ante. Vivamus odio leo, tincidunt eu luctus ut, sollicitudin sit amet metus. Nunc sed orci lectus. Ut sodales magna sed velit volutpat sit amet pulvinar diam venenatis. + +\end{cvletter} + + +%------------------------------------------------------------------------------- +% Print the signature and enclosures with above letter information +\makeletterclosing + +\end{document} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5582140 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module main + +go 1.20 + +require ( + dagger.io/dagger v0.8.4 // indirect + github.com/99designs/gqlgen v0.17.31 // indirect + github.com/Khan/genqlient v0.6.0 // indirect + github.com/adrg/xdg v0.4.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/vektah/gqlparser/v2 v2.5.6 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.10.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..afa8b39 --- /dev/null +++ b/go.sum @@ -0,0 +1,38 @@ +dagger.io/dagger v0.8.4 h1:2zNu40cBvPZc/CSgMnLRfayfQj5VtbJlDtWJyWGwGSQ= +dagger.io/dagger v0.8.4/go.mod h1:Nwl7WI8YETaZhGjPJvkiOZnKLJXBaJOkSarp5m4+FxA= +github.com/99designs/gqlgen v0.17.31 h1:VncSQ82VxieHkea8tz11p7h/zSbvHSxSDZfywqWt158= +github.com/99designs/gqlgen v0.17.31/go.mod h1:i4rEatMrzzu6RXaHydq1nmEPZkb3bKQsnxNRHS4DQB4= +github.com/Khan/genqlient v0.6.0 h1:Bwb1170ekuNIVIwTJEqvO8y7RxBxXu639VJOkKSrwAk= +github.com/Khan/genqlient v0.6.0/go.mod h1:rvChwWVTqXhiapdhLDV4bp9tz/Xvtewwkon4DpWWCRM= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/vektah/gqlparser/v2 v2.5.6 h1:Ou14T0N1s191eRMZ1gARVqohcbe1e8FrcONScsq8cRU= +github.com/vektah/gqlparser/v2 v2.5.6/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/resume.tex b/resume.tex new file mode 100644 index 0000000..6c453eb --- /dev/null +++ b/resume.tex @@ -0,0 +1,101 @@ +%!TEX TS-program = xelatex +%!TEX encoding = UTF-8 Unicode +% Awesome CV LaTeX Template for CV/Resume +% +% This template has been downloaded from: +% https://github.com/posquit0/Awesome-CV +% +% Author: +% Claud D. Park <posquit0.bj@gmail.com> +% http://www.posquit0.com +% +% Template license: +% CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) +% + + +%------------------------------------------------------------------------------- +% CONFIGURATIONS +%------------------------------------------------------------------------------- +% A4 paper size by default, use 'letterpaper' for US letter +\documentclass[11pt, a4paper]{awesome-cv} + +% Configure page margins with geometry +\geometry{left=1.4cm, top=.8cm, right=1.4cm, bottom=1.8cm, footskip=.5cm} + +% Color for highlights +% Awesome Colors: awesome-emerald, awesome-skyblue, awesome-red, awesome-pink, awesome-orange +% awesome-nephritis, awesome-concrete, awesome-darknight +\colorlet{awesome}{awesome-emerald} +% Uncomment if you would like to specify your own color +% \definecolor{awesome}{HTML}{3E6D9C} + +% Colors for text +% Uncomment if you would like to specify your own color +% \definecolor{darktext}{HTML}{414141} +% \definecolor{text}{HTML}{333333} +% \definecolor{graytext}{HTML}{5D5D5D} +% \definecolor{lighttext}{HTML}{999999} +% \definecolor{sectiondivider}{HTML}{5D5D5D} + +% Set false if you don't want to highlight section with awesome color +\setbool{acvSectionColorHighlight}{true} + +% If you would like to change the social information separator from a pipe (|) to something else +\renewcommand{\acvHeaderSocialSep}{\quad\textbar\quad} + + +%------------------------------------------------------------------------------- +% PERSONAL INFORMATION +% Comment any of the lines below if they are not required +%------------------------------------------------------------------------------- +% Available options: circle|rectangle,edge/noedge,left/right +% \photo[rectangle,edge,right]{./examples/profile} +\name{Tyler}{Hampton} +\position{Systems Engineer{\enskip\cdotp\enskip}SRE{\enskip\cdotp\enskip}Platform Engineer{\enskip\cdotp\enskip}DevOps Engineer} +\address{3883 Turqouise Way Apt 2205, Oakland CA, 94609} + +\mobile{(+1) 424-259-2819} +\email{howdoicomputer@fastmail.com} +%\dateofbirth{January 1st, 1970} +\homepage{howdoicomputer.lol} +\github{howdoicomputer} +\linkedin{howdoicomputer} +% \extrainfo{extra information} + +% \quote{``Be the change that you want to see in the world."} + + +%------------------------------------------------------------------------------- +\begin{document} + +% Print the header with above personal information +% Give optional argument to change alignment(C: center, L: left, R: right) +\makecvheader[C] + +% Print the footer with 3 arguments(<left>, <center>, <right>) +% Leave any of these blank if they are not needed +\makecvfooter + {\today} + {Tyler Hampton~~~·~~~Résumé} + {\thepage} + + +%------------------------------------------------------------------------------- +% CV/RESUME CONTENT +% Each section is imported separately, open each file in turn to modify content +%------------------------------------------------------------------------------- +\input{sections/summary.tex} +\input{sections/experience.tex} +% \input{resume/honors.tex} +% \input{resume/certificates.tex} +% \input{resume/presentation.tex} +% \input{resume/writing.tex} +% \input{resume/committees.tex} +\input{sections/education.tex} +\input{sections/extracurricular.tex} +\input{sections/hobbies.tex} + + +%------------------------------------------------------------------------------- +\end{document} diff --git a/sections/certificates.tex b/sections/certificates.tex new file mode 100644 index 0000000..b985e96 --- /dev/null +++ b/sections/certificates.tex @@ -0,0 +1,10 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Certificates} +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvhonors} +%--------------------------------------------------------- +\end{cvhonors} diff --git a/sections/committees.tex b/sections/committees.tex new file mode 100644 index 0000000..c66acb6 --- /dev/null +++ b/sections/committees.tex @@ -0,0 +1,13 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Program Committees} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvhonors} + +%--------------------------------------------------------- +\end{cvhonors} diff --git a/sections/education.tex b/sections/education.tex new file mode 100644 index 0000000..211a224 --- /dev/null +++ b/sections/education.tex @@ -0,0 +1,25 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Education} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cventries} + +%--------------------------------------------------------- + \cventry + {Computer Science and Business} % Degree + {DeAnza College} % Institution + {Cupertino, CA} % Location + {Mar. 2010 - Aug. 2012} % Date(s) + { + \begin{cvitems} % Description(s) bullet points + \item {Was double majoring in computer science and business} + \end{cvitems} + } + +%--------------------------------------------------------- +\end{cventries} diff --git a/sections/experience.tex b/sections/experience.tex new file mode 100644 index 0000000..9d606db --- /dev/null +++ b/sections/experience.tex @@ -0,0 +1,130 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Work Experience} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cventries} + +%--------------------------------------------------------- + \cventry + {Senior Systems Engineer \& Site Architecture Lead} % Job title + {Grabango} % Organization + {Berkeley, CA, USA} % Location + {September 26. 2022 - Present} % Date(s) + { + \begin{cvitems} % Description(s) of tasks/responsibilities + \item {Mentor and technical lead for DevOps team} + \item {Implemented a HashiCorp Nomad based orchestration system that allocated services across thousands of IoT devices as part of a hybrid infrastructure system bridging physical locations and GCP cloud infrastructure} + \item {Used Dagger and Go to build portable, localized CI/CD pipelines using Docker; used the same Dagger/Go combo to create developer tooling to enable a Platform-as-Service model for deploying services to on-premise infrastructure via Nomad} + \item {Lead meetings and facilitated cultural shifts for adopting SRE practices such as SLIs/SLOs and production readiness checklists} + \item {Lead an internal architecture group involving staff and principal engineers to improve the architecture of physical sites and introduce cultural standards for engineering excellence} + \item {Managed GCP Kubernetes clusters via Terraform and enabled a self-service model by building Helm based deployment pipelines using Jenkins} + \item {Heavily refactored SaltStack codebase to improve idempotency and general code quality as well as make use of Salt's more advanced features like orchestration and event-driven actions} + \item {Co-led a migration to Ansible in an effort to abstract application deployment to Nomad and better define the responsibilities of a configuration management system} + \item {Built a monitoring system with Prometheus, Thanos, Grafana, and Consul that used service discovery to auto-configure application metrics collection} + \item {Improved monitoring, resiliency, and performance for complex storage systems built on top of ZFS} + \item {Retooled AI/ML image inference event streaming architecture by replacing Kafka with RedPanda for improved reliability and performance} + \item {Designed extensive caching layers for package types going to physical sites using pull-through Docker registry caches for container images and Nginx proxies for raw package types} + \item {Lead migration from Nexus, internal PyPi, and Google Artifact Registry to Cloudsmith in order to centralize artifact management, improve supported artifact types, reduce complexity, and save costs} + \item {Wrote Golang based CLI tooling for the systems engineering team to automate several day-to-day tasks around ticket management, SaltStack state application, k8s automation, and more} + \item {Designed Terraform usage patterns and code organization and led a multi-month initiative to import hand-spun GCP infrastructure into Terraform state} + \end{cvitems} + } + +%--------------------------------------------------------- + \cventry + {Senior Systems Engineer} % Job title + {Shutterfly} % Organization + {Santa Clara, CA, USA} % Location + {June 22. 2016 - September 9. 2022} % Date(s) + { + \begin{cvitems} + \item {Technical lead for Cloud Platform team with a head count of 10 engineers} + \item {Onboarded, mentored, and helped grow several engineers and interns while at Shutterfly} + \item {Part of committee of principal, staff, and architect contributors to build a larger architectural model for a migration from data center to AWS} + \item {Migrated over 100 microservices of varying languages to Amazon ECS} + \item {Designed several large, foundational Terraform modules that were used by ~200 engineers to deploy Security Groups, Elastic Container Service clusters, IAM entities, VPCs, ALBS, and more} + \item {Designed a AWS global resource testing model that used AWS accounts as test environments for globally available resources like IAM entitites} + \item {Wrote a custom reverse proxy in Go to facilitate a maximized inverse cache hit rate in order to support a legacy .NET application} + \item {Wrote custom log ingress filters in Node.js on AWS Lambda for translating log entries into structured log events for Splunk ingress} + \item {Wrote custom tooling around AWS ECS in Python to enforce draining nodes from tasks during abrupt scaling events} + \item {Performed capacity planning in accordance with load testing results and metrics to right size capacity} + \item {Embedded into application teams to assist them with the cloud-native architectural designs of their services} + \item {Designed cloud logging architecture utlizing FluentD, FluentBit, and logging sidecars for log ingestion over PrivateLink into Splunk} + \item Wrote custom FluentBit plugins in Ruby to support generalized logging event patterns for applications running on ECS + \item {Wrote Terraform module to abstract AWS Kinesis Streams and then assisted teams with a migration away from Kafka} + \item {Designed immutable infrastructure pipeline using Jenkins pipelines, Ansible playbooks, and Packer to produce AWS AMIs that fed into EC2 nodes within autoscaling groups} + \item {Wrote custom integrations for running GPU dependent tasks on ECS nodes in order to support complex topgraphical image generation} + \item {Wrote CLI tooling in Go for Cloud Platform team to automate checking ECS clusters, interacting with internal HTTP endpoints, and more} + \item {Extended and customized aws-azure-login Node.js application to support logging into accounts federated to AWS from Azure AD via SAML} + \item {Co-designed a hub and spoke model that used AWS accounts as a security and management segregation layer for environments with Transit Gateway linking all of the environments together} + \end{cvitems} + } + + %% \cventry + %% {} + %% {} + %% {} + %% {} + %% { + %% \begin{cvitems} + %% \item {Eliminated Nagios CPU bottleneck by retooling clusters to run PyPy} + %% \item {Wrote CLI tooling in Go for Cloud Platform team to automate checking ECS clusters, interacting with internal HTTP endpoints, and more} + %% \item {Designed and wrote an access system in Go and Terraform that created jumphosts scoped to a team and then synced SSH keys to them for internal network access} + %% \item {Replaced that SSH system with AWS Systems Manager when the product was releases in order to improve security and better integrate access control with IAM} + %% \item {Extended and customized aws-azure-login Node.js application to support logging into accounts federated to AWS from Azure AD via SAML} + %% \item {Co-designed a hub and spoke model that used AWS accounts as a security and management segregation layer for environments with Transit Gateway linking all of the environments together} + %% \item {Managed account creation process for dozens of AWS accounts} + %% \item {Heavily pushed for testing Infrastructure-as-Code by introducing and establishing testing patterns for Terraform modules and EC2 instance OS state} + %% \end{cvitems} + %% } + +%--------------------------------------------------------- + \cventry + {Software Engineer, Infrastructure and Operations} % Job title + {Opower / Oracle} % Organization + {San Francisco, USA} % Location + {January 12. 2015 - May 23. 2016} % Date(s) + { + \begin{cvitems} % Description(s) of tasks/responsibilities + \item {Refactored and wrote Puppet manifests to converge data center localized hardware nodes to prepare them as Proxmox hosts} + \item {Co-designed with DBA a distributed file system storage array using Ceph} + \item {Designed resilient high-availability MySQL cluster using Heartbeat to float a VIP between multiple masters} + \item {Maintained several applications deployed via Proxmox as VMs that were converged via Puppet} + \item {Wrote a tool in Ruby that migrated Opower from FreeIPA to Active Directory} + \item {Designed and implemented Active Directory sync mechanism to Proxmox VMs via SSSD (System Security Services Daemon)} + \end{cvitems} + } + +%--------------------------------------------------------- + \cventry + {DevOps Engineer} % Job title + {InsideVault} % Organization + {San Carlos, CA, USA} % Location + {Febuary 24. 2014 - December 15. 2015} % Date(s) + { + \begin{cvitems} + \item {Managed MongoDB cluster used by SEO optmization platform} + \item {Used Jenkins to build testing and deployment pipelines for Scala applications using sbt} + \item {Wrote Chef cookbooks for deploying Apache Mesos cluster members to EC2} + \item {Managed Apache Mesus cluster that was used for distributed batch processing} + \end{cvitems} + } +%--------------------------------------------------------- + \cventry + {Systems Administrator} % Job title + {Apollo Group} % Organization + {San Jose, CA, USA} % Location + {January 23. 2012 - January 10. 2014} % Date(s) + { + \begin{cvitems} % Description(s) of tasks/responsibilities + \item {Wrote a custom deployment web UI using Ruby and jQuery to integrate Chef, AWS EC2 nodes, and Haproxy to serve as the main deployment interface for ~100 engineers for a dozen of Java based microservices} + \item {Wrote Chef cookbooks that converged EC2 nodes so that they could run Java based applications} + \item {Rewrote the aforementioned deployment tool as part of a migration from AWS to a data center platform runnign VMWare VSphere} + \end{cvitems} + } +\end{cventries} diff --git a/sections/extracurricular.tex b/sections/extracurricular.tex new file mode 100644 index 0000000..1cf8798 --- /dev/null +++ b/sections/extracurricular.tex @@ -0,0 +1,27 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Extracurricular Activity} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cventries} + +%--------------------------------------------------------- + \cventry + {Core Member} % Affiliation/role + {Code for America} % Organization/group + {Code for San Jose, San Jose, CA} % Location + {Jun. 2010 - Jun. 2017} % Date(s) + { + \begin{cvitems} % Description(s) of experience/contributions/knowledge + \item {Mentored and onboarded community engineers and local college students into the Code for America organization} + \item {Project lead and main contributor for CaliDrought - a Node.js API that collected drought information from the U.S. government} + \item {Secondary contributor for CaliDroughtViz - a React application using D3.js to visualize drought impact data for California} + \item {Helped run the chapter through various volunteer activities like managing the treasury and running events} + \end{cvitems} + } +%--------------------------------------------------------- +\end{cventries} diff --git a/sections/hobbies.tex b/sections/hobbies.tex new file mode 100644 index 0000000..6033f8b --- /dev/null +++ b/sections/hobbies.tex @@ -0,0 +1,63 @@ +\cvsection{Homelab} +\begin{cventries} + \cventry + {} + {} + {} + {} + { + \begin{cvitems} + \item {Three nodes are a k3s cluster running on Raspberry Pis with MetalLB in layer2 mode to serve as a load balancer} + \item {The k3s cluster uses Ansible to converge an Ubuntu OS and the persistent volumes are satisfied by a consumer NAS} + \item {The fourth physical node is a consumer grade hardware box with prosumer hybrid drives in a ZFS mirrored pool. The node is named megamind.} + \item {Megamind's underlying operating system is NixOS} + \item {Megamind runs its services via Nomad, Consul, Vault} + \item {Individual applications are able to publish their metrics endpoints to Consul and then have their metrics collected via Prometheseus and displayed using Grafana} + \item {Cloudflare handles DNS with subdomains routing to specific services via Traefik} + \item {The host runs a dozen applications including custom Go and Elixir services} + \item {Changing OS state is done via Nix flakes and is immutable with seamless rollback on error} + \end{cvitems} + } +\end{cventries} + +\cvsection{Hobbies} +\begin{cventries} + \cventry + {} + {} + {} + {} + { + \begin{cvitems} + \item {Board games, rock climbing, science fiction and fantasy books, table top RPGs, programming} + \end{cvitems} + } +\end{cventries} + +\cvsection{Skills} +\begin{cventries} + \cventry + {} + {} + {} + {} + { + \begin{cvitems} + \item {Bash, Nomad, Terraform, Python, Node.js, TypeScript, Kubernetes, k8s, Elixir, Nix, Docker, AWS, ECS, Helm, TCP/IP, Prometheus, Consul, Vault, Linux, Go, SaltStack, Ansible, Puppet, Chef, git, DNS, GCP, ZFS, Docker, SQL, Kafka, Grafana, cloud} + \end{cvitems} + } +\end{cventries} + +\cvsection{Resume Source Code} +\begin{cventries} + \cventry + {} + {} + {} + {} + { + \begin{cvitems} + \item \href{https://git.howdoicomputer.lol/howdoicomputer/resume}{https://git.howdoicomputer.lol/howdoicomputer/resume} + \end{cvitems} + } +\end{cventries} diff --git a/sections/honors.tex b/sections/honors.tex new file mode 100644 index 0000000..ca22703 --- /dev/null +++ b/sections/honors.tex @@ -0,0 +1,48 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Honors \& Awards} + + +%------------------------------------------------------------------------------- +% SUBSECTION TITLE +%------------------------------------------------------------------------------- +\cvsubsection{International Awards} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvhonors} + +%--------------------------------------------------------- +\end{cvhonors} + + +%------------------------------------------------------------------------------- +% SUBSECTION TITLE +%------------------------------------------------------------------------------- +\cvsubsection{Domestic Awards} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvhonors} + +%--------------------------------------------------------- +\end{cvhonors} + +%------------------------------------------------------------------------------- +% SUBSECTION TITLE +%------------------------------------------------------------------------------- +\cvsubsection{Community} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvhonors} + +%--------------------------------------------------------- +\end{cvhonors} diff --git a/sections/presentation.tex b/sections/presentation.tex new file mode 100644 index 0000000..5c6641c --- /dev/null +++ b/sections/presentation.tex @@ -0,0 +1,10 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Presentation} +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cventries} +%--------------------------------------------------------- +\end{cventries} diff --git a/sections/summary.tex b/sections/summary.tex new file mode 100644 index 0000000..f183198 --- /dev/null +++ b/sections/summary.tex @@ -0,0 +1,16 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Summary} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cvparagraph} + +%--------------------------------------------------------- +Have led growth at infrastructure departments in five different companies. 10+ years of diverse software engineering experience with specialties in large-scale container orchestration systems, polished developer platforms, cloud architectures, and more. + +Enthusiastic tinkerer. Perpetual homelabber. Prefers a command line interface environment as a big fan of Emacs, Linux, and open-source. +\end{cvparagraph} diff --git a/sections/writing.tex b/sections/writing.tex new file mode 100644 index 0000000..32678a0 --- /dev/null +++ b/sections/writing.tex @@ -0,0 +1,13 @@ +%------------------------------------------------------------------------------- +% SECTION TITLE +%------------------------------------------------------------------------------- +\cvsection{Writing} + + +%------------------------------------------------------------------------------- +% CONTENT +%------------------------------------------------------------------------------- +\begin{cventries} + +%--------------------------------------------------------- +\end{cventries}