Compare commits

..

9 Commits

Author SHA1 Message Date
eggy
1dcb33ffc3 feat: test one-line 2023-10-23 23:42:00 -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
2 changed files with 98 additions and 108 deletions

View File

@@ -1,16 +1,8 @@
#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 = (
@@ -21,18 +13,18 @@
),
(
service: fa[#github],
display: "potatoeggy",
display: "github.com/potatoeggy",
link: "https://github.com/potatoeggy"
),
(
service: fa[#linkedin],
display: "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"
),
)
@@ -43,7 +35,7 @@
= Skills
#indent[
*Languages*: Python, TypeScript/JavaScript, Rust, SQL, C++, Dart, Bash, Java, HTML, CSS \
*Languages*: Python, TypeScript/JavaScript, Rust, SQL, C++, Java, HTML, CSS \
*Frameworks*: Node.js, Express, React, Next.js, Vue, Flutter, Qt, Prisma, Apollo, Axum \
*Tools*: Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, OpenTelemetry, GraphQL
]
@@ -57,66 +49,72 @@
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"
[Automated synchronising Airtable and HubSpot APIs with Google Sheets via *AWS Lambda*],
[Engineered a *heuristic algorithm* to guarantee *SQL* aliases referenced in queries match the database schema],
[Refactored the frontend to use *react-hook-form* to aggregate and validate user input, improving DX],
[Built a service for *importing and validating CSV/Excel* files from personalised email addresses into databases],
)
)
#work_entry(
"Backend Developer",
"Hack the North",
"Techyon",
start_date: "Mar 2023", end_date: "present",
location: "Waterloo, ON",
tasks: (
"Organised Canada's largest hackathon with more than 1000 attendees and 6000 applicants",
"Integrated OpenTelemetry and Grafana into a Kubernetes cluster to collect traces and improve observability",
"Dynamically generated Apple Wallet pass files over Apollo Server and GraphQL for a registration ticket",
"Automated judge-to-hacker matching and scheduling with a custom algorithm based on their preferences"
[Integrated *OpenTelemetry* and Grafana in a *Kubernetes* cluster to collect traces and improve observability],
[Dynamically generated user-specific *Apple Wallet* passes over *Apollo GraphQL* Server to streamline check-in],
[Automated judge-to-hacker matching and scheduling with a custom algorithm based on their preferences],
[Horizontally scaled the *Node.js* server to handle *1000+ concurrent users* with *Redis* and *Kubernetes*],
)
)
]
= 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("Mandown Comic Converter", "https://github.com/potatoeggy/mandown", "Python, Qt")
- Created a CLI and GUI to scrape, download, and convert webcomics into e-ink friendly ebooks
- Designed a standard *intermediate representation* to convert between different comic formats (EPUB, PDF)
- 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("Kobink", "https://github.com/potatoeggy/kobink", "Rust, Axum, Postgres")
#project("Primoprod Genshin Simulator", "https://github.com/potatoeggy/primoprod", "Vue, TypeScript")
- Built an interactive, realistic, and beautiful game simulator with fluid animations based off a popular game
- Constructed an *extensible JSON data schema* to let the user dynamically switch between game versions
// #project("Kobink — Kobo Sync Server", "https://github.com/potatoeggy/kobink", "Rust, Axum, Postgres")
// - ??? something here (reverse engineering)
// - ??? something here (synchronisation and DB, HTTP headers)
#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("RecipeReady Recipe Aggregator", "https://github.com/vincentjguo/recipeready-server", "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("\"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("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("Box Box Revolution", "https://github.com/potatoeggy/boxboxrevolution", "Rust, STM32")
- Created a rhythm game to detect punches with an ultrasonic sensor in line wth notes of popular songs
- Developed firmware to measure from an ultrasonic sensor, tone a buzzer, and show scrolling notes on an LCD
]
= 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: "Apr 2027",
location: "Waterloo, ON", details: (
[Secretary, Creative Writing Club],
))
#work_entry(
[B.A.Sc. in Computer Engineering],
[University of Waterloo],
start_date: "Sep 2022", end_date: "Apr 2027 (expected)",
tasks: (
[Courses: Object-oriented programming, data structures & algorithms, digital computers & circuits],
),
one_line_mode: true
)
]

110
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) = {
@@ -37,54 +33,31 @@
#let cv_entry(left_content: none, right_content: none, details: none) = {
stack(
dir: ttb,
spacing: 0.75em,
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, one_line_mode: false) = {
let task_list = if tasks != none {
let list = []
for task in tasks {
@@ -96,10 +69,17 @@
}
cv_entry(
left_content: {
text(1.1em)[*#role*] + "\n" + text[#emph[#company]]
if one_line_mode {
text(1.1em)[*#role*, #company]
} else {
text(1.1em)[*#role*]
"\n"
text[#emph[#company]]
}
},
right_content: {
format_date(start_date: start_date, end_date: end_date)
[*#start_date -- #end_date*]
if location != none {
"\n" + format_location(location)
@@ -110,17 +90,18 @@
}
#let project(title, repo_link, tools) = {
set strong(delta: DEFAULT_STRONG)
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #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 {
@@ -133,18 +114,29 @@
]
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
}