Compare commits

..

45 Commits

Author SHA1 Message Date
eggy b84234e6c5 feat: good enough for now? 2024-04-12 10:33:30 -04:00
eggy 818241c54f get some points down 2024-04-11 12:00:04 -04:00
eggy d470da6f96 chore: ideas 2024-03-24 16:16:39 -04:00
eggy 508307cc43 feat: prep for v3
add immigr8, remove mandown and asvyn, add gbarr
2024-01-08 15:30:44 -05:00
eggy 858d6c9758 feat: unfortunately we now know spring 2023-12-21 14:28:09 -05:00
eggy 23e9324077 feat: andrew and james review 2023-12-13 21:58:12 -05:00
eggy 00659263f9 feat: better margins 2023-12-13 16:24:54 -05:00
eggy 197699e63b feat: orange again 2023-12-13 16:21:23 -05:00
eggy b8e5b47b0b feat: better points 2023-12-13 16:17:08 -05:00
eggy 45b4a6b7e6 chore: make variables work 2023-12-12 23:19:27 -05:00
eggy 4705415045 feat: make lines include outcomes
I HATE THIS SO MUCH
2023-12-12 23:12:43 -05:00
eggy c09d0bdc1a Revert "feat: remove awards"
This reverts commit 18ebf61e9b.
2023-12-05 15:11:51 -05:00
eggy 18ebf61e9b feat: remove awards 2023-12-05 12:23:49 -05:00
eggy 8b5a085447 feat: move education to top 2023-12-04 21:53:07 -05:00
eggy f078060477 feat: better points 2023-12-04 21:10:10 -05:00
eggy 5eadcfe0ba feat: add android 2023-12-04 16:51:43 -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
eggy 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
3 changed files with 432 additions and 818 deletions
+168 -89
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 = blue // rgb("#ff983e")
#let name = "Daniel Chen"
#let contact_data = (
(
service: fa[#globe],
display: "eggworld.me",
link: "https://eggworld.me"
),
(
service: fa[#github],
display: "potatoeggy",
link: "https://github.com/potatoeggy"
),
(
service: fa[#linkedin],
display: "potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/"
),
(
service: fa[#envelope],
display: "daniel.chen1@uwaterloo.ca",
link: "mailto://daniel.chen1@uwaterloo.ca"
),
)
#let contact_data = ((
service: fa[#globe],
display: "eggworld.me",
link: "https://eggworld.me",
), (
service: fa[#github],
display: "github.com/potatoeggy",
link: "https://github.com/potatoeggy",
), (
service: fa[#linkedin],
display: "linkedin.com/in/potatoeggy",
link: "https://www.linkedin.com/in/potatoeggy/",
), (
service: fa[#envelope],
display: "d7chen@uwaterloo.ca",
link: "mailto://d7chen@uwaterloo.ca",
),)
#show: doc => template(name, contact_data, color, doc)
@@ -43,80 +30,172 @@
= 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 \
*Tools*: Linux, Git, Docker, PostgreSQL, Redis, Kubernetes, AWS, GCP, OpenTelemetry, GraphQL
*Languages:* Python, TypeScript, JavaScript, Rust, SQL, C, C++, Java, HTML, CSS \
// MATLAB, Dart, Ruby
*Frameworks:* Node.js, Express, Spring Boot, React, Next.js, Vue, Flutter, Axum \
// Qt, Jest / Pytest, Apollo, Prisma, Rails
*Tools:* Linux, Git, Docker, Terraform, PostgreSQL, AWS/GCP, OpenTelemetry,
Kubernetes, GraphQL, nginx // Jenkins, systemd, Jira
]
= Experience
#indent[
#work_entry(
"Software Engineering Intern",
"Dropbase",
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"
)
)
// #work_entry(
// "Technical Volunteer",
// "Organization for Transformative Works",
// start_date: "Feb 2024",
// end_date: "present",
// location: "Remote",
// tools: "Ruby on Rails, React, MySQL",
// tasks: (
// [Automated importing NUMBER of fics by scraping it into a database then import to AO3, largest fanfic archive],
// [Increased reliability probably (how?)]
// )
// )
#work_entry(
"Backend Developer",
"Hack the North",
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"
#work_entry(
"Software Developer Intern",
"Immigr8",
start_date: "Jan 2024",
end_date: "Apr 2024",
location: "Clearwater, FL",
tools: "Next.js, Spring Boot, PostgreSQL, AWS, Terraform",
tasks: (
// [Improved client responsiveness by *80* by employing stale-while-revalidate hooks for caching and ?? SWR performance, caching, error handling],
[Set up CI/CD for AWS infrastructure by *codifying it in Terraform* for
reproducible and automatic deployments],
[Reduced CI/CD pipeline build times by *70%* by setting up a staging environment
with *EC2* and *Jenkins*, parallelising builds, and caching dependencies],
[Planned and executed a roadmap to SOC 2 security compliance by *implementing
role-based permissions with JWTs*, sending backend logs and alerts to
*CloudWatch*, and introducing new privacy controls for user data],
[Shipped an *internal admin panel* from end-to-end to visualise client data and
manage user permissions, reducing the need for manual database queries by *90%*],
),
)
#work_entry(
"Software Engineering Intern",
"Dropbase",
start_date: "May 2023",
end_date: "Aug 2023",
location: "Toronto, ON",
tools: "React, FastAPI, PostgreSQL, AWS",
tasks: (
[Designed a conflict resolution algorithm for merging databases, *reducing
unrecoverable errors by 75%*],
[Owned and launched a HubSpot/Airtable to Google Sheets sync feature to *46000+
enterprise users* by writing *AWS Lambda* functions in Python, abstracting
interfaces to easily support future sources],
[Wrote and deployed a new *React* data query builder for our business
intelligence visualisation service to *33000+ users*, eliminating the need for
clients to manually write API calls or Python code],
[Developed a scalable microservice that asynchronously ingests email attachments
directly into ETL pipelines],
// [??? emphasise test driven development or remove line *Reduced request errors by 30%* by creating backend testing infrastructure with
// *Pytest* to catch regressions and test new features across database engines with
// *90% code coverage*],
),
)
#work_entry(
"Backend Developer & Event Organiser",
"Hack the North",
start_date: "Mar 2023",
end_date: "present",
location: "Waterloo, ON",
tools: "Express, GraphQL, Docker, Kubernetes",
tasks: (
[Streamlined event check-in times by *80%* for *1900+ attendees* by generating
digital wallet passes over *Express*],
[Integrated backend *tracing* to monitor performance and trigger alerts with
*OpenTelemetry* and *Grafana*],
[Diagnosed system scaling issues during load spikes and *recovered from a system
crash* by asking the frontend team to debounce their queries, implementing rate
limiting as a temporary stopgap measure],
[Shipped a new *bus registration tool* for attendees by creating new database
tables and *GraphQL* resolvers],
),
)
)
]
= 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("Comic Downloader", "Python, Qt",
// repo_link: "https://github.com/potatoeggy/mandown")
// - 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%*
// #project("Kobink", "https://github.com/potatoeggy/kobink", "Rust, Axum, Postgres")
// - ??? something here (reverse engineering)
// - ??? something here (synchronisation and DB, HTTP headers)
#project(
"Genshin Simulator",
"Vue, TypeScript",
repo_link: "https://github.com/potatoeggy/primoprod",
demo_link: "https://primoprod.vercel.app",
)
- Built a realistic and beautiful *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(
"Kobo Sync Server",
"Rust, Axum",
repo_link: "https://github.com/potatoeggy/kobink",
)
- 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("\"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(
// "RecipeReady",
// "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("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("Arch Linux Server", "Linux, Docker, nginx, systemd", demo_link: "https://eggworld.me")
// - Created a *self-hosted CI/CD pipeline* with *Gitea* to automatically deploy
// personal projects behind *nginx*
// - Containerised services with *Docker* and *systemd* to simplify deployment and
// management
// #project(
// "Game Boy Advance Emulator",
// "Rust, SDL2, Vulkan",
// repo_link: "https://github.com/potatoeggy/gbarr",
// )
// - Implemented a *ARMv7 emulator* for old games to run on modern x86_64 platforms
// with *SDL2* and *Vulkan*
// - WebGPU and WASM for portability, typestate to guarantee everything is always
// valid
]
= 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
= 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(
"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],
[Extracurriculars: Creative Writing Club, Hack the North, UW Orbital Design Team],
),
)
]
+169 -637
View File
File diff suppressed because it is too large Load Diff
+95 -92
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
#import "fontawesome.typ": github, fa, link-icon
#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 = 0.95em
#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, left: 0.4in)
// Format locations.
#let format_location(location) = {
@@ -27,64 +23,41 @@
}
#let indent(content) = {
block(
inset: (left: 1em, right: 0.5em),
content
)
block(inset: (left: 0.75em, 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, 3fr), 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)
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]
}),
{
set align(left)
set strong(delta: SMALL_STRONG)
details
},
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,
tools: none,
tasks: none,
start_date: none,
end_date: none,
location: none,
) = {
let task_list = if tasks != none {
let list = []
for task in tasks {
@@ -94,57 +67,87 @@
} 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*]
if location != none {
"\n" + format_location(location)
}
},
details: task_list
)
if tools != none {
text[ | _ #tools _]
}
"\n"
set strong(delta: SMALL_STRONG)
text[*#company*]
}, right_content: {
[*#start_date -- #end_date*]
if location != none {
"\n" + format_location(location)
}
}, details: task_list)
}
#let project(title, repo_link, tools) = {
link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _]
#let project(title, tools, repo_link: none, demo_link: none) = {
set strong(delta: DEFAULT_STRONG)
let text_link = if demo_link != none { demo_link } else { repo_link }
if text_link != none {
link(text_link)[#text(1.1em)[*#title*]]
} else {
text(1.1em)[*#title*]
}
if demo_link != none {
link(demo_link)[#text(1.1em)[ #fa(link-icon)]]
}
if repo_link != none {
link(repo_link)[#text(1.1em)[ #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 list(indent: 1.25em, marker: [])
set text(font: "Latin Modern Sans", 11pt)
set par(justify: true, leading: 0.65em)
set page(margin: PAGE_MARGINS, paper: "us-letter")
set list(indent: 1em, marker: [])
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(" | ")]
text(1em)[#elements.join(" | ")]
}
}
]
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")
stack(
dir: ttb,
spacing: 1.5mm,
title,
line(length: 100%, stroke: color + 0.4pt)
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: HEADING_FONT_SIZE, fill: color, font: HEADING_FONT)
stack(
dir: ltr,
spacing: HEADING_LINE_GAP,
title,
box(height: 2pt, fill: color, colored_line(title)),
)
}
doc
}