Compare commits
140 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de42646ae5 | ||
|
|
c543a78033 | ||
|
|
50f5741041 | ||
|
|
0c17821874 | ||
|
|
7079ad4b1d | ||
|
|
98c972cc90 | ||
|
|
2b19a1d2f8 | ||
|
|
86e5716d33 | ||
|
|
4a96954c2d | ||
|
|
9cfaae18d7 | ||
|
|
b128e9d6f5 | ||
|
|
173cd383e4 | ||
|
|
93643d0881 | ||
|
|
c5bc7e291d | ||
|
|
f30e3fbe71 | ||
|
|
d7c2207eca | ||
|
|
f62ab35fa8 | ||
|
|
a2a6cccd93 | ||
|
|
523c4fd9a6 | ||
|
|
fb68fce267 | ||
|
|
95c4253e26 | ||
|
|
8e246d07be | ||
|
|
76ea44a124 | ||
|
|
a3f7753a71 | ||
|
|
e23d61a4f0 | ||
|
|
155bba7b5a | ||
|
|
143ae9ba04 | ||
|
|
0512028c40 | ||
|
|
78e6af29ed | ||
|
|
fce00bad38 | ||
|
|
be5671616f | ||
|
|
e8bd522a52 | ||
|
|
30fdbe31f9 | ||
|
|
6c9d11f035 | ||
|
|
47c11b8fba | ||
|
|
de9d53f494 | ||
|
|
712881ad02 | ||
|
|
41cee6f459 | ||
|
|
e3e14d6ed0 | ||
|
|
8ae43a6356 | ||
|
|
9068fa6647 | ||
|
|
c72098a66c | ||
|
|
3d2c4ef882 | ||
|
|
ddf2af808c | ||
|
|
a66222e143 | ||
|
|
5570e6edbe | ||
|
|
5b3106f981 | ||
|
|
5f51d1564e | ||
|
|
e295b06efe | ||
|
|
143dabb7d9 | ||
|
|
cc81b47e49 | ||
|
|
e7ed323f2c | ||
|
|
507f3436c7 | ||
|
|
077a03c35e | ||
|
|
a504c357c5 | ||
|
|
c24ab809a5 | ||
|
|
76aa1a20cf | ||
|
|
d4560d05fd | ||
|
|
96af96b22b | ||
|
|
7864a95eb1 | ||
|
|
a8a0cbad96 | ||
|
|
9a320d1a43 | ||
|
|
2fcd38ef01 | ||
|
|
10f199a93d | ||
|
|
97e5f3150f | ||
|
|
0735f99f65 | ||
|
|
9c3c235073 | ||
|
|
afa43aafdf | ||
|
|
6767833e8e | ||
|
|
09608c5938 | ||
|
|
8184467dc2 | ||
|
|
edaf7b7efd | ||
|
|
16966c4753 | ||
|
|
ab38461d16 | ||
|
|
83a00d5034 | ||
|
|
f238e32e1f | ||
|
|
dff3bf2179 | ||
|
|
30baf3ffef | ||
|
|
a925580e89 | ||
|
|
8b2e8e39fd | ||
|
|
d94ddad195 | ||
|
|
204aee596d | ||
|
|
28cf47111f | ||
|
|
046903a7f5 | ||
|
|
c1224ff604 | ||
|
|
4a2e8dc48b | ||
|
|
949f968245 | ||
|
|
9cc98adfae | ||
|
|
af2db988fb | ||
|
|
aba83156ee | ||
|
|
ae6ed10323 | ||
|
|
0c06d17407 | ||
|
|
c6fc22b178 | ||
|
|
d1278dc5b7 | ||
|
|
e6c1d153b7 | ||
|
|
88c4caf3a0 | ||
|
|
0e640d0219 | ||
|
|
7ee12afe20 | ||
|
|
2ef773b4fe | ||
|
|
ded72f67ed | ||
|
|
d478599217 | ||
|
|
cd7251ee45 | ||
|
|
98fd145856 | ||
|
|
4adaa14452 | ||
|
|
1e5b251590 | ||
|
|
e97fcc2d8c | ||
|
|
8b1d395f19 | ||
|
|
c714db922b | ||
|
|
6e98d349e8 | ||
|
|
196bcac6dd | ||
|
|
abd6e369da | ||
|
|
eda630dcde | ||
|
|
23b6271f36 | ||
|
|
f0c9b1c3a4 | ||
|
|
dadd94778b | ||
|
|
36b285f706 | ||
|
|
99b97efd80 | ||
|
|
7deca1b9c9 | ||
|
|
49314cc0c5 | ||
|
|
d69c76f85b | ||
|
|
1d258f18ed | ||
|
|
38390a780c | ||
|
|
38470725a6 | ||
|
|
aa7795215e | ||
|
|
057251fecc | ||
|
|
204670a626 | ||
|
|
476bc0ea10 | ||
|
|
7538839ade | ||
|
|
91d7b82988 | ||
|
|
56d847ea1e | ||
|
|
98e1f7c8cb | ||
|
|
702dea753e | ||
|
|
98475466e1 | ||
|
|
b21e6a3013 | ||
|
|
63f7a83318 | ||
|
|
32e836579f | ||
|
|
5c0ea418d5 | ||
|
|
9393801259 | ||
|
|
c9be79a3c8 | ||
|
|
f8d95489bb |
7
.firebase/hosting.ZGVwbG95L3B1YmxpYw.cache
Normal file → Executable file
7
.firebase/hosting.ZGVwbG95L3B1YmxpYw.cache
Normal file → Executable file
@@ -1,3 +1,4 @@
|
||||
index.html,1616964719736,3f99d785be835c8aff1990faf8bf678d2779414226c3ba41a6bf8210c9044e85
|
||||
resume.css,1616964719738,9561dffbb8787cf3367cce3e3eb1169b74852e6fe7c4f8422bf9ad39affdd2d8
|
||||
resume.pdf,1616964719741,81d95603bad78aa3f433e5acd87ad92afb7d4a765684b662b4d237524603d4d0
|
||||
index.html,1697076028715,3bd03c4d83dbeb2ed2b7bee9267742390fb06c0bee7086dc5befae5529fcbca2
|
||||
BreeLaPointeResume.pdf,1697076028715,e65c67dce31a4e83006e2876b59398353a76ef1c3884fee6bdfb15a1a69745fb
|
||||
fonts/Lato-Bold.ttf,1697076028715,e77763dcc0ed479b272159ee5dad99264d0cea536b5fd3072504d6687e18ba54
|
||||
fonts/Lato-Regular.ttf,1697076028715,1272611e0b7f2015372f7ff6bce5bd351b5746578cbaff916ed6c0bf67f84e10
|
||||
|
||||
0
.firebaserc
Normal file → Executable file
0
.firebaserc
Normal file → Executable file
4
.gitignore
vendored
Normal file → Executable file
4
.gitignore
vendored
Normal file → Executable file
@@ -1,7 +1,11 @@
|
||||
**/*.sw*
|
||||
/.firebase/*.cache
|
||||
**/*.pdf
|
||||
resume
|
||||
**/*.tar
|
||||
deploy
|
||||
vendor
|
||||
firebase-debug.log
|
||||
/**/node_modules
|
||||
/json-resume/out
|
||||
!/open-resume.com.d/resume.pdf
|
||||
|
||||
86
.harness/firebase-deploy.yaml
Normal file
86
.harness/firebase-deploy.yaml
Normal file
@@ -0,0 +1,86 @@
|
||||
version: 1
|
||||
kind: pipeline
|
||||
spec:
|
||||
stages:
|
||||
- name: debug
|
||||
type: ci
|
||||
spec:
|
||||
steps:
|
||||
- name: debug
|
||||
type: run
|
||||
spec:
|
||||
name: debug
|
||||
container: alpine/git
|
||||
shell: sh
|
||||
script: |
|
||||
export build_event=${{ build.event }}
|
||||
export build_target=${{ build.target }}
|
||||
export build_before=${{ build.before }}
|
||||
export build_after=${{ build.after }}
|
||||
env | grep ^build_
|
||||
git --no-pager diff --name-only $build_before..$build_after
|
||||
- name: dockers
|
||||
type: ci
|
||||
spec:
|
||||
volumes:
|
||||
- name: dockersock
|
||||
spec: {}
|
||||
type: temp
|
||||
steps:
|
||||
- name: dind
|
||||
when: build.event == "push" && build.target == "main"
|
||||
type: background
|
||||
spec:
|
||||
container:
|
||||
image: registry-app.inhome.blapointe.com:5001/docker:latest
|
||||
privileged: true
|
||||
mount:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
- name: docker
|
||||
type: run
|
||||
when: build.event == "push" && build.target == "main"
|
||||
spec:
|
||||
name: docker
|
||||
container: registry-app.inhome.blapointe.com:5001/docker:latest
|
||||
mount:
|
||||
- name: dockersock
|
||||
path: /var/run
|
||||
shell: sh
|
||||
script: |
|
||||
set -ueo pipefail
|
||||
|
||||
export build_before=${{ build.before }}
|
||||
export build_after=${{ build.after }}
|
||||
|
||||
apk add --no-cache git
|
||||
t=registry-app.inhome.blapointe.com:5001/portfolio/resume/builder:latest
|
||||
if git diff --name-only $build_before..$build_after | grep Dockerfile.cicd; then
|
||||
until docker ps; do
|
||||
sleep 5
|
||||
done
|
||||
docker build -t "$t" -f ./Dockerfile.cicd .
|
||||
docker push "$t"
|
||||
fi
|
||||
- name: build
|
||||
type: ci
|
||||
spec:
|
||||
steps:
|
||||
- name: build
|
||||
type: run
|
||||
when: build.event == "push" && build.target == "main"
|
||||
spec:
|
||||
name: build
|
||||
container:
|
||||
image: registry-app.inhome.blapointe.com:5001/portfolio/resume/builder:latest
|
||||
user: root
|
||||
envs:
|
||||
FIREBASE_CI_TOKEN: ${{ secrets.get("resume-firebase-squeaky2x3-gmail-token") }}
|
||||
GITLAB_PAT: ${{ secrets.get("resume-gitlab-gitlab-breel-dev-token") }}
|
||||
shell: sh
|
||||
script: |
|
||||
export build_before=${{ build.before }}
|
||||
export build_after=${{ build.after }}
|
||||
if git --no-pager diff --name-only $build_before..$build_after | grep src.homebrew; then
|
||||
bash ./deploy.firebase.sh
|
||||
fi
|
||||
9
.vale.ini
Normal file
9
.vale.ini
Normal file
@@ -0,0 +1,9 @@
|
||||
StylesPath = styles
|
||||
|
||||
MinAlertLevel = suggestion
|
||||
|
||||
Packages = proselint, write-good, Readability, Joblint
|
||||
|
||||
[*]
|
||||
BasedOnStyles = Vale, proselint, write-good, Readability, Joblint
|
||||
|
||||
14
Dockerfile.cicd
Normal file
14
Dockerfile.cicd
Normal file
@@ -0,0 +1,14 @@
|
||||
FROM jdkato/vale:latest as vale
|
||||
|
||||
FROM andreysenov/firebase-tools:latest
|
||||
|
||||
USER root
|
||||
|
||||
RUN echo installing dependencies...
|
||||
RUN apt -y install git woff2 bash
|
||||
|
||||
RUN echo copying vale...
|
||||
COPY --from=vale /bin/vale /bin/vale
|
||||
|
||||
RUN echo OK
|
||||
|
||||
Binary file not shown.
18
README.md
Executable file
18
README.md
Executable file
@@ -0,0 +1,18 @@
|
||||
# Resume
|
||||
|
||||
1. modify [homebrew.yaml](./src/homebrew/homebrew.yaml)
|
||||
1. generate `cd ./src/homebrew; bash ./homebrew.sh`
|
||||
1. `open ./src/homebrew/homebrew.html`
|
||||
1. `ctrl + p` and save as pdf
|
||||
1. commit + push
|
||||
|
||||
## CICD
|
||||
|
||||
1. `gitness.inhome.blapointe.com` has a `./.harness` pipeline
|
||||
1. the pipeline
|
||||
1. renders [Resume](#resume) as `$(mktemp -d)/public`
|
||||
1. clones [gitlab](https://gitlab.com/breel/resume.git)
|
||||
1. replaces [gitlab](https://gitlab.com/breel/resume.git) with `.../public/`
|
||||
1. pushes [gitlab](https://gitlab.com/breel/resume.git)
|
||||
1. [render](https://dashboard.render.com/static/srv-cklkk8o710pc73d7fn7g) detects public repo event and updates its static site hosting for [breel.dev](https://breel.dev)
|
||||
1. [firebase](https://console.firebase.google.com/u/0/project/blapointe-com/overview) deploys `.../public/` for [blapointe.com](https://blapointe.com)
|
||||
94
deploy.firebase.sh
Normal file → Executable file
94
deploy.firebase.sh
Normal file → Executable file
@@ -1,24 +1,92 @@
|
||||
#! /bin/bash
|
||||
#! /bin/sh
|
||||
|
||||
set -o pipefail
|
||||
set -e
|
||||
set -u
|
||||
|
||||
if ! which firebase; then
|
||||
echo curl -sL https://firebase.tools | upgrade=true bash
|
||||
cd src
|
||||
|
||||
if which vale; then
|
||||
f=$(mktemp)
|
||||
cp homebrew/homebrew.yaml $f
|
||||
vale sync
|
||||
vale $f || true
|
||||
fi
|
||||
|
||||
outdir=./deploy
|
||||
if tty && ! which firebase; then
|
||||
f="$(mktemp)"
|
||||
wget https://firebase.tools -O - > "$f"
|
||||
export upgrade=true
|
||||
sudo bash "$f"
|
||||
fi
|
||||
which firebase
|
||||
|
||||
outdir=$(mktemp -d)
|
||||
cleanup() {
|
||||
rm -rf "$outdir"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
rm -rf $outdir
|
||||
mkdir -p $outdir/public
|
||||
cp ./resume.md-main/resume.html $outdir/public/index.html
|
||||
cp ./resume.md-main/resume.css $outdir/public/
|
||||
cp ./resume.md-main/resume.pdf $outdir/public/
|
||||
cp homebrew/homebrew.html $outdir/public/index.html
|
||||
cp -r ./homebrew/fonts $outdir/public/
|
||||
|
||||
firebase login
|
||||
echo firebase init
|
||||
firebase deploy || (
|
||||
firebase logout
|
||||
firebase login
|
||||
firebase deploy
|
||||
(
|
||||
if ! which woff2_compress; then
|
||||
sudo apt -y install woff2
|
||||
fi
|
||||
set -ueo pipefail
|
||||
for f in "$outdir"/public/fonts/*.ttf; do
|
||||
echo ttf to woff2 for "$f"
|
||||
if [ -f "$f" ]; then
|
||||
woff2_compress "$f"
|
||||
rm "$f"
|
||||
fi
|
||||
basename_f="${f##*/}"
|
||||
find "$outdir/public" -type f | grep -v public.fonts | while read -r f2; do
|
||||
sed -i "s#$basename_f#${basename_f%.ttf}.woff2#g" "$f2"
|
||||
done
|
||||
echo asserting no $basename_f
|
||||
! grep -R "$basename_f" "$outdir/public"
|
||||
echo asserting ${basename_f%.ttf}.woff2
|
||||
grep -R "${basename_f%.ttf}.woff2" "$outdir/public"
|
||||
done
|
||||
du -sh "$outdir/public/fonts/"*
|
||||
)
|
||||
|
||||
cp -r ../firebase.json ../.firebaserc ../.firebase $outdir/
|
||||
sed -i "s#deploy/public#public#" $outdir/firebase.json
|
||||
cd $outdir
|
||||
|
||||
(
|
||||
set -ueo pipefail
|
||||
if [ -n "$GITLAB_PAT" ]; then
|
||||
export HOME="$(mktemp -d)"
|
||||
git clone https://gitlab%40breel.dev:"$GITLAB_PAT"@gitlab.com/breel/resume.git gitlab-resume.d
|
||||
git config --global user.name "gitlab@breel.dev"
|
||||
git config --global user.email "gitlab@breel.dev"
|
||||
rm -rf ./gitlab-resume.d/*
|
||||
cp -r ./public/* ./gitlab-resume.d/
|
||||
cd ./gitlab-resume.d/
|
||||
git add -A :/
|
||||
git commit -m "$(date -u +%Y-%m-%dT%H:%M:%S)"
|
||||
git push origin main
|
||||
fi
|
||||
) || true
|
||||
|
||||
(
|
||||
set -ueo pipefail
|
||||
echo firebase uses squeaky2x3@gmail.com
|
||||
! tty || firebase login
|
||||
echo firebase init
|
||||
args=()
|
||||
log_args=()
|
||||
if ! tty; then
|
||||
args+=("--token" "$FIREBASE_CI_TOKEN")
|
||||
log_args+=("--token" "${FIREBASE_CI_TOKEN:0:1}")
|
||||
test "${FIREBASE_CI_TOKEN:0:1}" != "$"
|
||||
fi
|
||||
echo firebase deploy "${log_args[@]}"
|
||||
firebase deploy "${args[@]}"
|
||||
)
|
||||
|
||||
29
deploy.sh
29
deploy.sh
@@ -1,29 +0,0 @@
|
||||
#! /bin/bash
|
||||
|
||||
set -o pipefail
|
||||
set -e
|
||||
|
||||
outdir=./deploy
|
||||
|
||||
rm -rf $outdir
|
||||
mkdir -p $outdir/public
|
||||
cp ./resume.md-main/resume.html $outdir/public/index.html
|
||||
cp ./resume.md-main/resume.css $outdir/public/
|
||||
cp ./resume.md-main/resume.pdf $outdir/public/
|
||||
(
|
||||
printf "runtime: go114\n"
|
||||
true || go version \
|
||||
| grep -Eo '[0-9]+\.[0-9]+' \
|
||||
| sed 's/[^0-9]//'
|
||||
) > $outdir/app.yaml
|
||||
cp ./main.go $outdir/
|
||||
pushd $outdir
|
||||
GOOS=linux CGO_ENABLED=0 go build -ldflags "-s -w" -a -installsuffix cgo -trimpath
|
||||
rm main.go
|
||||
popd
|
||||
tar -czf ./deploy.tar $outdir
|
||||
rm -rf $outdir
|
||||
scp -i $HOME/.ssh/gcp.blapointe.com ./deploy.tar gcp.blapointe.com:./
|
||||
ssh -i $HOME/.ssh/gcp.blapointe.com gcp.blapointe.com bash -c "true; tar -xf deploy.tar; mv $outdir/${outdir##*/} ./services/bin/resume; rm -rf services/lib/resume; mv $outdir/public services/lib/resume; rm -rf deploy.tar $outdir"
|
||||
rm -f ./deploy.tar
|
||||
|
||||
3
firebase.json
Normal file → Executable file
3
firebase.json
Normal file → Executable file
@@ -6,7 +6,8 @@
|
||||
"**/.*",
|
||||
"**/node_modules/**",
|
||||
"firebase*",
|
||||
"resume.md-main/**"
|
||||
"resume.md-main/**",
|
||||
"json-resume/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Page Not Found</title>
|
||||
|
||||
<style media="screen">
|
||||
body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
|
||||
#message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px 16px; border-radius: 3px; }
|
||||
#message h3 { color: #888; font-weight: normal; font-size: 16px; margin: 16px 0 12px; }
|
||||
#message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; }
|
||||
#message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;}
|
||||
#message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
|
||||
#message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
|
||||
#message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
|
||||
#load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
|
||||
@media (max-width: 600px) {
|
||||
body, #message { margin-top: 0; background: white; box-shadow: none; }
|
||||
body { border-top: 16px solid #ffa100; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="message">
|
||||
<h2>404</h2>
|
||||
<h1>Page Not Found</h1>
|
||||
<p>The specified file was not found on this website. Please check the URL for mistakes and try again.</p>
|
||||
<h3>Why am I seeing this?</h3>
|
||||
<p>This page was generated by the Firebase Command-Line Interface. To modify it, edit the <code>404.html</code> file in your project's configured <code>public</code> directory.</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,80 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Welcome to Firebase Hosting</title>
|
||||
|
||||
<!-- update the version number as needed -->
|
||||
<script defer src="/__/firebase/7.21.1/firebase-app.js"></script>
|
||||
<!-- include only the Firebase features as you need -->
|
||||
<script defer src="/__/firebase/7.21.1/firebase-auth.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-database.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-messaging.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-storage.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-analytics.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-remote-config.js"></script>
|
||||
<script defer src="/__/firebase/7.21.1/firebase-performance.js"></script>
|
||||
<!-- initialize the SDK after all desired features are loaded -->
|
||||
<script defer src="/__/firebase/init.js"></script>
|
||||
|
||||
<style media="screen">
|
||||
body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
|
||||
#message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px; border-radius: 3px; }
|
||||
#message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; }
|
||||
#message h1 { font-size: 22px; font-weight: 300; color: rgba(0,0,0,0.6); margin: 0 0 16px;}
|
||||
#message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
|
||||
#message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
|
||||
#message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
|
||||
#load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
|
||||
@media (max-width: 600px) {
|
||||
body, #message { margin-top: 0; background: white; box-shadow: none; }
|
||||
body { border-top: 16px solid #ffa100; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="message">
|
||||
<h2>Welcome</h2>
|
||||
<h1>Firebase Hosting Setup Complete</h1>
|
||||
<p>You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!</p>
|
||||
<a target="_blank" href="https://firebase.google.com/docs/hosting/">Open Hosting Documentation</a>
|
||||
</div>
|
||||
<p id="load">Firebase SDK Loading…</p>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const loadEl = document.querySelector('#load');
|
||||
// // 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
|
||||
// // The Firebase SDK is initialized and available here!
|
||||
//
|
||||
// firebase.auth().onAuthStateChanged(user => { });
|
||||
// firebase.database().ref('/path/to/ref').on('value', snapshot => { });
|
||||
// firebase.messaging().requestPermission().then(() => { });
|
||||
// firebase.storage().ref('/path/to/ref').getDownloadURL().then(() => { });
|
||||
// firebase.analytics(); // call to activate
|
||||
// firebase.analytics().logEvent('tutorial_completed');
|
||||
// firebase.performance(); // call to activate
|
||||
//
|
||||
// // 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
|
||||
|
||||
try {
|
||||
let app = firebase.app();
|
||||
let features = [
|
||||
'auth',
|
||||
'database',
|
||||
'messaging',
|
||||
'storage',
|
||||
'analytics',
|
||||
'remoteConfig',
|
||||
'performance',
|
||||
].filter(feature => typeof app[feature] === 'function');
|
||||
loadEl.textContent = `Firebase SDK loaded with ${features.join(', ')}`;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
loadEl.textContent = 'Error loading the Firebase SDK, check the console.';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Mike Lee Williams
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,21 +0,0 @@
|
||||
.PHONY: resume watch clean
|
||||
|
||||
resume: resume.pdf resume.html
|
||||
|
||||
watch:
|
||||
ls *.md *.css | entr make resume
|
||||
|
||||
name := $(shell grep "^\#" resume.md | head -1 | sed -e 's/^\#[[:space:]]*//' | xargs)
|
||||
|
||||
resume.html: preamble.html resume.md postamble.html
|
||||
cat preamble.html | sed -e 's/___NAME___/$(name)/' > $@
|
||||
python3 -m markdown -x smarty resume.md >> $@
|
||||
cat postamble.html >> $@
|
||||
|
||||
resume.pdf: resume.html resume.css
|
||||
weasyprint resume.html resume.pdf
|
||||
qpdf --empty --pages ./resume.pdf 1-1 -- ./resume.truncate.pdf
|
||||
mv ./resume.truncate.pdf ./resume.pdf
|
||||
|
||||
clean:
|
||||
rm -f resume.html resume.pdf
|
||||
@@ -1,69 +0,0 @@
|
||||
# resume.md
|
||||
|
||||

|
||||
|
||||
|
||||
Write your resume in
|
||||
[Markdown](https://raw.githubusercontent.com/williamsmj/resume.md/main/resume.md),
|
||||
style it with [CSS](resume.css), output to [HTML](resume.html) and
|
||||
[PDF](resume.pdf).
|
||||
|
||||
|
||||
## Instructions
|
||||
|
||||
1. Clone this repository
|
||||
|
||||
2. Install the dependencies:
|
||||
<pre>
|
||||
pip install <a href="https://python-markdown.github.io/">markdown</a> <a href="https://weasyprint.org/">weasyprint</a>
|
||||
</pre>
|
||||
|
||||
3. Edit [resume.md](resume.md) (the placeholder text is taken with thanks from the
|
||||
[JSON Resume Project](https://jsonresume.org/themes/))
|
||||
|
||||
4. Run `make resume` to build resume.html and resume.pdf.
|
||||
|
||||
## Customization
|
||||
|
||||
Edit [resume.css](resume.css) to change the appearance of your resume. The
|
||||
default style is extremely generic, which is perhaps what you want in a resume,
|
||||
but CSS gives you a lot of flexibility. See, e.g. [The Tech Resume
|
||||
Inside-Out](https://www.thetechinterview.com/) for good advice about what a
|
||||
resume should look like (and what it should say).
|
||||
|
||||
Because the source is plain markdown and python-markdown is a very bare bones
|
||||
markdown compiler, elements cannot be tagged with ids or classes in the markdown
|
||||
source. If you need more control over the HTML, take a look at
|
||||
[kramdown](https://kramdown.gettalong.org/syntax.html). I chose not to use it
|
||||
for this project to avoid a non-python dependency.
|
||||
|
||||
Change the appearance of the PDF version (without affecting the HTML version) by
|
||||
adding rules under the `@media print` CSS selector.
|
||||
|
||||
Change the margins and paper size of the PDF version by editing the [`@page` CSS
|
||||
rule](https://developer.mozilla.org/en-US/docs/Web/CSS/%40page/size).
|
||||
|
||||
If you make a resume.css that you like, please submit a pull request. I'd be
|
||||
happy to collect these.
|
||||
|
||||
## Tips
|
||||
|
||||
Run `make watch` while you are working on your resume to rebuild it whenever
|
||||
resume.md or resume.css change (requires
|
||||
[entr](http://eradman.com/entrproject/)).
|
||||
|
||||
The simplest way to maintain multiple versions of your resume is to comment bits
|
||||
of text in or out based on the audience. This can be done with standard HTML
|
||||
comment syntax (e.g. `<!-- Skills: Microsoft Word -->`) but beware that
|
||||
commented out text will be included in the HTML source that you are presumably
|
||||
going to put online or share.
|
||||
|
||||
An alternative is to keep snippets of Markdown (or CSS) in separate files, and
|
||||
collect them into a single file for each version of your resume using a
|
||||
templating tool, makefile or shell script.
|
||||
|
||||
Use, e.g. `git tag` to record which version of the resume you sent to which
|
||||
person.
|
||||
|
||||
Use `git diff --word-diff` to make `git diff` more legible (this applies any
|
||||
time you run git diff on natural language).
|
||||
@@ -1,35 +0,0 @@
|
||||
</div>
|
||||
|
||||
<script src="/__/firebase/7.21.1/firebase-app.js"></script>
|
||||
<script src="/__/firebase/init.js"></script>
|
||||
|
||||
</body>
|
||||
<br>
|
||||
<footer>
|
||||
<div id="social">
|
||||
<a title="PDF" href="./resume.pdf">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16 11h5l-9 10-9-10h5v-11h8v11zm1 11h-10v2h10v-2z"/></svg>
|
||||
</a>
|
||||
<a title="LinkedIn" href="https://linkedin.com/in/lapoba16">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a title="Website" href="https://blapointe.com/">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M13.144 8.171c-.035-.066.342-.102.409-.102.074.009-.196.452-.409.102zm-2.152-3.072l.108-.031c.064.055-.072.095-.051.136.086.155.021.248.008.332-.014.085-.104.048-.149.093-.053.066.258.075.262.085.011.033-.375.089-.304.171.096.136.824-.195.708-.176.225-.113.029-.125-.097-.19-.043-.215-.079-.547-.213-.68l.088-.102c-.206-.299-.36.362-.36.362zm13.008 6.901c0 6.627-5.373 12-12 12-6.628 0-12-5.373-12-12s5.372-12 12-12c6.627 0 12 5.373 12 12zm-8.31-5.371c-.006-.146-.19-.284-.382-.031-.135.174-.111.439-.184.557-.104.175.567.339.567.174.025-.277.732-.063.87-.025.248.069.643-.226.211-.381-.355-.13-.542-.269-.574-.523 0 0 .188-.176.106-.166-.218.027-.614.786-.614.395zm6.296 5.371c0-1.035-.177-2.08-.357-2.632-.058-.174-.189-.312-.359-.378-.256-.1-1.337.597-1.5.254-.107-.229-.324.146-.572.008-.12-.066-.454-.515-.605-.46-.309.111.474.964.688 1.076.201-.152.852-.465.992-.038.268.804-.737 1.685-1.251 2.149-.768.694-.624-.449-1.147-.852-.275-.211-.272-.66-.55-.815-.124-.07-.693-.725-.688-.813l-.017.166c-.094.071-.294-.268-.315-.321 0 .295.48.765.639 1.001.271.405.416.995.748 1.326.178.178.858.914 1.035.898.193-.017.803-.458.911-.433.644.152-1.516 3.205-1.721 3.583-.169.317.138 1.101.113 1.476-.029.433-.37.573-.693.809-.346.253-.265.745-.556.925-.517.318-.889 1.353-1.623 1.348-.216-.001-1.14.36-1.261.007-.094-.256-.22-.45-.353-.703-.13-.248-.015-.505-.173-.724-.109-.152-.475-.497-.508-.677-.002-.155.117-.626.28-.708.229-.117.044-.458.016-.656-.048-.354-.267-.646-.53-.851-.389-.299-.188-.537-.097-.964 0-.204-.124-.472-.398-.392-.564.164-.393-.44-.804-.413-.296.021-.538.209-.813.292-.346.104-.7-.082-1.042-.125-1.407-.178-1.866-1.786-1.499-2.946.037-.19-.114-.542-.048-.689.158-.352.48-.747.762-1.014.158-.15.361-.112.547-.229.287-.181.291-.553.572-.781.4-.325.946-.318 1.468-.388.278-.037 1.336-.266 1.503-.06 0 .038.191.604-.019.572.433.023 1.05.749 1.461.579.211-.088.134-.736.567-.423.262.188 1.436.272 1.68.069.15-.124.234-.93.052-1.021.116.115-.611.124-.679.098-.12-.044-.232.114-.425.025.116.055-.646-.354-.218-.667-.179.131-.346-.037-.539.107-.133.108.062.18-.128.274-.302.153-.53-.525-.644-.602-.116-.076-1.014-.706-.77-.295l.789.785c-.039.025-.207-.286-.207-.059.053-.135.02.579-.104.347-.055-.089.09-.139.006-.268 0-.085-.228-.168-.272-.226-.125-.155-.457-.497-.637-.579-.05-.023-.764.087-.824.11-.07.098-.13.201-.179.311-.148.055-.287.126-.419.214l-.157.353c-.068.061-.765.291-.769.3.029-.075-.487-.171-.453-.321.038-.165.213-.68.168-.868-.048-.197 1.074.284 1.146-.235.029-.225.046-.487-.313-.525.068.008.695-.246.799-.36.146-.168.481-.442.724-.442.284 0 .223-.413.354-.615.131.053-.07.376.087.507-.01-.103.445.057.489.033.104-.054.684-.022.594-.294-.1-.277.051-.195.181-.253-.022.009.34-.619.402-.413-.043-.212-.421.074-.553.063-.305-.024-.176-.52-.061-.665.089-.115-.243-.256-.247-.036-.006.329-.312.627-.241 1.064.108.659-.735-.159-.809-.114-.28.17-.509-.214-.364-.444.148-.235.505-.224.652-.476.104-.178.225-.385.385-.52.535-.449.683-.09 1.216-.041.521.048.176.124.104.324-.069.19.286.258.409.099.07-.092.229-.323.298-.494.089-.222.901-.197.334-.536-.374-.223-2.004-.672-3.096-.672-.236 0-.401.263-.581.412-.356.295-1.268.874-1.775.698-.519-.179-1.63.66-1.808.666-.065.004.004-.634.358-.681-.153.023 1.247-.707 1.209-.859-.046-.18-2.799.822-2.676 1.023.059.092.299.092-.016.294-.18.109-.372.801-.541.801-.505.221-.537-.435-1.099.409l-.894.36c-1.328 1.411-2.247 3.198-2.58 5.183-.013.079.334.226.379.28.112.134.112.712.167.901.138.478.479.744.74 1.179.154.259.41.914.329 1.186.108-.178 1.07.815 1.246 1.022.414.487.733 1.077.061 1.559-.217.156.33 1.129.048 1.368l-.361.093c-.356.219-.195.756.021.982 1.818 1.901 4.38 3.087 7.22 3.087 5.517 0 9.989-4.472 9.989-9.989zm-11.507-6.357c.125-.055.293-.053.311-.22.015-.148.044-.046.08-.1.035-.053-.067-.138-.11-.146-.064-.014-.108.069-.149.104l-.072.019-.068.087.008.048-.087.106c-.085.084.002.139.087.102z"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a title="Email" href="mailto:contact@blapointe.com">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="M0 3v18h24v-18h-24zm6.623 7.929l-4.623 5.712v-9.458l4.623 3.746zm-4.141-5.929h19.035l-9.517 7.713-9.518-7.713zm5.694 7.188l3.824 3.099 3.83-3.104 5.612 6.817h-18.779l5.513-6.812zm9.208-1.264l4.616-3.741v9.348l-4.616-5.607z"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<div id="thanks">
|
||||
<div>
|
||||
Thanks to <a href="https://github.com/williamsmj/resume.md/">resume.md</a> and <a href="https://iconmonstr.com/">iconmonstr</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</html>
|
||||
@@ -1,8 +0,0 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>___NAME___</title>
|
||||
<link rel="stylesheet" type="text/css" href="resume.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="resume">
|
||||
@@ -1,178 +0,0 @@
|
||||
body {
|
||||
color: #000000;
|
||||
background: #EEEEEE;
|
||||
font: 1.1em "Times New Roman";
|
||||
line-height: 1.2;
|
||||
margin: 40px 0;
|
||||
}
|
||||
#resume, footer {
|
||||
background: #FFFFFF;
|
||||
border: 1px solid #CCCCCC;
|
||||
box-shadow: 2px 2px 4px #AAAAAA;
|
||||
-webkit-box-shadow: 2px 2px 4px #AAAAAA;
|
||||
}
|
||||
#social > a {
|
||||
display: block;
|
||||
max-width: 2em;
|
||||
width: 2em;
|
||||
}
|
||||
#social {
|
||||
padding: 20px 30px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
#social a, #social a:link, #social a:visited {
|
||||
color: #000;
|
||||
text-decoration: underline;
|
||||
}
|
||||
#social a {
|
||||
margin: 0 1em 0 0;
|
||||
}
|
||||
#social a:hover {
|
||||
color: #444;
|
||||
text-decoration: underline;
|
||||
}
|
||||
#resume {
|
||||
max-width: 800px;
|
||||
padding: 40px 60px;
|
||||
}
|
||||
footer {
|
||||
max-width: 925px;
|
||||
}
|
||||
#resume, footer {
|
||||
margin: 0 auto;
|
||||
}
|
||||
h1 {
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
font-size: 150%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
h2 {
|
||||
border-bottom: 1px solid #000000;
|
||||
text-transform: uppercase;
|
||||
font-size: 130%;
|
||||
margin: 1.0em 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
h3 {
|
||||
font-size: 100%;
|
||||
margin: 0.8em 0 0.3em 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
h3 > div:nth-child(1) {
|
||||
flex: 1;
|
||||
padding: 0 2em 0 0;
|
||||
}
|
||||
h3 > div:nth-child(2) {
|
||||
flex: none;
|
||||
}
|
||||
p {
|
||||
margin: 0 0 0.5em 0;
|
||||
padding: 0;
|
||||
}
|
||||
ul {
|
||||
padding: 0;
|
||||
margin: 0 1.5em;
|
||||
}
|
||||
/* ul immediately after h1 = contact list */
|
||||
h1 + ul {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
li {
|
||||
margin: .5em 0 0 0;
|
||||
}
|
||||
h1 + ul > li {
|
||||
margin: initial;
|
||||
display: inline;
|
||||
white-space: pre;
|
||||
list-style-type: none;
|
||||
}
|
||||
h1 + ul > li:after {
|
||||
content: " \2022 ";
|
||||
}
|
||||
h1 + ul > li:last-child:after {
|
||||
content: "";
|
||||
}
|
||||
/* p immediately after contact list = summary */
|
||||
h1 + ul + p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
footer {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
footer > div {
|
||||
flex: 2;
|
||||
min-width: 20em;
|
||||
}
|
||||
#thanks {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
font-style: italic;
|
||||
opacity: 75%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
@media print {
|
||||
body {
|
||||
font-size: 12pt;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: none;
|
||||
}
|
||||
#resume {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0px;
|
||||
background: none;
|
||||
box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
}
|
||||
/* Make links black in PDF */
|
||||
/* Move this outside the print block to apply this in HTML too */
|
||||
a, a:link, a:visited, a:hover {
|
||||
color: #000000;
|
||||
text-decoration: underline;
|
||||
}
|
||||
/*
|
||||
ul:not(:nth-child(2)) > li:nth-child(1),
|
||||
ul:not(:nth-child(2)) > li:nth-child(2) {
|
||||
display: list-item;
|
||||
}
|
||||
ul:not(:nth-child(2)) > li,
|
||||
*/
|
||||
footer {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@page {
|
||||
/* Change margins and paper size of PDF */
|
||||
/* https://developer.mozilla.org/en-US/docs/Web/CSS/@page */
|
||||
size: letter;
|
||||
margin: 0.5in 0.8in;
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
body {
|
||||
font-size: 16pt;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: #FFFFFF !important;
|
||||
}
|
||||
#resume {
|
||||
margin: 0;
|
||||
padding: 1em;
|
||||
border: 0px;
|
||||
background: none;
|
||||
box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Bree LaPointe</title>
|
||||
<link rel="stylesheet" type="text/css" href="resume.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="resume">
|
||||
@@ -1,57 +0,0 @@
|
||||
<!-- Accomplished [X] by measure of [Y] by doing [Z] -->
|
||||
# Bree LaPointe
|
||||
|
||||
- <contact@blapointe.com>
|
||||
- 336-701-6159
|
||||
- [blapointe.com](https://blapointe.com)
|
||||
- Provo, UT
|
||||
|
||||
## Experience
|
||||
|
||||
### <div><div>Senior Software Engineer, <i>Qualtrics</i></div></div> <div>May 2022 -- Present</div>
|
||||
|
||||
<!-- tmp -->
|
||||
|
||||
### <div><div>Software Engineer II, <i>Qualtrics</i></div></div> <div>Oct 2019 -- May 2022</div>
|
||||
|
||||
- Developed and owned highly available and reliable data storage and operational tooling.
|
||||
- Mentored 2 interns, 2 new hires, and 3 mid-level cross team engineers on operational tools, maintainable software, and career development.
|
||||
- Led genericized AWS asset management tooling ahead of company-wide mass migration initiative.
|
||||
|
||||
### <div><div>Software Engineer I, <i>Qualtrics</i></div></div> <div>Feb 2018 -- Oct 2019</div>
|
||||
|
||||
- Automated no-downtime system patching for 30 services and 25 database clusters by creating a modular and testable scripting framework.
|
||||
- Increased availability of a service from 98% to 99.99% and reduced hardware costs by 40% by selecting, training team on, and migrating without service interruption to a different database.
|
||||
|
||||
## Projects
|
||||
|
||||
### <div>Disaster Recovery Champion</div> <div>Dec 2020 -- Present</div>
|
||||
|
||||
- Supported training runs with documentation, tools, and live support for all teams.
|
||||
- Enforced continuous compliance for 17 database clusters with monitoring and alerting.
|
||||
|
||||
### <div>Software Engineering Book Club and White Paper Club Lead</div> <div>Jan 2019 -- Present</div>
|
||||
|
||||
### <div>MongoDB Virtual Team Member</div> <div>Jul 2018 -- Present</div>
|
||||
|
||||
- Encouraged performant and reliable deployments by advising on configuration and data models.
|
||||
- Genericized disaster recovery for 21 teams by building backup, restore, and monitoring tools.
|
||||
|
||||
### <div>Publication: Arabidopsis thaliana computationally-generated next-state gene interaction models</div> <div>Jan 2017 -- Dec 2017</div>
|
||||
|
||||
- Improved research implementation efficiency by orders of magnitude by refactoring.
|
||||
|
||||
## Education
|
||||
|
||||
### <div><div>Master of Science, Computer Science, <i>Wake Forest University</i></div></div> <div>Jan 2016 -- Dec 2017</div>
|
||||
|
||||
- 3.88/4.00 GPA
|
||||
|
||||
### <div><div>Bachelor of Arts, Computer Science, <i>High Point University</i></div></div> <div>Aug 2013 -- Dec 2015</div>
|
||||
|
||||
- 3.91/4.00 GPA
|
||||
|
||||
## Skills
|
||||
|
||||
- **Languages**: Golang, Python3, bash
|
||||
- **Platforms**: MongoDB, Redis, Linux, AWS, Docker, Rundeck, Jenkins, Hashicorp stack
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 118 KiB |
@@ -1,5 +0,0 @@
|
||||
pip3 install weasyprint markdown
|
||||
sudo apt-get install libcairo2-dev
|
||||
sudo apt-get install -y libsdl-pango-dev
|
||||
sudo apt-get install -y qpdf
|
||||
echo 'while true; do make resume; sleep 3; done &> /dev/null & disown'
|
||||
10
src/go.mod
Executable file
10
src/go.mod
Executable file
@@ -0,0 +1,10 @@
|
||||
module gogs.inhome.blapointe.com/local/resume
|
||||
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34
|
||||
golang.org/x/time v0.3.0
|
||||
)
|
||||
|
||||
require gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
8
src/go.sum
Executable file
8
src/go.sum
Executable file
@@ -0,0 +1,8 @@
|
||||
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34 h1:0tuX5dfOksiOQD1vbJjVNVTVxTTIng7UrUdSLF5T+Ao=
|
||||
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34/go.mod h1:YG9n3Clg7683ohkVnJK2hdX8bBS9EojIsd1qPZumX0Y=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
BIN
src/homebrew/fonts/Lato-Bold.ttf
Normal file
BIN
src/homebrew/fonts/Lato-Bold.ttf
Normal file
Binary file not shown.
BIN
src/homebrew/fonts/Lato-Regular.ttf
Normal file
BIN
src/homebrew/fonts/Lato-Regular.ttf
Normal file
Binary file not shown.
310
src/homebrew/homebrew.html
Normal file
310
src/homebrew/homebrew.html
Normal file
@@ -0,0 +1,310 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="preload" as="font" href="./fonts/Lato-Regular.ttf" type="font/ttf" crossorigin="anonymous">
|
||||
</link>
|
||||
<link rel="preload" as="font" href="./fonts/Lato-Bold.ttf" type="font/ttf" crossorigin="anonymous">
|
||||
</link>
|
||||
<style>
|
||||
@font-face {font-family: "Roboto"; src: url("./fonts/Roboto-Regular.ttf");}
|
||||
@font-face {font-family: "Roboto"; src: url("./fonts/Roboto-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Lato"; src: url("./fonts/Lato-Regular.ttf");}
|
||||
@font-face {font-family: "Lato"; src: url("./fonts/Lato-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Montserrat"; src: url("./fonts/Montserrat-Regular.ttf");}
|
||||
@font-face {font-family: "Montserrat"; src: url("./fonts/Montserrat-Bold.ttf"); font-weight: bold;}@font-face {font-family: "OpenSans"; src: url("./fonts/OpenSans-Regular.ttf");}
|
||||
@font-face {font-family: "OpenSans"; src: url("./fonts/OpenSans-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Raleway"; src: url("./fonts/Raleway-Regular.ttf");}
|
||||
@font-face {font-family: "Raleway"; src: url("./fonts/Raleway-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Caladea"; src: url("./fonts/Caladea-Regular.ttf");}
|
||||
@font-face {font-family: "Caladea"; src: url("./fonts/Caladea-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Lora"; src: url("./fonts/Lora-Regular.ttf");}
|
||||
@font-face {font-family: "Lora"; src: url("./fonts/Lora-Bold.ttf"); font-weight: bold;}@font-face {font-family: "RobotoSlab"; src: url("./fonts/RobotoSlab-Regular.ttf");}
|
||||
@font-face {font-family: "RobotoSlab"; src: url("./fonts/RobotoSlab-Bold.ttf"); font-weight: bold;}@font-face {font-family: "PlayfairDisplay"; src: url("./fonts/PlayfairDisplay-Regular.ttf");}
|
||||
@font-face {font-family: "PlayfairDisplay"; src: url("./fonts/PlayfairDisplay-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Merriweather"; src: url("./fonts/Merriweather-Regular.ttf");}
|
||||
@font-face {font-family: "Merriweather"; src: url("./fonts/Merriweather-Bold.ttf"); font-weight: bold;}
|
||||
</style>
|
||||
</head>
|
||||
<body style="margin: auto !important; padding-bottom: .0em !important; width: 512pt; margin: 0; padding: 0; -webkit-text-size-adjust:none;">
|
||||
<div>
|
||||
<div class="frame-content">
|
||||
<document title="Bree LaPointe Resume" author="Bree LaPointe " producer="OpenResume">
|
||||
<page style="display: flex; flex-direction: column; color: rgb(23, 23, 23); font-family: Lato; font-size: 11pt;">
|
||||
<view style="width: 100%; height: 10.5pt; background-color: rgb(129, 140, 248);">
|
||||
</view>
|
||||
<view style="display: flex; flex-direction: column; padding: 0px 18pt;">
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<text style="color: rgb(129, 140, 248); font-weight: bold; font-size: 20pt;">Bree LaPointe
|
||||
</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Senior Software Engineer
|
||||
</text>
|
||||
<view style="display: flex; flex-flow: row wrap; justify-content: space-between; margin-top: 1.5pt;">
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row; align-items: center; gap: 3pt;">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M64 112c-8.8 0-16 7.2-16 16v22.1L220.5 291.7c20.7 17 50.4 17 71.1 0L464 150.1V128c0-8.8-7.2-16-16-16H64zM48 212.2V384c0 8.8 7.2 16 16 16H448c8.8 0 16-7.2 16-16V212.2L322 328.8c-38.4 31.5-93.7 31.5-132 0L48 212.2zM0 128C0 92.7 28.7 64 64 64H448c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128z"></path></svg>
|
||||
<a href="mailto:contact@blapointe.com" style="text-decoration: none;" target="_blank" rel="noreferrer">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">contact@blapointe.com</text>
|
||||
</a>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; align-items: center; gap: 3pt;">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z"></path></svg>
|
||||
<a href="tel:3367016159" style="text-decoration: none;" target="_blank" rel="noreferrer">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">(336) 701-6159</text>
|
||||
</a>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; align-items: center; gap: 3pt;">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"></path></svg>
|
||||
<a href="<no value>" style="text-decoration: none;" target="_blank" rel="noreferrer">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Provo, UT</text>
|
||||
</a>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; align-items: center; gap: 3pt;">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg>
|
||||
<a href="https://linkedin.com/in/lapoba16" style="text-decoration: none;" target="_blank" rel="noreferrer">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">linkedin.com/in/lapoba16</text>
|
||||
</a>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<view style="display: flex; flex-direction: row; align-items: center;">
|
||||
<view style="height: 3.75pt; width: 30pt; background-color: rgb(129, 140, 248); margin-right: 10.5pt;">
|
||||
</view>
|
||||
<text style="font-weight: bold; letter-spacing: 0.3pt;">WORK EXPERIENCE</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
<view>
|
||||
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">Qualtrics</text>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Senior Software Engineer, Team Lead</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">May 2022 - Present
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; margin-top: 4.5pt;">
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Mentored entry and mid-level engineers on stability, clean code, and distributed systems.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Hosted engineering book and white paper clubs for continuous improvement and cross-team experience sharing for 2 years.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Recovered 98% of data lost in critical incident via coordinating cross team efforts and dissecting native database operation logs.</text>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Software Engineer II</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Oct 2019 - May 2022
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; margin-top: 4.5pt;">
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Developed and owned highly available and reliable data storage and operational tooling.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Mentored 2 interns, 2 new hires, and 3 mid-level cross team engineers on operational tools, maintainable software, and career development.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Genericized AWS asset management tooling ahead of company-wide mass migration initiative.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Championed disaster recovery by supporting training runs with documentation, tools, and live support across teams and enforced continuous compliance for 17 database clusters with monitoring and alerting.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Lent expertise owning MongoDB across teams by advising on configuration and data models and genericizing disaster recovery tooling for 21 teams.</text>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Software Engineer I</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Feb 2018 - Oct 2019
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; margin-top: 4.5pt;">
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Automated no-downtime system patching for 30 services and 25 database clusters by creating a modular and testable scripting framework.</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">Raised backend service's availability to 99.99% and reduced hardware costs by 40% by selecting, training team on, and live migrating to a different datastore.</text>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<view style="display: flex; flex-direction: row; align-items: center;">
|
||||
<view style="height: 3.75pt; width: 30pt; background-color: rgb(129, 140, 248); margin-right: 10.5pt;">
|
||||
</view>
|
||||
<text style="font-weight: bold; letter-spacing: 0.3pt;">EDUCATION</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
<view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">Wake Forest University</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Dec 2017
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Master of Science in Computer Science - 3.88/4.00 GPA
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">High Point University</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Dec 2015
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Bachelor of Arts in Computer Science - 3.91/4.00 GPA
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<view style="display: flex; flex-direction: row; align-items: center;">
|
||||
<view style="height: 3.75pt; width: 30pt; background-color: rgb(129, 140, 248); margin-right: 10.5pt;">
|
||||
</view>
|
||||
<text style="font-weight: bold; letter-spacing: 0.3pt;">PUBLICATIONS</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
<view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">Arabidopsis thaliana computationally-generated next-state gene interaction models</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Jun 2018
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Refactored to correct bugs and improve efficiency by orders of magnitude
|
||||
</text>
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<view style="display: flex; flex-direction: row; align-items: center;">
|
||||
<view style="height: 3.75pt; width: 30pt; background-color: rgb(129, 140, 248); margin-right: 10.5pt;">
|
||||
</view>
|
||||
<text style="font-weight: bold; letter-spacing: 0.3pt;">SKILLS</text>
|
||||
</view>
|
||||
|
||||
|
||||
<view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Languages: Golang, Bash, Python3
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Platforms: Docker, Hashicorp, Linux/Unix, AWS, Jenkins, REST, Microservices, Git
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">Datastores: MongoDB, Redis, S3, Couchbase, DynamoDB
|
||||
</text>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</page>
|
||||
</document>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
17
src/homebrew/homebrew.sh
Normal file
17
src/homebrew/homebrew.sh
Normal file
@@ -0,0 +1,17 @@
|
||||
#! /bin/bash
|
||||
|
||||
if ! which tpl; then
|
||||
go install github.com/bluebrown/go-template-cli/cmd/tpl@latest
|
||||
fi &> /dev/null
|
||||
if ! which gojq; then
|
||||
go install github.com/itchyny/gojq@latest
|
||||
fi &> /dev/null
|
||||
|
||||
while sleep 1; do
|
||||
date
|
||||
cat ./homebrew.yaml \
|
||||
| gojq --yaml-input . \
|
||||
| tpl --file homebrew.tmpl \
|
||||
> ./homebrew.html
|
||||
done
|
||||
|
||||
119
src/homebrew/homebrew.tmpl
Normal file
119
src/homebrew/homebrew.tmpl
Normal file
@@ -0,0 +1,119 @@
|
||||
<html>
|
||||
<head>
|
||||
<link rel="preload" as="font" href="./fonts/Lato-Regular.ttf" type="font/ttf" crossorigin="anonymous">
|
||||
</link>
|
||||
<link rel="preload" as="font" href="./fonts/Lato-Bold.ttf" type="font/ttf" crossorigin="anonymous">
|
||||
</link>
|
||||
<style>
|
||||
@font-face {font-family: "Roboto"; src: url("./fonts/Roboto-Regular.ttf");}
|
||||
@font-face {font-family: "Roboto"; src: url("./fonts/Roboto-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Lato"; src: url("./fonts/Lato-Regular.ttf");}
|
||||
@font-face {font-family: "Lato"; src: url("./fonts/Lato-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Montserrat"; src: url("./fonts/Montserrat-Regular.ttf");}
|
||||
@font-face {font-family: "Montserrat"; src: url("./fonts/Montserrat-Bold.ttf"); font-weight: bold;}@font-face {font-family: "OpenSans"; src: url("./fonts/OpenSans-Regular.ttf");}
|
||||
@font-face {font-family: "OpenSans"; src: url("./fonts/OpenSans-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Raleway"; src: url("./fonts/Raleway-Regular.ttf");}
|
||||
@font-face {font-family: "Raleway"; src: url("./fonts/Raleway-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Caladea"; src: url("./fonts/Caladea-Regular.ttf");}
|
||||
@font-face {font-family: "Caladea"; src: url("./fonts/Caladea-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Lora"; src: url("./fonts/Lora-Regular.ttf");}
|
||||
@font-face {font-family: "Lora"; src: url("./fonts/Lora-Bold.ttf"); font-weight: bold;}@font-face {font-family: "RobotoSlab"; src: url("./fonts/RobotoSlab-Regular.ttf");}
|
||||
@font-face {font-family: "RobotoSlab"; src: url("./fonts/RobotoSlab-Bold.ttf"); font-weight: bold;}@font-face {font-family: "PlayfairDisplay"; src: url("./fonts/PlayfairDisplay-Regular.ttf");}
|
||||
@font-face {font-family: "PlayfairDisplay"; src: url("./fonts/PlayfairDisplay-Bold.ttf"); font-weight: bold;}@font-face {font-family: "Merriweather"; src: url("./fonts/Merriweather-Regular.ttf");}
|
||||
@font-face {font-family: "Merriweather"; src: url("./fonts/Merriweather-Bold.ttf"); font-weight: bold;}
|
||||
</style>
|
||||
</head>
|
||||
<body style="margin: auto !important; padding-bottom: .0em !important; width: 512pt; margin: 0; padding: 0; -webkit-text-size-adjust:none;">
|
||||
<div>
|
||||
<div class="frame-content">
|
||||
<document title="{{ range .resume.name }}{{ . }} {{ end }}Resume" author="{{ range .resume.name }}{{ . }} {{ end }}" producer="OpenResume">
|
||||
<page style="display: flex; flex-direction: column; color: rgb(23, 23, 23); font-family: Lato; font-size: 11pt;">
|
||||
<view style="width: 100%; height: 10.5pt; background-color: rgb(129, 140, 248);">
|
||||
</view>
|
||||
<view style="display: flex; flex-direction: column; padding: 0px 18pt;">
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<text style="color: rgb(129, 140, 248); font-weight: bold; font-size: 20pt;">{{ range .resume.name }}{{ . }} {{ end }}
|
||||
</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ .resume.title }}
|
||||
</text>
|
||||
<view style="display: flex; flex-flow: row wrap; justify-content: space-between; margin-top: 1.5pt;">
|
||||
|
||||
{{ range .resume.contact.links }}
|
||||
<view style="display: flex; flex-direction: row; align-items: center; gap: 3pt;">
|
||||
{{ .svg }}
|
||||
<a href="{{ .link }}" style="text-decoration: none;" target="_blank" rel="noreferrer">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ .text }}</text>
|
||||
</a>
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
</view>
|
||||
</view>
|
||||
|
||||
{{ range .resume.headings }}
|
||||
<view style="display: flex; flex-direction: column; gap: 6pt; margin-top: 12pt;">
|
||||
<view style="display: flex; flex-direction: row; align-items: center;">
|
||||
<view style="height: 3.75pt; width: 30pt; background-color: rgb(129, 140, 248); margin-right: 10.5pt;">
|
||||
</view>
|
||||
<text style="font-weight: bold; letter-spacing: 0.3pt;">{{ .title }}</text>
|
||||
</view>
|
||||
|
||||
{{ if .what }}
|
||||
<view>
|
||||
{{ range .what }}
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ . }}
|
||||
</text>
|
||||
</view>
|
||||
{{ end }}
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
{{ range .headings }}
|
||||
<view>
|
||||
{{ if .headings }}
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">{{ .title }}</text>
|
||||
{{ else }}
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold;">{{ .title }}</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ .when }}
|
||||
</text>
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
{{ range .what }}
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ . }}
|
||||
</text>
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
{{ range .headings }}
|
||||
<view style="display: flex; flex-direction: row; justify-content: space-between; margin-top: 4.5pt;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ .title }}</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal;">{{ .when }}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view style="display: flex; flex-direction: column; margin-top: 4.5pt;">
|
||||
|
||||
{{ range .what }}
|
||||
<view style="display: flex; flex-direction: row;">
|
||||
<text style="color: rgb(23, 23, 23); font-weight: bold; padding-left: 6pt; padding-right: 6pt; line-height: 1.3;">•</text>
|
||||
<text style="color: rgb(23, 23, 23); font-weight: normal; line-height: 1.3; flex-grow: 1; flex-basis: 0px;">{{ . }}</text>
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
</view>
|
||||
{{ end }}
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</page>
|
||||
</document>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
63
src/homebrew/homebrew.yaml
Normal file
63
src/homebrew/homebrew.yaml
Normal file
@@ -0,0 +1,63 @@
|
||||
resume:
|
||||
name:
|
||||
- Bree
|
||||
- LaPointe
|
||||
title: 'Senior Software Engineer'
|
||||
contact:
|
||||
links:
|
||||
- text: contact@blapointe.com
|
||||
link: mailto:contact@blapointe.com
|
||||
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M64 112c-8.8 0-16 7.2-16 16v22.1L220.5 291.7c20.7 17 50.4 17 71.1 0L464 150.1V128c0-8.8-7.2-16-16-16H64zM48 212.2V384c0 8.8 7.2 16 16 16H448c8.8 0 16-7.2 16-16V212.2L322 328.8c-38.4 31.5-93.7 31.5-132 0L48 212.2zM0 128C0 92.7 28.7 64 64 64H448c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128z"></path></svg>'
|
||||
- text: (336) 701-6159
|
||||
link: tel:3367016159
|
||||
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z"></path></svg>'
|
||||
- text: Provo, UT
|
||||
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"></path></svg>'
|
||||
- text: linkedin.com/in/lapoba16
|
||||
link: https://linkedin.com/in/lapoba16
|
||||
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width: 13pt; height: 13pt; fill: rgb(82, 82, 82);"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path></svg>'
|
||||
headings:
|
||||
- title: WORK EXPERIENCE
|
||||
headings:
|
||||
- title: Qualtrics
|
||||
headings:
|
||||
- title: Senior Software Engineer, Team Lead
|
||||
when: May 2022 - Present
|
||||
what:
|
||||
- Mentored entry and mid-level engineers on stability, clean code, and distributed systems.
|
||||
- Hosted engineering book and white paper clubs for continuous improvement and cross-team experience sharing for 2 years.
|
||||
- Recovered 98% of data lost in critical incident via coordinating cross team efforts and dissecting native database operation logs.
|
||||
- title: Software Engineer II
|
||||
when: Oct 2019 - May 2022
|
||||
what:
|
||||
- Developed and owned highly available and reliable data storage and operational tooling.
|
||||
- Mentored 2 interns, 2 new hires, and 3 mid-level cross team engineers on operational tools, maintainable software, and career development.
|
||||
- Genericized AWS asset management tooling ahead of company-wide mass migration initiative.
|
||||
- Championed disaster recovery by supporting training runs with documentation, tools, and live support across teams and enforced continuous compliance for 17 database clusters with monitoring and alerting.
|
||||
- Lent expertise owning MongoDB across teams by advising on configuration and data models and genericizing disaster recovery tooling for 21 teams.
|
||||
- title: Software Engineer I
|
||||
when: Feb 2018 - Oct 2019
|
||||
what:
|
||||
- Automated no-downtime system patching for 30 services and 25 database clusters by creating a modular and testable scripting framework.
|
||||
- Raised backend service's availability to 99.99% and reduced hardware costs by 40% by selecting, training team on, and live migrating to a different datastore.
|
||||
- title: EDUCATION
|
||||
headings:
|
||||
- title: Wake Forest University
|
||||
when: Dec 2017
|
||||
what:
|
||||
- Master of Science in Computer Science - 3.88/4.00 GPA
|
||||
- title: High Point University
|
||||
when: Dec 2015
|
||||
what:
|
||||
- Bachelor of Arts in Computer Science - 3.91/4.00 GPA
|
||||
- title: PUBLICATIONS
|
||||
headings:
|
||||
- title: Arabidopsis thaliana computationally-generated next-state gene interaction models
|
||||
when: Jun 2018
|
||||
what:
|
||||
- Refactored to correct bugs and improve efficiency by orders of magnitude
|
||||
- title: SKILLS
|
||||
what:
|
||||
- 'Languages: Golang, Bash, Python3'
|
||||
- 'Platforms: Docker, Hashicorp, Linux/Unix, AWS, Jenkins, REST, Microservices, Git'
|
||||
- 'Datastores: MongoDB, Redis, S3, Couchbase, DynamoDB'
|
||||
2
main.go → src/main.go
Normal file → Executable file
2
main.go → src/main.go
Normal file → Executable file
@@ -2,7 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"local/args"
|
||||
"gogs.inhome.blapointe.com/local/args"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
Reference in New Issue
Block a user