diff --git a/Daniel Chen.typ b/Daniel Chen.typ index 5c9a03f..e5fce39 100644 --- a/Daniel Chen.typ +++ b/Daniel Chen.typ @@ -1,4 +1,4 @@ -#import "fontawesome.typ": fa, globe, github, linkedin, envelope +#import "fontawesome.typ": fa, globe, github, linkedin, envelope, phone #import "lib.typ": template, work_entry, project, indent, SMALL_STRONG, DEFAULT_STRONG // orange!! @@ -7,9 +7,14 @@ #let contact_data = ( ( - service: fa[#github], - display: "github.com/christopherlam888", - link: "https://github.com/christopherlam888" + service: fa[#phone], + display: "416-409-0886", + link: "tel:4164090886" + ), + ( + service: fa[#envelope], + display: "christopher.peter.lam@protonmail.com", + link: "mailto://christopher.peter.lam@protonmail.com" ), ( service: fa[#linkedin], @@ -17,9 +22,9 @@ link: "https://www.linkedin.com/in/christopherlam888" ), ( - service: fa[#envelope], - display: "christopher.peter.lam@protonmail.com", - link: "mailto://christopher.peter.lam@protonmail.com" + service: fa[#github], + display: "github.com/christopherlam888", + link: "https://github.com/christopherlam888" ), ) @@ -27,16 +32,17 @@ // MAIN CONTENT STARTS here +#let IMAGE_WIDTH = 1.5cm +#place(bottom + center, dy: 1.5cm, image("monogram.png", width: IMAGE_WIDTH)) + = Technical Skills -#indent[ - *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 -] +- *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[ +#block(inset: (right: 0.5em))[ #work_entry( "Software Developer, Software Quality Analyst", "i4i Infrastructure for Information", @@ -53,7 +59,7 @@ #work_entry( "Electrical/Communications Subsystem Lead", - "UW Orbital Engineering Design Team, Waterloo", + "UW Orbital Engineering Design Team", start_date: "Sep 2022", end_date: "present", location: "Waterloo", tasks: ( @@ -75,13 +81,9 @@ - Achieved 96% accuracy recognizing 5 distinct classes of fruits and vegetables in a web game built with Flask #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 +- 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("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 @@ -93,41 +95,40 @@ - 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 -] #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 +] + += Education + +#indent[ +#work_entry( + "BASc Mechatronics Engineering", + "University of Waterloo", + start_date: "2022", end_date: "2027", + location: "Waterloo, ON", + tasks: ( + [GPA: 4.0/93%, Dean’s List, Faculty of Engineering Entrance Scholarship, President's Scholarship of Distinction], + [Courses & Concepts: Object-Oriented Programming, Algorithms and Data Structures, Circuits, Digital Logic], + ) +) +] + = Honours #show link: underline #block(inset: (right: 0.5em))[ #grid( - columns: (11fr, 3fr), + columns: (11fr, 2fr), 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* - ] + align(right)[*#text(("2023", "2022").join("\n"))*] ) -] - -= Education - -#indent[ -#work_entry( - "University of Waterloo", - "B.A.Sc. ing Computer Engineering", - start_date: "Sep 2022", end_date: "Apr 2027 (expected)", - location: "Waterloo, ON", - tasks: ( - [Courses: Object-oriented programming, data structures & algorithms, digital computers & circuits], - ) -) -] +] \ No newline at end of file diff --git a/lib.typ b/lib.typ index 6f5b339..21292a5 100644 --- a/lib.typ +++ b/lib.typ @@ -8,14 +8,14 @@ #let BODY_FONT = "Calibri" #let BODY_FONT_SIZE = 11pt -#let HEADING_FONT_SIZE = 1em -#let TITLE_FONT_SIZE = 2em +#let HEADING_FONT_SIZE = 1.1em +#let TITLE_FONT_SIZE = 1.9em -#let HEADING_LINE_GAP = 3mm -#let BODY_LINE_HEIGHT = 0.85em +#let HEADING_LINE_GAP = 1.2mm +#let BODY_LINE_HEIGHT = 0.6em // rest = not top -#let PAGE_MARGINS = (rest: 0.3in, top: 0.3in) +#let PAGE_MARGINS = (rest: 0.35in, top: 0.3in, bottom: 0.3in) #let indent(content) = { block( @@ -28,10 +28,10 @@ #let cv_entry(left_content: none, right_content: none, details: none) = { stack( dir: ttb, - spacing: 0.9em, + spacing: 0.6em, grid( - columns: (11fr, 6fr), - column-gutter: 1cm, + columns: (13fr, 3fr), + column-gutter: 0.5cm, { set strong(delta: DEFAULT_STRONG) set align(left) @@ -64,7 +64,7 @@ } cv_entry( left_content: { - text(1.1em)[*#role* | ] + text(1em)[*#role*, ] text[#emph[#company]] if location != none { text[_, #location _] @@ -80,7 +80,7 @@ #let project(title, repo_link, tools) = { set strong(delta: DEFAULT_STRONG) - link(repo_link)[#text(1.1em)[*#title* #fa(github)]] + [ | _ #tools _] + link(repo_link)[#text(1em)[*#title* #fa(github)]] + [ | _ #tools _] } @@ -93,45 +93,41 @@ let header = { align(center)[ - #text(size: TITLE_FONT_SIZE, font: TITLE_FONT, fill: color)[*#name*] - #block(above: 0em, below: 1em) + #text(size: TITLE_FONT_SIZE, font: TITLE_FONT)[*#name*] + #block(above: 0em, below: 0.6em) + #set text(fill: rgb("#444")) #{ 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(" | ")] + // we love hacks + elements.slice(0, 2).join(" | ") + "\n" + elements.slice(2).join(" | ") } } + #v(3pt) ] } show heading.where(level: 1): i => { set align(left + horizon) - let title = smallcaps(i.body) + let title = upper(i.body) - 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) + set block(above: 1em, below: 0.75em) + set text(size: BODY_FONT_SIZE, fill: color, font: HEADING_FONT) stack( - dir: ltr, + dir: ttb, spacing: HEADING_LINE_GAP, + title, - box( - height: 2pt, - colored_line(title) - ) + line(length: 100%, stroke: (paint: color, thickness: 0.5pt)) ) } block( - stroke: (paint: color, thickness: 4pt), + stroke: (paint: color, thickness: 3pt), inset: 1.5em, { header