Compare commits

...

40 Commits

Author SHA1 Message Date
eggy
c73ee3f99f feat: change link 2023-12-04 16:39:17 -05:00
eggy
d41360b1aa feat: add android 2023-12-04 16:37:27 -05:00
eggy
611ea63edd feat: make flashnote better 2023-12-04 16:36:52 -05:00
eggy
dc8062dfc5 feat: clean it up 2023-12-04 16:34:23 -05:00
eggy
10889dba25 feat: stronger points 2023-12-04 15:59:17 -05:00
eggy
6bfc3273c0 feat: stronger points 2023-12-04 15:58:57 -05:00
eggy
f0e9e96fe4 feat: add more tools 2023-12-04 14:22:55 -05:00
eggy
baa386a39e feat: better form line 2023-12-04 01:02:06 -05:00
eggy
f9b8dd6b0e feat: add more languages 2023-11-29 23:14:59 -05:00
eggy
d165a1b259 feat: make primoprod sound better 2023-11-28 16:20:35 -05:00
eggy
2cddfcbf6e feat: better dropbase wording 2023-11-28 15:56:37 -05:00
eggy
de8fb56d48 chore: better syntax 2023-11-28 03:06:22 -05:00
eggy
0f0ff6ba1f feat: add kobink
such a scuffed project
2023-11-28 03:05:41 -05:00
eggy
1591bdaba5 chore: move edu to bottom 2023-11-07 12:41:33 -05:00
eggy
7d289c8757 fix: remove (expected) 2023-11-07 12:41:19 -05:00
eggy
2d4d0dd6d4 chore: remove comment 2023-11-07 12:40:54 -05:00
eggy
6e8763b88d feat: add arch server 2023-11-07 12:39:21 -05:00
eggy
08201c3406 feat: adjust text styling 2023-11-06 21:10:59 -05:00
eggy
dd3d479a92 feat: move education to top 2023-10-28 23:11:05 -04:00
eggy
2694b2e9eb feat: fix underline 2023-10-25 21:07:12 -04:00
eggy
d0d224ba04 fix: reorder techyon 2023-10-25 21:01:38 -04:00
eggy
1ab736b2d5 chore: run fmt 2023-10-25 21:00:11 -04:00
eggy
e26e2cbeb2 feat: update mandown text 2023-10-24 12:04:46 -04:00
eggy
250150f9a1 fix: typo 2023-10-24 10:51:47 -04:00
eggy
d380bd6724 fix: bold colons 2023-10-23 23:55:09 -04:00
eggy
987f255a87 chore: refactor 2 2023-10-21 22:36:52 -04:00
eggy
19a5af8798 chore: refactor 2023-10-21 22:27:41 -04:00
eggy
7be19f3b9b feat: make lines more impactful 2023-10-21 22:18:50 -04:00
eggy
dce7a94677 feat: leave location remote for db 2023-10-21 15:12:00 -04:00
eggy
04a01d80bb fix: use basc instead of candidate 2023-10-21 15:07:26 -04:00
247eeb945e Make it orange (#1)
And make it much much prettier!

Co-authored-by: eggy <danielchen04@hotmail.ca>
Reviewed-on: #1
2023-10-21 15:06:08 -04:00
eggy
2bc466a29a feat: more advertising 2023-10-08 13:50:04 -04:00
eggy
37b543affe feat: advertise yourself more 2023-10-08 13:41:40 -04:00
eggy
b1b80349cb feat: add readme 2023-09-21 09:14:29 -04:00
eggy
f900fca1c0 chore: add back js 2023-09-18 14:06:03 -04:00
eggy
6ccf2d2fad chore: improve judging desc 2023-09-18 14:05:18 -04:00
eggy
39c736e9db feat: add judging script 2023-09-18 14:04:18 -04:00
eggy
9b031313b6 feat: mention what hack the borf is 2023-08-09 10:10:38 -04:00
eggy
1134628f06 feat: show uni end date 2023-09-05 14:11:20 -04:00
eggy
575b97fa0c feat: remove redis 2023-08-05 18:43:50 -04:00
4 changed files with 385 additions and 808 deletions

View File

@@ -1,40 +1,27 @@
#import "fontawesome.typ": *
#import "lib.typ": template, education_entry, work_entry, project, indent
#import "fontawesome.typ": fa, globe, github, linkedin, envelope
#import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG
#set page(margin: 1.75in)
#set par(leading: 0.5em, first-line-indent: 1.8em, justify: true)
#show raw: set text(font: "New Computer Modern Mono")
#show par: set block(spacing: 0.55em)
#show heading: set block(above: 2em, below: 1em)
#set list(indent: 1em)
// Change the theme color of the cv.
#let color = black
// orange!!
#let color = rgb("#ff983e")
#let name = "Daniel Chen"
#let contact_data = (
(
#let contact_data = ((
service: fa[#globe],
display: "eggworld.me",
link: "https://eggworld.me"
),
(
link: "https://eggworld.me",
), (
service: fa[#github],
display: "potatoeggy",
link: "https://github.com/potatoeggy"
),
(
display: "github.com/potatoeggy",
link: "https://github.com/potatoeggy",
), (
service: fa[#linkedin],
display: "potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/"
),
(
display: "linkedin.com/in/potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/",
), (
service: fa[#envelope],
display: "daniel.chen1@uwaterloo.ca",
link: "mailto://daniel.chen1@uwaterloo.ca"
),
)
display: "d7chen@uwaterloo.ca",
link: "mailto://d7chen@uwaterloo.ca",
),)
#show: doc => template(name, contact_data, color, doc)
@@ -43,80 +30,145 @@
= Skills
#indent[
*Languages*: Python, TypeScript/JavaScript, Rust, SQL, C++, Dart, Bash, Java, HTML, CSS \
*Frameworks*: Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma, Apollo, Axum, Diesel \
*Tools*: Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, OpenTelemetry, GraphQL
*Languages:* Python, TypeScript, JavaScript, Rust, SQL, MATLAB, C, C++, Java,
HTML, CSS, Dart \
*Frameworks:* Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma,
Apollo, Axum, Jest, Pytest \
*Tools:* Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, Heroku,
OpenTelemetry, GraphQL, Android
]
= Experience
#indent[
#work_entry(
#show link: underline
#work_entry(
"Software Engineering Intern",
"Dropbase",
start_date: "May 2023", end_date: "Aug 2023",
start_date: "May 2023",
end_date: "Aug 2023",
location: "Remote",
tasks: (
"Designed a type-safe ORM-style query builder to dynamically generate JSON forms based on external data",
"Integrated Airtable and HubSpot APIs with the core product via AWS Lambda to automate data migration",
"Refactored the frontend to use react-hook-form to aggregate and validate user input, improving DX",
"Created a Pytest testing framework to verify core functionality across many different databases"
[Engineered a database-specific *SQL IDE autocompletion tool* via a heuristic
algorithm to validate queries],
[Developed a service to sync HubSpot and Airtable data with Google Sheets via
*AWS Lambda*],
[Constructed dynamic forms in *react-hook-form* by generating questions from the
backend on-the-fly],
[Created testing infrastructure for the backend with *Pytest* to catch
regressions across database engines],
),
)
)
#work_entry(
#work_entry(
"Backend Developer",
"Hack the North",
start_date: "Mar 2023", end_date: "present",
start_date: "Mar 2023",
end_date: "present",
location: "Waterloo, ON",
tasks: (
"Integrated OpenTelemetry and Grafana into a Kubernetes cluster to collect traces and improve observability",
"Dynamically generated Apple Wallet URLs over Apollo Server and GraphQL for a registration ticket",
"Increased API reliability with Redis Sentinel to automatically failover to backup Redis instances",
"Slashed dev server reload time by 1500% by pre-transpiling GraphQL resolvers and offloading type-checking"
[Streamlined registration by dynamically generating *user-specific Apple Wallet
passes* over *Apollo GraphQL*],
[Horizontally scaled the *Node.js* server to handle *1000+ concurrent users* with
*Redis* and *Kubernetes*],
[Automated judging scheduling by creating a *greedy algorithm* to match judges to
project themes],
[Integrated *OpenTelemetry* and Grafana in a *Kubernetes* cluster to collect
traces and improve observability],
),
)
)
]
= Projects
#set strong(delta: SMALL_STRONG)
#indent[
#project("Mandown", "https://github.com/potatoeggy/mandown", "Python, Qt")
- Created a real-time site scraper for metadata and images to automatically download comics
- Abstracted 4 ebook creation libraries into a common comic conversion API for e-ink devices
- Implemented image caching and multiprocessing to increase download and update speeds by 300%
- Minimised regressions between release cycles by writing unit and integration tests with 55% code coverage
#project(
"RecipeReady",
"https://devpost.com/software/recipeready-wk4bo9",
"Flutter, Selenium, FastAPI, Android",
)
- Developed a *Flutter app* to generate recipes based on ingredients and filters
through a FastAPI server
- Scraped thousands of websites for recipes to build a database with a robust
*many-to-many tag system*
- Aggregated common ingredients heuristically to build a shopping list and a meal
plan for each week
// #project("Kobink", "https://github.com/potatoeggy/kobink", "Rust, Axum, Postgres")
// - ??? something here (reverse engineering)
// - ??? something here (synchronisation and DB, HTTP headers)
#project(
"Genshin Simulator",
"https://github.com/potatoeggy/primoprod",
"Vue, TypeScript, Capacitor, Android",
)
- Built an realistic *cross-platform loot box simulator* with fluid animations
based off a popular game
- Reduced action latency by *90%* by lazily loading art assets at opportune times,
such as during cutscenes
#project("RecipeReady", "https://github.com/vincentjguo/recipeready-server", "Flutter, Selenium, FastAPI, Android")
- Scraped thousands of websites for recipes to build a database with a robust many-to-many tag system
- Designed a REST API to filter and query recipes along with ingredient pricing from Walmart
#project(
"Flashcard Generator",
"https://github.com/potatoeggy/flashnote",
"Java, Android",
)
- Created an Android app to generate study *flashcards from handwritten notes*
using *Google Cloud*
- Interfaced with GCP's Vision and NLP APIs to extract text and keywords from
images with *Retrofit* and *Gson*
- Isolated key terms with GCP's NLP API to convert declarative sentences into
questions and answers
#project("\"Pillow\" Water Quality Sensor", "https://github.com/potatoeggy/ece198", "Rust, STM32")
- Created a water quality statistics aggregator and visualiser on an embedded platform in safe Rust
- Engineered an embedded system with an STM32 microcontroller, matrix keypad, and an LCD display
#project(
"Kobo Sync Server",
"https://github.com/potatoeggy/kobink",
"Rust, Axum",
)
- Developed an Axum backend to *automatically convert and sync* ebooks to a Kobo
eReader over the network
- *Reverse-engineered* the Kobo eReader Sync API to support updating ebook
metadata and covers
#project("Primoprod", "https://github.com/potatoeggy/primoprod", "Vue, TypeScript")
- Imitated a video game UI to create an interactive, realistic, cross-platform game simulator
- Constructed an extensible JSON data schema to concisely simplify adding new game content
// #project(
// "Comic Downloader & Converter",
// "https://github.com/potatoeggy/mandown",
// "Python, Qt",
// )
// - Created a CLI and GUI to scrape, download, and convert webcomics into
// e-ink-optimised ebooks (EPUB, PDF)
// - Designed an *intermediate representation* to store metadata and images as a
// standardised conversion target
// - Implemented *image caching and multiprocessing* to increase download and update
// speeds by *300%*
// - Minimised regressions between release cycles by writing *unit and integration
// tests* with 55% code coverage
// #project("Arch Linux Server", none, "Linux, nginx, systemd")
// - Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy
// personal projects behind *nginx*
// - Set up *Jellyfin* for media streaming, a *Minecraft* server, *Calibre* for ebook
// syncing, and other services
]
= Awards
#show link: underline
- Winner of the #link("https://github.com/anyuan-chen/resketch")[EdTech category] at StormHacks 2022 from 350+ participants
- Winner of the #link("https://github.com/anyuan-chen/perdiem")[IBM Open Source category] at YRHacks 2022 from 90+ participants
- 2nd place in the Industry 4.0 2021 engineering analytics competition from 200+ participants
- Winner of the #link("https://github.com/anyuan-chen/resketch")[EdTech] prize at
StormHacks 2022 from 350+ participants
- Winner of the #link("https://github.com/anyuan-chen/perdiem")[IBM Open Source] prize
at YRHacks 2022 from 90+ participants
= Education
#indent[
#education_entry("University of Waterloo", "Candidate for B.A.Sc. in Computer Engineering", start_date: "Sep 2022", end_date: "present",
location: "Waterloo, ON", details: (
[Secretary, Creative Writing Club],
))
#work_entry(
"University of Waterloo",
"B.A.Sc. in Computer Engineering",
start_date: "Sep 2022",
end_date: "Apr 2027",
location: "Waterloo, ON",
tasks: (
[Courses: Object-oriented programming, data structures & algorithms, digital
computers & circuits],
),
)
]

7
README.md Normal file
View File

@@ -0,0 +1,7 @@
# resume
Release guidelines:
- The major version represents the current academic year, e.g., both post-2A and 2B would be v2.
- The minor version represents the current academic term, e.g., 2A would be v2.1. the x.0 releases are reserved for beta changes.
- The patch version is incremented for any other reason.

File diff suppressed because it is too large Load Diff

146
lib.typ
View File

@@ -1,25 +1,21 @@
#import "fontawesome.typ": github, fa
// Reduce space between paragraphs.
#let par_space = 0.75em
// Reduce space between headings and descriptions.
#let sep_space = par_space + 0.1em
#let subtitle_space = par_space - 0.2em
#let DEFAULT_STRONG = 300;
#let SMALL_STRONG = 200;
// Format start and end dates.
#let format_date(start_date: none, end_date: none) = {
let date = {
if end_date == none {
start_date
} else if start_date == none {
end_date
} else {
[#start_date -- #end_date]
}
}
#let TITLE_FONT = "Bitter"
#let HEADING_FONT = TITLE_FONT
#let BODY_FONT = "Open Sans"
[*#date*]
}
#let BODY_FONT_SIZE = 10pt
#let HEADING_FONT_SIZE = 1em
#let TITLE_FONT_SIZE = 2em
#let HEADING_LINE_GAP = 3mm
#let BODY_LINE_HEIGHT = 0.85em
// rest = not top
#let PAGE_MARGINS = (rest: 0.5in, top: 0.4in)
// Format locations.
#let format_location(location) = {
@@ -27,64 +23,40 @@
}
#let indent(content) = {
block(
inset: (left: 1em, right: 0.5em),
content
)
block(inset: (left: 1em, right: 0.5em), content)
}
// General entry that is split into a left and right half (for experience and education).
#let cv_entry(left_content: none, right_content: none, details: none) = {
stack(
dir: ttb,
spacing: 0.75em,
grid(
columns: (11fr, 6fr),
column-gutter: 1cm,
{
spacing: 0.9em,
grid(columns: (11fr, 6fr), column-gutter: 1cm, {
set strong(delta: DEFAULT_STRONG)
set align(left)
left_content
},
{
}, {
set strong(delta: SMALL_STRONG)
set align(right)
right_content
}
),
}),
{
set align(left)
set strong(delta: SMALL_STRONG)
details
}
)
}
// Entry for education.
#let education_entry(university, degree, start_date: none, end_date: none, location: none, details: none) = {
let details_list = if details != none {
let list = []
for detail in details {
list += [- #detail]
}
list
} else {
none
}
cv_entry(
left_content: {
text(1.2em)[*#university*] + "\n" + emph[#degree]
},
right_content: {
format_date(start_date: start_date, end_date: end_date)
if location != none {
"\n" + format_location(location)
}
},
details: details_list
)
}
// Entry for work.
#let work_entry(role, company, tasks: none, start_date: none, end_date: none, location: none) = {
#let work_entry(
role,
company,
tasks: none,
start_date: none,
end_date: none,
location: none,
) = {
let task_list = if tasks != none {
let list = []
for task in tasks {
@@ -94,38 +66,43 @@
} else {
none
}
cv_entry(
left_content: {
text(1.1em)[*#role*] + "\n" + text[#emph[#company]]
},
right_content: {
format_date(start_date: start_date, end_date: end_date)
cv_entry(left_content: {
set par(leading: 0.75em)
text(1.1em)[*#role*]
"\n"
set strong(delta: SMALL_STRONG)
text[*#company*]
}, right_content: {
[*#start_date -- #end_date*]
if location != none {
"\n" + format_location(location)
}
},
details: task_list
)
}, details: task_list)
}
#let project(title, repo_link, tools) = {
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _]
set strong(delta: DEFAULT_STRONG)
if repo_link != none {
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _ ]
} else {
text(1.1em)[*#title*] + [ | _ #tools _ ]
}
}
// Set name and contact data and format headings
#let template(name, contact_data, color, doc) = {
set page(margin: (rest: 0.5in, top: 0.4in), paper: "us-letter")
set page(margin: PAGE_MARGINS, paper: "us-letter")
set list(indent: 1.25em, marker: [])
set text(font: "Latin Modern Sans", 11pt)
set par(justify: true, leading: 0.65em)
set text(font: (BODY_FONT), BODY_FONT_SIZE)
set par(justify: true, leading: BODY_LINE_HEIGHT)
align(center)[
#text(size: 2em)[*#name*]
#text(size: TITLE_FONT_SIZE, font: TITLE_FONT, fill: color)[*#name*]
#block(above: 0em, below: 1em)
#{
if contact_data != none and contact_data.len() > 0 {
let elements = for el in contact_data {
(link(el.link)[#{el.service + " " + el.display}],)
(link(el.link)[#{ el.service + " " + el.display }],)
}
text(1.1em)[#elements.join(" | ")]
}
@@ -133,18 +110,27 @@
]
show heading.where(level: 1): i => {
set align(left)
set align(left + horizon)
let title = smallcaps(i.body)
set block(above: 1em)
set text(weight: "light", size: 0.9em, fill: color, font: "New Computer Modern")
let colored_line(header_text) = style(styles => {
let size = measure(header_text, styles)
// 100% - spacing - width of text
line(
length: 100% - HEADING_LINE_GAP - size.width,
stroke: (paint: color, thickness: 2pt, cap: "round"),
)
})
set block(above: 0.9em, below: 0.75em)
set text(size: 1em, fill: color, font: HEADING_FONT)
stack(
dir: ttb,
spacing: 1.5mm,
dir: ltr,
spacing: HEADING_LINE_GAP,
title,
line(length: 100%, stroke: color + 0.4pt)
box(height: 2pt, fill: color, colored_line(title)),
)
}
doc
}