Compare commits
138 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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
|
index.html,1697076028715,3bd03c4d83dbeb2ed2b7bee9267742390fb06c0bee7086dc5befae5529fcbca2
|
||||||
resume.css,1616964719738,9561dffbb8787cf3367cce3e3eb1169b74852e6fe7c4f8422bf9ad39affdd2d8
|
BreeLaPointeResume.pdf,1697076028715,e65c67dce31a4e83006e2876b59398353a76ef1c3884fee6bdfb15a1a69745fb
|
||||||
resume.pdf,1616964719741,81d95603bad78aa3f433e5acd87ad92afb7d4a765684b662b4d237524603d4d0
|
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*
|
**/*.sw*
|
||||||
|
/.firebase/*.cache
|
||||||
**/*.pdf
|
**/*.pdf
|
||||||
resume
|
resume
|
||||||
**/*.tar
|
**/*.tar
|
||||||
deploy
|
deploy
|
||||||
vendor
|
vendor
|
||||||
firebase-debug.log
|
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.open.resume.d; 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.
23
README.md
Executable file
23
README.md
Executable file
@@ -0,0 +1,23 @@
|
|||||||
|
# Resume
|
||||||
|
|
||||||
|
1. open https://www.open-resume.com/resume-builder
|
||||||
|
1. in browser, `inspect > storage > local storage > about:srcdoc`
|
||||||
|
1. `cat ./open-resume.com.d/local*.json`
|
||||||
|
1. paste into `about:srcdoc` `Value`
|
||||||
|
1. refresh
|
||||||
|
1. download resume as `./open-resume.com.d/resume.pdf`
|
||||||
|
1. inspect iframe > `<html>` > copy outer HTML
|
||||||
|
1. `pbpaste > ./open-resume.com.d/resume.html`
|
||||||
|
1. `cd ./open-resume.com.d/; bash ./clean_resume_html.sh; cd ..`
|
||||||
|
1. `bash ./deploy.firebase.sh`
|
||||||
|
|
||||||
|
# Today
|
||||||
|
|
||||||
|
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)
|
||||||
95
deploy.firebase.sh
Normal file → Executable file
95
deploy.firebase.sh
Normal file → Executable file
@@ -1,24 +1,93 @@
|
|||||||
#! /bin/bash
|
#! /bin/sh
|
||||||
|
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
set -e
|
set -e
|
||||||
|
set -u
|
||||||
|
|
||||||
if ! which firebase; then
|
cd src
|
||||||
echo curl -sL https://firebase.tools | upgrade=true bash
|
|
||||||
|
if which vale; then
|
||||||
|
f=$(mktemp)
|
||||||
|
cat open-resume.com.d/local-storage-about-srcdoc-open-resume.json | sed 's/"[^"]*":/"."/g' > $f
|
||||||
|
vale sync
|
||||||
|
vale $f || true
|
||||||
fi
|
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
|
rm -rf $outdir
|
||||||
mkdir -p $outdir/public
|
mkdir -p $outdir/public
|
||||||
cp ./resume.md-main/resume.html $outdir/public/index.html
|
cp ./open-resume.com.d/resume.html.2 $outdir/public/index.html
|
||||||
cp ./resume.md-main/resume.css $outdir/public/
|
cp ./open-resume.com.d/resume.pdf $outdir/public/BreeLaPointeResume.pdf
|
||||||
cp ./resume.md-main/resume.pdf $outdir/public/
|
cp -r ./open-resume.com.d/fonts $outdir/public/
|
||||||
|
|
||||||
firebase login
|
(
|
||||||
echo firebase init
|
if ! which woff2_compress; then
|
||||||
firebase deploy || (
|
sudo apt -y install woff2
|
||||||
firebase logout
|
fi
|
||||||
firebase login
|
set -ueo pipefail
|
||||||
firebase deploy
|
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/**",
|
"**/node_modules/**",
|
||||||
"firebase*",
|
"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>
|
||||||
|
|
||||||
16
src/homebrew/homebrew.sh
Normal file
16
src/homebrew/homebrew.sh
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#! /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 (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"local/args"
|
"gogs.inhome.blapointe.com/local/args"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
37
src/open-resume.com.d/clean_resume_html.sh
Executable file
37
src/open-resume.com.d/clean_resume_html.sh
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
echo '> copy outer HTML of html just inside iframe' >&2
|
||||||
|
|
||||||
|
font_family="$(cat resume.html | grep -o 'font-family[^;]*' | tail -n 1 | awk '{print $NF}')"
|
||||||
|
cat resume.html \
|
||||||
|
| sed 's/>...<\/text/> - <\/text/g' \
|
||||||
|
| sed 's/overflow: hidden;/margin: auto !important; padding-bottom: .0em !important;/g' \
|
||||||
|
| sed 's/padding: 0px 60pt;/padding: 0px 18pt;/' \
|
||||||
|
| sed 's/width: 612pt;/width: 512pt;/' \
|
||||||
|
| sed "s#<link [^>]*as=\"font\"[^>]*/fonts/[^${font_family:0:1}][^>]*>##g" \
|
||||||
|
| sed "s#<link [^>]*as=\"font\"[^>]*/fonts/${font_family:0:1}[^${font_family:1:1}][^>]*>##g" \
|
||||||
|
| sed "s#/fonts/#./fonts/#g" \
|
||||||
|
> resume.html.2 \
|
||||||
|
|| rm resume.html.2
|
||||||
|
|
||||||
|
for font_file in $(
|
||||||
|
cat resume.html.2 \
|
||||||
|
| grep -o 'href="./fonts/[^"]*' \
|
||||||
|
| sed 's#.*"./##'
|
||||||
|
); do
|
||||||
|
if [ ! -f "$font_file" ]; then
|
||||||
|
mkdir -p ./${font_file%/*}/
|
||||||
|
curl -sS -L https://www.open-resume.com/$font_file > $font_file
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# | sed 's#"/fonts/#"https://www.open-resume.com/fonts/#g' \
|
||||||
|
|
||||||
|
|
||||||
|
#| sed 's/margin-top: 15pt;/margin-top: 20pt;/g' \
|
||||||
|
#| sed 's/margin-top: 12pt;/margin-top: 17pt;/g' \
|
||||||
|
#| sed 's/margin-top: 8pt;/margin-top: 12pt;/g' \
|
||||||
|
#| sed 's/margin-top: 6pt;/margin-top: 10pt;/g' \
|
||||||
|
|
||||||
BIN
src/open-resume.com.d/fonts/Lato-Bold.ttf
Normal file
BIN
src/open-resume.com.d/fonts/Lato-Bold.ttf
Normal file
Binary file not shown.
BIN
src/open-resume.com.d/fonts/Lato-Regular.ttf
Normal file
BIN
src/open-resume.com.d/fonts/Lato-Regular.ttf
Normal file
Binary file not shown.
153
src/open-resume.com.d/local-storage-about-srcdoc-open-resume.json
Executable file
153
src/open-resume.com.d/local-storage-about-srcdoc-open-resume.json
Executable file
@@ -0,0 +1,153 @@
|
|||||||
|
{
|
||||||
|
"resume": {
|
||||||
|
"profile": {
|
||||||
|
"name": "Bree LaPointe",
|
||||||
|
"summary": "Senior Software Engineer",
|
||||||
|
"email": "contact@blapointe.com",
|
||||||
|
"phone": "(336) 701-6159",
|
||||||
|
"location": "Provo, UT",
|
||||||
|
"url": "linkedin.com/in/lapoba16"
|
||||||
|
},
|
||||||
|
"workExperiences": [
|
||||||
|
{
|
||||||
|
"company": "Qualtrics",
|
||||||
|
"jobTitle": "Senior Software Engineer, Team Lead",
|
||||||
|
"date": "May 2022 - Present",
|
||||||
|
"descriptions": [
|
||||||
|
"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."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"company": "Qualtrics",
|
||||||
|
"jobTitle": "Software Engineer II",
|
||||||
|
"date": "Oct 2019 - May 2022",
|
||||||
|
"descriptions": [
|
||||||
|
"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."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"company": "Qualtrics",
|
||||||
|
"jobTitle": "Software Engineer I",
|
||||||
|
"date": "Feb 2018 - Oct 2019",
|
||||||
|
"descriptions": [
|
||||||
|
"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."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"educations": [
|
||||||
|
{
|
||||||
|
"school": "Wake Forest University",
|
||||||
|
"degree": "Master of Science in Computer Science",
|
||||||
|
"gpa": "3.88/4.00",
|
||||||
|
"date": "Dec 2017",
|
||||||
|
"descriptions": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"school": "High Point University",
|
||||||
|
"degree": "Bachelor of Arts in Computer Science",
|
||||||
|
"gpa": "3.91/4.00",
|
||||||
|
"date": "Dec 2015",
|
||||||
|
"descriptions": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"projects": [
|
||||||
|
{
|
||||||
|
"project": "Arabidopsis thaliana computationally-generated next-state gene interaction models",
|
||||||
|
"date": "June 2018",
|
||||||
|
"descriptions": [
|
||||||
|
"Refactored to correct bugs and improve efficiency by orders of magnitude"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"skills": {
|
||||||
|
"featuredSkills": [
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "",
|
||||||
|
"rating": 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"descriptions": [
|
||||||
|
"Languages: Golang, Bash, Python3",
|
||||||
|
"Platforms: Docker, Hashicorp, Linux/Unix, AWS, Jenkins, REST, Microservices, Git",
|
||||||
|
"Datastores: MongoDB, Redis, S3, Couchbase, DynamoDB"
|
||||||
|
],
|
||||||
|
"notfeaturedSkills": [
|
||||||
|
{
|
||||||
|
"skill": "Golang",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "Bash",
|
||||||
|
"rating": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skill": "Python3",
|
||||||
|
"rating": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"custom": {
|
||||||
|
"descriptions": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"themeColor": "#818cf8",
|
||||||
|
"fontFamily": "Lato",
|
||||||
|
"fontSize": "11",
|
||||||
|
"documentSize": "Letter",
|
||||||
|
"formToShow": {
|
||||||
|
"workExperiences": true,
|
||||||
|
"educations": true,
|
||||||
|
"projects": true,
|
||||||
|
"skills": true,
|
||||||
|
"custom": false
|
||||||
|
},
|
||||||
|
"formToHeading": {
|
||||||
|
"workExperiences": "WORK EXPERIENCE",
|
||||||
|
"educations": "EDUCATION",
|
||||||
|
"projects": "PUBLICATIONS",
|
||||||
|
"skills": "SKILLS",
|
||||||
|
"custom": "PUBLICATIONS"
|
||||||
|
},
|
||||||
|
"formsOrder": [
|
||||||
|
"workExperiences",
|
||||||
|
"educations",
|
||||||
|
"projects",
|
||||||
|
"skills",
|
||||||
|
"custom"
|
||||||
|
],
|
||||||
|
"showBulletPoints": {
|
||||||
|
"educations": false,
|
||||||
|
"projects": true,
|
||||||
|
"skills": true,
|
||||||
|
"custom": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/open-resume.com.d/resume.html
Normal file
30
src/open-resume.com.d/resume.html
Normal file
File diff suppressed because one or more lines are too long
30
src/open-resume.com.d/resume.html.2
Executable file
30
src/open-resume.com.d/resume.html.2
Executable file
File diff suppressed because one or more lines are too long
BIN
src/open-resume.com.d/resume.pdf
Normal file
BIN
src/open-resume.com.d/resume.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user