From b4c1386468a2439ce2467cd89e808a02b530bbd9 Mon Sep 17 00:00:00 2001 From: eggy Date: Tue, 24 Oct 2023 10:51:37 -0400 Subject: [PATCH] feat: chris --- Daniel Chen.typ | 117 +++++++++++++++++++++++++++--------------------- README.md | 2 +- lib.typ | 84 ++++++++++++++++++---------------- 3 files changed, 111 insertions(+), 92 deletions(-) diff --git a/Daniel Chen.typ b/Daniel Chen.typ index 51e293d..5c9a03f 100644 --- a/Daniel Chen.typ +++ b/Daniel Chen.typ @@ -2,29 +2,24 @@ #import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG // orange!! -#let color = rgb("#ff983e") -#let name = "Daniel Chen" +#let color = rgb("#1f497d") +#let name = "Christopher Lam" #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" + display: "github.com/christopherlam888", + link: "https://github.com/christopherlam888" ), ( service: fa[#linkedin], - display: "linkedin.com/in/potatoeggy", - link: "https://www.linkedin.com/in/potatoeggy/" + display: "linkedin.com/in/christopherlam888", + link: "https://www.linkedin.com/in/christopherlam888" ), ( service: fa[#envelope], - display: "d7chen@uwaterloo.ca", - link: "mailto://d7chen@uwaterloo.ca" + display: "christopher.peter.lam@protonmail.com", + link: "mailto://christopher.peter.lam@protonmail.com" ), ) @@ -32,78 +27,96 @@ // MAIN CONTENT STARTS here -= Skills += Technical Skills #indent[ - *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 + *Languages:* Python, JavaScript, TypeScript, Kotlin, C, C++, Rust, Dart, Java, SQL, XML, XSL, Bash \ + *Tools:* OpenCV, Flask, PostgreSQL, React, React Native, NodeJS, Express, MongoDB, Flutter, Linux ] = Experience #indent[ #work_entry( - "Software Engineering Intern", - "Dropbase", - start_date: "May 2023", end_date: "Aug 2023", - location: "Remote", + "Software Developer, Software Quality Analyst", + "i4i Infrastructure for Information", + location: "Toronto", + start_date: "May 2023", end_date: "Sep 2023", tasks: ( - [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], + [Developed a program to automate converting hundreds of client data values from Excel to Word metadata], + [Designed Python, XML, and XSL code to extract and process data to interface with existing software products], + [Performed 1000+ functional, security, and stress tests to ensure quality for clients like Pfizer and Astellas], + [Communicated with developers and clients to perform root cause analysis on hundreds of major issues], + [Coordinated with management and team members to delegate work, present results, and meet deadlines] ) ) #work_entry( - "Backend Developer", - "Techyon", - start_date: "Mar 2023", end_date: "present", - location: "Waterloo, ON", + "Electrical/Communications Subsystem Lead", + "UW Orbital Engineering Design Team, Waterloo", + start_date: "Sep 2022", end_date: "present", + location: "Waterloo", tasks: ( - [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*], + [Implemented the Diffie-Hellman key exchange in C using a 3072-bit prime number and 256-bit keys], + [Managed a team of 10 to develop electrical and power, battery management, ADCS, and computer systems], + [Led the design of the custom transceiver by reviewing schematics and optimizing the layout per RF guidelines], + [Validated PCBs with power and RF testing, resulting in a recorded 34 dB gain measured by VNA S-parameters], + ) ) -) ] = Projects #set strong(delta: SMALL_STRONG) #indent[ -#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("Produce Palate", "https://github.com/potatoeggy/mandown", "Python, OpenCV, Scikit-learn, Flask") +- Created an image preprocessing algorithm to reduce noise, perform contour detection, and enhance colours +- Trained an AI image classifier model with KNN, Random Forest, and SVM algorithms tuned using grid search +- Achieved 96% accuracy recognizing 5 distinct classes of fruits and vegetables in a web game built with Flask -#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("Snake Wave", "https://github.com/potatoeggy/primoprod", "Python, OpenCV, Pygame, Flask, PostgreSQL, bcrypt") +- Designed a snake game controlled by hand gestures using OpenCV and Google’s MediaPipe ML model +- Implemented a Flask API with PostgreSQL to handle user authentication with bcrypt and track a leaderboard // #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 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("The Everyday Watch Collector App", "https://github.com/vincentjguo/recipeready-server", "Kotlin, XML, React, NodeJS, Express, MongoDB, JavaScript") +- Created a user-friendly interface to display 100+ glossary entries and 40+ videos using Kotlin and XML +- Utilized Retrofit and Gson to retrieve API data in JSON with seamless fallback to local data upon Internet loss +- Automated unit and instrumented tests using Espresso to ensure code quality and minimize regressions +- Developed a contributions page using React to send web inputs through a POST request to the REST API +- Deployed a REST API using NodeJS, Express, and MongoDB to perform CRUD operations on a cloud database -#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 +#project("Catholic Companion (Saints App)", "https://github.com/potatoeggy/boxboxrevolution", "React Native, TypeScript, Python, BeautifulSoup") +- Developed an app to display a saint of the day and a list of Catholic prayers in React Native and TypeScript +- Devised a web scraping algorithm to extract data with BeautifulSoup and clean data with LanguageTool +- Optimized performance with multithreading pools, resulting in a 5x increase in speed to retrieve 250 listings ] -= Awards +#project("RecipeReady", "https://github.com/vincentjguo/recipeready-server", "Python, Selenium, Flutter, Dart") +- Produced a recipe app to help users plan daily meals with a weekly schedule and a generated grocery list +- Gathered 500+ recipes by scraping with Selenium, and created a REST API to get data from a cloud database + += Honours #show link: underline -- 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 +#block(inset: (right: 0.5em))[ + #grid( + columns: (11fr, 3fr), + column-gutter: 1cm, + [ + - 1st Place CubeSat Design Challenge, Canadian Satellite Design Challenge + - The Governor General's Academic Medal (Bronze Medal), Governor General of Canada + ], + align(right)[ + *2023*, + *2022* + ] + ) +] = Education diff --git a/README.md b/README.md index eaf9740..4623559 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ 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. +- The patch versionr is incremented for any other reason. diff --git a/lib.typ b/lib.typ index 882cac5..6f5b339 100644 --- a/lib.typ +++ b/lib.typ @@ -3,11 +3,11 @@ #let DEFAULT_STRONG = 300; #let SMALL_STRONG = 200; -#let TITLE_FONT = "Bitter" +#let TITLE_FONT = "Calibri" #let HEADING_FONT = TITLE_FONT -#let BODY_FONT = "Open Sans" +#let BODY_FONT = "Calibri" -#let BODY_FONT_SIZE = 10pt +#let BODY_FONT_SIZE = 11pt #let HEADING_FONT_SIZE = 1em #let TITLE_FONT_SIZE = 2em @@ -15,12 +15,7 @@ #let BODY_LINE_HEIGHT = 0.85em // rest = not top -#let PAGE_MARGINS = (rest: 0.5in, top: 0.4in) - -// Format locations. -#let format_location(location) = { - [_#block(above: 0.7em, location)_] -} +#let PAGE_MARGINS = (rest: 0.3in, top: 0.3in) #let indent(content) = { block( @@ -35,18 +30,18 @@ dir: ttb, 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 - } + 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) @@ -57,7 +52,7 @@ } // 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: true) = { let task_list = if tasks != none { let list = [] for task in tasks { @@ -69,14 +64,15 @@ } cv_entry( left_content: { - text(1.1em)[*#role*] + "\n" + text[#emph[#company]] + text(1.1em)[*#role* | ] + text[#emph[#company]] + if location != none { + text[_, #location _] + } }, right_content: { [*#start_date -- #end_date*] - if location != none { - "\n" + format_location(location) - } }, details: task_list ) @@ -87,24 +83,28 @@ 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: PAGE_MARGINS, paper: "us-letter") set list(indent: 1.25em, marker: [•]) set text(font: (BODY_FONT), BODY_FONT_SIZE) set par(justify: true, leading: BODY_LINE_HEIGHT) - align(center)[ - #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}],) + + let header = { + align(center)[ + #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}],) + } + text(1.1em)[#elements.join(" | ")] } - text(1.1em)[#elements.join(" | ")] } - } - ] + ] + } show heading.where(level: 1): i => { set align(left + horizon) @@ -125,11 +125,17 @@ title, box( height: 2pt, - fill: color, colored_line(title) ) - ) + } - doc + block( + stroke: (paint: color, thickness: 4pt), + inset: 1.5em, + { + header + doc + } + ) }