From 7f976df27317b221f61cfe97b01a4692ad5c7878 Mon Sep 17 00:00:00 2001 From: Dustella Date: Wed, 25 Feb 2026 13:20:07 +0800 Subject: [PATCH] chore: refactor on project structure --- cv.typ | 8 +- cv_print.typ | 23 --- modules_en/certificates.typ | 26 --- modules_en/education.typ | 32 ---- modules_en/professional.typ | 45 ----- modules_en/projects.typ | 20 --- modules_en/publications.typ | 17 -- modules_en/skills.typ | 22 --- modules_fr/certificates.typ | 26 --- modules_fr/education.typ | 32 ---- modules_fr/professional.typ | 45 ----- modules_fr/projects.typ | 19 --- modules_fr/publications.typ | 17 -- modules_fr/skills.typ | 22 --- modules_it/certificates.typ | 26 --- modules_it/education.typ | 32 ---- modules_it/professional.typ | 42 ----- modules_it/projects.typ | 20 --- modules_it/publications.typ | 17 -- modules_it/skills.typ | 22 --- modules_zh/projects.typ | 158 ------------------ projects.typ | 2 +- src/logos/abc_company.png | Bin 6252 -> 0 bytes src/logos/pqr_corp.png | Bin 16012 -> 0 bytes src/logos/xyz_corp.png | Bin 36509 -> 0 bytes src/publications.bib | 31 ---- .../certificates.typ => zh/achievements.typ | 2 +- .../publications.typ => zh/activity.typ | 2 +- modules_zh/professional.typ => zh/career.typ | 2 +- {modules_zh => zh}/education.typ | 2 +- zh/projects.typ | 33 ++++ zh/projects/creeper.typ | 21 +++ zh/projects/guiiai.typ | 29 ++++ zh/projects/maiqu.typ | 27 +++ zh/projects/mihome.typ | 22 +++ zh/projects/nuistshare.typ | 27 +++ zh/projects/typhoon.typ | 22 +++ {modules_zh => zh}/skills.typ | 6 +- 38 files changed, 193 insertions(+), 706 deletions(-) delete mode 100644 cv_print.typ delete mode 100644 modules_en/certificates.typ delete mode 100644 modules_en/education.typ delete mode 100644 modules_en/professional.typ delete mode 100644 modules_en/projects.typ delete mode 100644 modules_en/publications.typ delete mode 100644 modules_en/skills.typ delete mode 100644 modules_fr/certificates.typ delete mode 100644 modules_fr/education.typ delete mode 100644 modules_fr/professional.typ delete mode 100644 modules_fr/projects.typ delete mode 100644 modules_fr/publications.typ delete mode 100644 modules_fr/skills.typ delete mode 100644 modules_it/certificates.typ delete mode 100644 modules_it/education.typ delete mode 100644 modules_it/professional.typ delete mode 100644 modules_it/projects.typ delete mode 100644 modules_it/publications.typ delete mode 100644 modules_it/skills.typ delete mode 100644 modules_zh/projects.typ delete mode 100644 src/logos/abc_company.png delete mode 100644 src/logos/pqr_corp.png delete mode 100644 src/logos/xyz_corp.png delete mode 100644 src/publications.bib rename modules_zh/certificates.typ => zh/achievements.typ (90%) rename modules_zh/publications.typ => zh/activity.typ (90%) rename modules_zh/professional.typ => zh/career.typ (96%) rename {modules_zh => zh}/education.typ (93%) create mode 100644 zh/projects.typ create mode 100644 zh/projects/creeper.typ create mode 100644 zh/projects/guiiai.typ create mode 100644 zh/projects/maiqu.typ create mode 100644 zh/projects/mihome.typ create mode 100644 zh/projects/nuistshare.typ create mode 100644 zh/projects/typhoon.typ rename {modules_zh => zh}/skills.typ (94%) diff --git a/cv.typ b/cv.typ index f7b7b85..ce1e061 100644 --- a/cv.typ +++ b/cv.typ @@ -5,7 +5,7 @@ #let importModules(modules, lang: metadata.language) = { for module in modules { include { - "modules_" + lang + "/" + module + ".typ" + lang + "/" + module + ".typ" } v(5pt) } @@ -17,8 +17,8 @@ #importModules(( "education", "skills", - "professional", + "career", "projects", - "publications", - "certificates", + "activity", + "achievements", )) diff --git a/cv_print.typ b/cv_print.typ deleted file mode 100644 index 995f05a..0000000 --- a/cv_print.typ +++ /dev/null @@ -1,23 +0,0 @@ - -// Imports -#import "@preview/brilliant-cv:2.0.5": cv -#let metadata = toml("./metadata.toml") -#let importModules(modules, lang: metadata.language) = { - for module in modules { - include { - "modules_" + lang + "/" + module + ".typ" - } - v(5pt) - } -} - -#show: cv.with(metadata, profilePhoto: image("./src/avatar.jpg")) -// #set text(size: 9pt) -#importModules(( - "education", - "skills", - "professional", - "projects", - "publications", - "certificates", -)) diff --git a/modules_en/certificates.typ b/modules_en/certificates.typ deleted file mode 100644 index 76b2e2d..0000000 --- a/modules_en/certificates.typ +++ /dev/null @@ -1,26 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvHonor -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvHonor = cvHonor.with(metadata: metadata) - - -#cvSection("Certificates") - -#cvHonor( - date: [2022], - title: [AWS Certified Security], - issuer: [Amazon Web Services (AWS)], -) - -#cvHonor( - date: [2017], - title: [Applied Data Science with Python], - issuer: [Coursera], -) - -#cvHonor( - date: [], - title: [SQL Fundamentals Track], - issuer: [Datacamp], -) diff --git a/modules_en/education.typ b/modules_en/education.typ deleted file mode 100644 index e7f33ac..0000000 --- a/modules_en/education.typ +++ /dev/null @@ -1,32 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Education") - -#cvEntry( - title: [Master of Data Science], - society: [University of California, Los Angeles], - date: [2018 - 2020], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Thesis: Predicting Customer Churn in Telecommunications Industry using Machine Learning Algorithms and Network Analysis], - [Course: Big Data Systems and Technologies #hBar() Data Mining and Exploration #hBar() Natural Language Processing], - ), -) - -#cvEntry( - title: [Bachelors of Science in Computer Science], - society: [University of California, Los Angeles], - date: [2018 - 2020], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Thesis: Exploring the Use of Machine Learning Algorithms for Predicting Stock Prices: A Comparative Study of Regression and Time-Series Models], - [Course: Database Systems #hBar() Computer Networks #hBar() Software Engineering #hBar() Artificial Intelligence], - ), -) diff --git a/modules_en/professional.typ b/modules_en/professional.typ deleted file mode 100644 index 75a4e2e..0000000 --- a/modules_en/professional.typ +++ /dev/null @@ -1,45 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Professional Experience") - -#cvEntry( - title: [Director of Data Science], - society: [XYZ Corporation], - logo: image("../src/logos/xyz_corp.png"), - date: [2020 - Present], - location: [San Francisco, CA], - description: list( - [Lead a team of data scientists and analysts to develop and implement data-driven strategies, develop predictive models and algorithms to support decision-making across the organization], - [Collaborate with executive leadership to identify business opportunities and drive growth, implement best practices for data governance, quality, and security], - ), - tags: ("Tags Example here", "Dataiku", "Snowflake", "SparkSQL"), -) - -#cvEntry( - title: [Data Analyst], - society: [ABC Company], - logo: image("../src/logos/abc_company.png"), - date: [2017 - 2020], - location: [New York, NY], - description: list( - [Analyze large datasets with SQL and Python, collaborate with teams to uncover business insights], - [Create data visualizations and dashboards in Tableau, develop and maintain data pipelines with AWS], - ), -) - -#cvEntry( - title: [Data Analysis Intern], - society: [PQR Corporation], - logo: image("../src/logos/pqr_corp.png"), - date: list( - [Summer 2017], - [Summer 2016], - ), - location: [Chicago, IL], - description: list([Assisted with data cleaning, processing, and analysis using Python and Excel, participated in team meetings and contributed to project planning and execution]), -) diff --git a/modules_en/projects.typ b/modules_en/projects.typ deleted file mode 100644 index 6ecb92e..0000000 --- a/modules_en/projects.typ +++ /dev/null @@ -1,20 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Projects & Associations") - -#cvEntry( - title: [Volunteer Data Analyst], - society: [ABC Nonprofit Organization], - date: [2019 - Present], - location: [New York, NY], - description: list( - [Analyze donor and fundraising data to identify trends and opportunities for growth], - [Create data visualizations and dashboards to communicate insights to the board of directors], - [Collaborate with other volunteers to develop and implement data-driven strategies], - ), -) diff --git a/modules_en/publications.typ b/modules_en/publications.typ deleted file mode 100644 index 7c82c5b..0000000 --- a/modules_en/publications.typ +++ /dev/null @@ -1,17 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvPublication -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Publications") - -#cvPublication( - bib: bibliography("../src/publications.bib"), - keyList: ( - "smith2020", - "jones2021", - "wilson2022", - ), - refStyle: "apa", -) diff --git a/modules_en/skills.typ b/modules_en/skills.typ deleted file mode 100644 index 26c7134..0000000 --- a/modules_en/skills.typ +++ /dev/null @@ -1,22 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvSkill, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Skills") - -#cvSkill( - type: [Languages], - info: [English #hBar() French #hBar() Chinese], -) - -#cvSkill( - type: [Tech Stack], - info: [Tableau #hBar() Python (Pandas/Numpy) #hBar() PostgreSQL], -) - -#cvSkill( - type: [Personal Interests], - info: [Swimming #hBar() Cooking #hBar() Reading], -) diff --git a/modules_fr/certificates.typ b/modules_fr/certificates.typ deleted file mode 100644 index e399510..0000000 --- a/modules_fr/certificates.typ +++ /dev/null @@ -1,26 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvHonor -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvHonor = cvHonor.with(metadata: metadata) - - -#cvSection("Certificates") - -#cvHonor( - date: [2022], - title: [AWS Certified Security], - issuer: [Amazon Web Services (AWS)], -) - -#cvHonor( - date: [2017], - title: [Applied Data Science with Python], - issuer: [Coursera], -) - -#cvHonor( - date: [], - title: [Bases de données et requêtes SQL], - issuer: [OpenClassrooms], -) diff --git a/modules_fr/education.typ b/modules_fr/education.typ deleted file mode 100644 index 76062de..0000000 --- a/modules_fr/education.typ +++ /dev/null @@ -1,32 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Formation") - -#cvEntry( - title: [Master en Science des Données], - society: [Université de Californie à Los Angeles], - date: [2018 - 2020], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Thèse : Prédiction du taux de désabonnement des clients dans l'industrie des télécommunications en utilisant des algorithmes d'apprentissage automatique et l'analyse de réseau], - [Cours : Systèmes et technologies Big Data #hBar() Exploration et exploitation de données #hBar() Traitement du langage naturel], - ), -) - -#cvEntry( - title: [Bachelors en Informatique], - society: [Université de Californie à Los Angeles], - date: [2014 - 2018], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Thèse : Exploration de l'utilisation des algorithmes d'apprentissage automatique pour la prédiction des prix des actions : une étude comparative des modèles de régression et de séries chronologiques], - [Cours : Systèmes de base de données #hBar() Réseaux informatiques #hBar() Génie logiciel #hBar() Intelligence artificielle], - ), -) diff --git a/modules_fr/professional.typ b/modules_fr/professional.typ deleted file mode 100644 index 7da954d..0000000 --- a/modules_fr/professional.typ +++ /dev/null @@ -1,45 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Expérience Professionnelle") - -#cvEntry( - title: [Directeur de la Science des Données], - society: [XYZ Corporation], - date: [2020 - Présent], - logo: image("../src/logos/xyz_corp.png"), - location: [San Francisco, CA], - description: list( - [Diriger une équipe de scientifiques et d'analystes de données pour développer et mettre en œuvre des stratégies axées sur les données, développer des modèles prédictifs et des algorithmes pour soutenir la prise de décisions dans toute l'organisation], - [Collaborer avec la direction pour identifier les opportunités d'affaires et stimuler la croissance, mettre en œuvre les meilleures pratiques en matière de gouvernance, de qualité et de sécurité des données], - ), - tags: ("Exemple de tags ici", "Dataiku", "Snowflake", "SparkSQL"), -) - -#cvEntry( - title: [Analyste de Données], - society: [ABC Company], - date: [2017 - 2020], - location: [New York, NY], - logo: image("../src/logos/abc_company.png"), - description: list( - [Analyser de grands ensembles de données avec SQL et Python, collaborer avec les équipes pour découvrir des insights commerciaux], - [Créer des visualisations de données et des tableaux de bord dans Tableau, développer et maintenir des pipelines de données avec AWS], - ), -) - -#cvEntry( - title: [Stagiaire en Analyse de Données], - society: [PQR Corporation], - date: list( - [été 2017], - [été 2016], - ), - location: [Chicago, IL], - logo: image("../src/logos/pqr_corp.png"), - description: list([Aider à la préparation, au traitement et à l'analyse de données à l'aide de Python et Excel, participer aux réunions d'équipe et contribuer à la planification et à l'exécution de projets]), -) diff --git a/modules_fr/projects.typ b/modules_fr/projects.typ deleted file mode 100644 index 38a459c..0000000 --- a/modules_fr/projects.typ +++ /dev/null @@ -1,19 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Projets & Associations") - -#cvEntry( - title: [Analyste de Données Bénévole], - society: [ABC Organisation à But Non Lucratif], - date: [2019 - Présent], - location: [New York, NY], - description: list( - [Analyser les données de donateurs et de collecte de fonds pour identifier les tendances et les opportunités de croissance], - [Créer des visualisations de données et des tableaux de bord pour communiquer des insights au conseil d'administration], - ), -) diff --git a/modules_fr/publications.typ b/modules_fr/publications.typ deleted file mode 100644 index 7c82c5b..0000000 --- a/modules_fr/publications.typ +++ /dev/null @@ -1,17 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvPublication -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Publications") - -#cvPublication( - bib: bibliography("../src/publications.bib"), - keyList: ( - "smith2020", - "jones2021", - "wilson2022", - ), - refStyle: "apa", -) diff --git a/modules_fr/skills.typ b/modules_fr/skills.typ deleted file mode 100644 index 870767f..0000000 --- a/modules_fr/skills.typ +++ /dev/null @@ -1,22 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvSkill, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Compétences") - -#cvSkill( - type: [Langues], - info: [Anglais #hBar() Français #hBar() Chinois], -) - -#cvSkill( - type: [Tech Stack], - info: [Tableau #hBar() Python (Pandas/Numpy) #hBar() PostgreSQL], -) - -#cvSkill( - type: [Centres d'intérêt], - info: [Natation #hBar() Cuisine #hBar() Lecture], -) diff --git a/modules_it/certificates.typ b/modules_it/certificates.typ deleted file mode 100644 index 4611d29..0000000 --- a/modules_it/certificates.typ +++ /dev/null @@ -1,26 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvHonor -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvHonor = cvHonor.with(metadata: metadata) - - -#cvSection("Certificazioni") - -#cvHonor( - date: [2022], - title: [AWS Certified Security], - issuer: [Amazon Web Services (AWS)], -) - -#cvHonor( - date: [2017], - title: [Applied Data Science with Python], - issuer: [Coursera], -) - -#cvHonor( - date: [], - title: [Fondamenti di SQL], - issuer: [Datacamp], -) diff --git a/modules_it/education.typ b/modules_it/education.typ deleted file mode 100644 index 120c750..0000000 --- a/modules_it/education.typ +++ /dev/null @@ -1,32 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Istruzione") - -#cvEntry( - title: [Master in Data Science], - society: [Università della California, Los Angeles], - date: [2018 - 2020], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Tesi: Previsione del tasso di abbandono dei clienti nel settore delle telecomunicazioni mediante algoritmi di apprendimento automatico e analisi delle reti], - [Corsi: Sistemi e tecnologie basati su Big Data #hBar() Data Mining #hBar() Natural language processing], - ), -) - -#cvEntry( - title: [Laurea in informatica], - society: [Università della California, Los Angeles], - date: [2018 - 2020], - location: [USA], - logo: image("../src/logos/ucla.png"), - description: list( - [Tesi: Esplorazione di algoritmi di apprendimento automatico per prevedere i prezzi delle azioni: uno studio comparativo di modelli di regressione e serie temporali], - [Corsi: Sistemi di database #hBar() Reti di calcolatori #hBar() Ingegneria del software #hBar() Intelligenza artificiale], - ), -) diff --git a/modules_it/professional.typ b/modules_it/professional.typ deleted file mode 100644 index 76c019a..0000000 --- a/modules_it/professional.typ +++ /dev/null @@ -1,42 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Esperienze di lavoro") - -#cvEntry( - title: [Direttore di Data Science], - society: [XYZ Corporation], - logo: image("../src/logos/xyz_corp.png"), - date: [2020 - Presente], - location: [San Francisco, CA], - description: list( - [Guido un team di data scientist e analisti per sviluppare e implementare strategie basate sui dati, sviluppo modelli predittivi e algoritmi per supportare il processo decisionale in tutta l'organizzazione], - [Collaboro con la dirigenza esecutiva per identificare opportunità di business e guidare la crescita, implemento le migliori pratiche per la governance dei dati, la qualità e la sicurezza], - ), - tags: ("Tag d'esempio qui", "Dataiku", "Snowflake", "SparkSQL"), -) - -#cvEntry( - title: [Data Analyst], - society: [ABC Company], - logo: image("../src/logos/abc_company.png"), - date: [2017 - 2020], - location: [New York, NY], - description: list( - [Analizzo dataset di grandi dimensioni con SQL e Python, collaboro con i team per avere informazioni utili a livello di business], - [Creo visualizzazioni di dati e dashboard con Tableau, sviluppo e gestisco pipeline di dati con AWS], - ), -) - -#cvEntry( - title: [Tirocinio in Data Analysis], - society: [PQR Corporation], - logo: image("../src/logos/pqr_corp.png"), - date: [Summer 2017], - location: [Chicago, IL], - description: list([Ho collaborato alla pulizia, all'elaborazione e all'analisi dei dati utilizzando Python ed Excel, ho partecipato alle riunioni del team e ho contribuito alla pianificazione e all'esecuzione del progetto]), -) diff --git a/modules_it/projects.typ b/modules_it/projects.typ deleted file mode 100644 index 8625a6e..0000000 --- a/modules_it/projects.typ +++ /dev/null @@ -1,20 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvEntry -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("Progetti") - -#cvEntry( - title: [Data Analyst volontario], - society: [ABC Nonprofit Organization], - date: [2019 - Present], - location: [New York, NY], - description: list( - [Analizzo i dati sui donatori e sulla raccolta fondi per identificare tendenze e opportunità di crescita], - [Creo visualizzazioni di dati e dashboard per comunicare informazioni al consiglio di amministrazione], - [Collaboro con altri volontari per sviluppare e implementare strategie basate sui dati], - ), -) diff --git a/modules_it/publications.typ b/modules_it/publications.typ deleted file mode 100644 index 7a204b0..0000000 --- a/modules_it/publications.typ +++ /dev/null @@ -1,17 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvPublication -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Pubblicazioni") - -#cvPublication( - bib: bibliography("../src/publications.bib"), - keyList: ( - "smith2020", - "jones2021", - "wilson2022", - ), - refStyle: "apa", -) diff --git a/modules_it/skills.typ b/modules_it/skills.typ deleted file mode 100644 index a54c437..0000000 --- a/modules_it/skills.typ +++ /dev/null @@ -1,22 +0,0 @@ -// Imports -#import "@preview/brilliant-cv:2.0.5": cvSection, cvSkill, hBar -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) - - -#cvSection("Competenze") - -#cvSkill( - type: [Lingue], - info: [Inglese #hBar() Francese #hBar() Cinese], -) - -#cvSkill( - type: [Tecnologie], - info: [Tableau #hBar() Python (Pandas/Numpy) #hBar() PostgreSQL], -) - -#cvSkill( - type: [Interessi personali], - info: [Nuoto #hBar() Cucina #hBar() Lettura], -) diff --git a/modules_zh/projects.typ b/modules_zh/projects.typ deleted file mode 100644 index ed90344..0000000 --- a/modules_zh/projects.typ +++ /dev/null @@ -1,158 +0,0 @@ - -// Imports -#import "@preview/brilliant-cv:2.0.5": cvEntry, cvSection -#let metadata = toml("../metadata.toml") -#let cvSection = cvSection.with(metadata: metadata) -#let cvEntry = cvEntry.with(metadata: metadata) - - -#cvSection("项目经历") - -#cvEntry( - title: [智能安保机器人], - society: [Creeper Go], - date: [2025.7], - location: [杭州], - tags: ("ROS", "计算机视觉"), - description: "", -) - -这是一个基于 ROS2 的智能安保机器人,集成了计算机视觉、路径规划等功能。 - -我们现场微调了一个 Yolov8s 模型,训练其可以识别佩戴胸牌的行人。这个机器人会自动追逐场馆内未佩戴胸牌的人。 - -- *[推理延迟优化]* 通过数据预处理、模型量化、减少处理批次等手段,将 Yolov8s 模型的推理延迟从原本的 200ms 降低到 50ms,保证了机器人在移动中的实时识别能力。 - -- *[路径规划]* 构造的简易的自动机,实现了机器人在场馆内的自动巡逻和避障功能。 - -- *[数据回传]* 通过一个模块回传摄像头内容以及识别结果,方便安保人员远程监控。 - -#v(1em) - -#cvEntry( - title: [AI 赋能的前端开发工具], - society: [GuiiAI Devtools], - date: [2024.8 - 2025.1], - location: [杭州], - tags: ("Unplugin", "Vue", "Monorepo", "TypeScript", "Vite"), - description: "", -) - -这是一个作为 Vite Devtools 的 AI 编程开发工具,安装到任意现有项目,不依赖编辑器、IDE。 - -在2024年 AdventureX 黑客松中的作品,后续维护过几个月、开放过限量内测,内测用户大约 1k 人左右。 - -我主要负责的部分是:在比赛阶段和伙伴在三天内做出产品原型、VitePlugin Server 注入SPA 页面的部分、悬浮球的动画、Monorepo 重构后 RPC 库的构建,也参与产品设计的讨论、与投资人的沟通。 - - -- *[项目架构]* GuiiAI Devtools 分为多个包。主要组成部分为:Vite Plugin Server、悬浮球叠加层、操作面板。Vite Server 提供修改代码文件、获取源码的能力,悬浮球叠加层和操作面板可以让用户发出 Prompt。 - - -- *[项目基建]* GuiiAI Devtools 的仓库是一个大的 Monorepo,分为多个包发布。最开始使用 Vercel 的 ai-sdk 作为 AI 库,但由于其自定义能力不够,我们自己封装了 neuri 库作为替代 - -- *[编译时 DOM 注入]* 通过 Vite Plugin 的能力,将一个悬浮球注入到用户 Dev 模式的网页,作为用户控制 AI 写代码的操作中心。注入的元素使用另一个 Vue 实例,因此不要求用户使用 Vue 开发。 - -- *[UI 样式隔离]* 为避免用户页面的全局样式污染悬浮球和面板,我们使用 shadow-dom 隔离了悬浮球和主页面的样式,避免了样式污染,主面板使用 Iframe,隔绝上下文。 - -- *[Vite 到浏览器的 RPC 通信]* 为保证 Vite Plugin Server 和 前端的双向通信,我封装了一个简易的 RPC 库。浏览器不同上下文之间使用 BroadcastChannel 通信,浏览器与 Vite Plugin Server 复用 dev ws 相互通信。 - - - -#v(1em) - -#cvEntry( - title: [气象科学与技术研究], - society: [次季节性热带气旋智能预报研究], - date: [2023.12 - 至今], - location: [南京], - tags: ("PyTorch", "深度学习", "气象预报"), - description: "", -) -开发轻量级多尺度卷积网络(LMCNet)预测台风活动,显著超越传统方法 - -- *[创新点]* 提出LMCNet (轻量级多尺度卷积网络),结合多模态预报数据与气候学观测数据,实现更精确的台风概率预测。针对S2S台风数据集规模小的特点,采用浅层网络架构和多尺度卷积操作,以更少的参数提高季节性台风预测的位置准确度。 - -- *[优秀的模型性能]* 在2023年季节30天预报期内,我们的方法在DBSS评分方面较ECMWF(最佳传统预报模式)提高36%,较UNet预报方法提高18%。当预报提前期少于5天时,LMCNet方法将均方误差降低了60%,显著提高了短期预报精度。 - -// - *[技术栈应用]* 采用PyTorch构建深度学习模型框架,使用PyTorch Lightning简化训练流程并提高代码可读性,通过Seaborn生成高质量可视化图表评估模型预测结果与真实气象数据的差异。 - -- *[成果]* 获得优秀毕业论文,目前正在整理并准备提交气象学顶级期刊发表。衍生项目得到全国软件设计大赛全国二等奖。项目展示了深度学习在气象学领域的应用潜力,为提高热带气旋预测准确性提供了新思路。 - -- *[能力提升]* 通过此项目,我系统掌握了深度学习算法设计、大规模气象数据处理、科研论文撰写和项目管理能力,为后续研究奠定了坚实基础。 - - -#v(1em) - -#cvEntry( - title: "一个资源分享站", - society: "NuistShare", - location: "南京", - tags: ("Nuxt", "NestJs", "Prisma", "TypeScript", "S3", "AList", "Github OAuth"), - description: "", - date: "2023.7-2023.9", -) - -一个使用 Nuxt3、NestJs 开发的学习资料共享站点。部署在腾讯云上。 - -- *[打包体积优化]* 优化字体以及部分样式进行懒加载,部分组件使用动态导入加载,将首屏需要加载的资源从 2M 优化到240k,大大缩短首屏加载时间。 - -- *[中文字体分块优化]* 使用开源项目中文网字计划对字体分包,导出为分片 woff 并在 CDN 处设置强缓存。解决字体过大加载缓慢 的问题。 - -- *[Prerender 支持]* 使用 Nuxt 3 的能力,提前预渲染主页样式,缩短首屏加载时间 - -- *[CDN 集成部署优化]* 利用 vite-plugin-qiniu, 将 assets 上传至 CDN 并配置强缓存 - -- *[S3、AList 多存储协议支持]* 通过抓包并分析 Alist,支持了 Alist 协议,并且支持了 S3 协议。 - -- *[Github OAuth、邮箱验证支持]* 通过 node-mail 库支持了发送邮件,支持了 Github OAuth 登录。 - -- *[响应式UI设计]* 使用了 Vue 3 的 Composition API 进行开发,使用了 Vue 3 的 Suspense 特性, 实现了响应式 UI 设计。 - -// #pagebreak() - -#cvEntry( - title: "麦趣测评小游戏", - society: "麦趣职前教育小游戏", - tags: ("Uniapp", "Vue2", "Vue3", "TypeScript"), - description: "", - location: "南京", - date: "2022.7-2022.9", -) - -一个纯用 H5 技术做的游戏化测评类,内含大量游戏关卡,用于测评、品牌营销等。包含了大量的响应式适配、 动画、事件触发。 - -小游戏有几个版本,初版使用 Uniapp 开发微信小程序,后续有微信 H5 应用。管理平台为用户定制游戏化测评应用的管理平台。 - - -- *[报告图生成]* 在产品的不同时期采用 Canvas 绘制 HTML2CANVAS 的方案动态生成报告图用于用户保存和 分享。 - -- *[微信接入]* 负责完成小程序、H5 应用的 微信登录、支付的接入。 - -- *[组件封装]* 主导组件化工作,负责计时器、判题弹窗、关卡流程控制等游戏通用组件开发,提供给其他成员使用,编写了详 细的组件文档。 - -- *[响应式界面]* 设计响应式系统,基于媒体查询设计响应式断点规则,为多种窗口尺寸进行了响应式适配。对 IOS 微信下方导 航栏进行特殊处理。 - -- *[构建流水线与管理工作]* 使用了 Github Actions 进行自动化构建与部署,推送到相关云服务。负责内部测试、研发 外包的发布、对接工作。 - -// #pagebreak() - - -#cvEntry( - title: "基于 React native 开发的米家空调插件,基于 Spec 协议", - society: "米家空调插件", - tags: ("React Native", "Redux", "Spec Protocol", "i18n", "RTL"), - date: "2025.4-2025.8", - location: "南京", - description: "", -) - -在小米实习时,负责维护和迭代功能的的部分。我主要负责海外的空调产品线的插件迭代、Bugfix、新品需求。 - -- *[项目架构]* 项目采用 React Native 开发,使用 Spec 协议与米家 APP 进行通信。 - -- *[国际化支持]* 使用自封装库完成国际化支持,支持多语言切换。 - -- *[RTL 支持]* 支持了 RTL 布局,支持从右向左的布局。通过对 Victory Chart 等组件库的再封装,实现了图标等组件的 RTL 布局的支持。 - -- *[状态管理]* 使用 Redux 的修改版 Rematch 进行状态管理,自动订阅服务端 Spec 变更 - diff --git a/projects.typ b/projects.typ index cda35a6..3656ae5 100644 --- a/projects.typ +++ b/projects.typ @@ -1,5 +1,5 @@ // Imports -#import "@preview/brilliant-cv:2.0.5": cv, cvSection +#import "@preview/brilliant-cv:3.1.2": cv, cvSection #let metadata = toml("./metadata.toml") #let cvSection = cvSection.with(metadata: metadata) diff --git a/src/logos/abc_company.png b/src/logos/abc_company.png deleted file mode 100644 index 7b1f1dea8aa5c333d69545fa6e9b625071cc18df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6252 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 WTtw>I{+Ou%0000_(2P`%Vpc|$^S9ZN!TO_BT- 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 G-TXh}Xv+ow diff --git a/src/publications.bib b/src/publications.bib deleted file mode 100644 index 027486d..0000000 --- a/src/publications.bib +++ /dev/null @@ -1,31 +0,0 @@ -@article{smith2020, - author = {Smith, John}, - title = {An Introduction to Data Analysis Techniques}, - journal = {Journal of Data Science}, - year = {2020}, - volume = {15}, - number = {2}, - pages = {123-145}, -} - -@inproceedings{jones2021, - author = {Jones, Sarah and Brown, Michael}, - title = {Exploratory Data Analysis for Predictive Modeling}, - booktitle = {Proceedings of the International Conference on Data Science}, - year = {2021}, - pages = {256-267}, -} - -@book{wilson2022, - author = {Wilson, David}, - title = {Machine Learning for Data Analysis}, - publisher = {Springer}, - year = {2022}, -} - -@techreport{brown2023, - author = {Brown, Emily}, - title = {Data Visualization Techniques: A Comparative Study}, - institution = {Technical Report}, - year = {2023}, -} diff --git a/modules_zh/certificates.typ b/zh/achievements.typ similarity index 90% rename from modules_zh/certificates.typ rename to zh/achievements.typ index 1b918ed..57a9301 100644 --- a/modules_zh/certificates.typ +++ b/zh/achievements.typ @@ -1,6 +1,6 @@ // Imports -#import "@preview/brilliant-cv:2.0.5": cvHonor, cvSection +#import "@preview/brilliant-cv:3.1.2": cvHonor, cvSection #let metadata = toml("../metadata.toml") #let cvSection = cvSection.with(metadata: metadata) #let cvHonor = cvHonor.with(metadata: metadata) diff --git a/modules_zh/publications.typ b/zh/activity.typ similarity index 90% rename from modules_zh/publications.typ rename to zh/activity.typ index 6af26e2..ec006a7 100644 --- a/modules_zh/publications.typ +++ b/zh/activity.typ @@ -1,6 +1,6 @@ // Imports -#import "@preview/brilliant-cv:2.0.5": cvPublication, cvSection +#import "@preview/brilliant-cv:3.1.2": cvPublication, cvSection #let metadata = toml("../metadata.toml") #let cvSection = cvSection.with(metadata: metadata) diff --git a/modules_zh/professional.typ b/zh/career.typ similarity index 96% rename from modules_zh/professional.typ rename to zh/career.typ index dc3c721..ff5b702 100644 --- a/modules_zh/professional.typ +++ b/zh/career.typ @@ -1,6 +1,6 @@ // Imports -#import "@preview/brilliant-cv:2.0.5": cvEntry, cvSection +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection #let metadata = toml("../metadata.toml") #let cvSection = cvSection.with(metadata: metadata) #let cvEntry = cvEntry.with(metadata: metadata) diff --git a/modules_zh/education.typ b/zh/education.typ similarity index 93% rename from modules_zh/education.typ rename to zh/education.typ index 32d037d..fba5b0e 100644 --- a/modules_zh/education.typ +++ b/zh/education.typ @@ -1,6 +1,6 @@ // Imports -#import "@preview/brilliant-cv:2.0.5": cvEntry, cvSection, hBar +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection, hBar #let metadata = toml("../metadata.toml") #let cvSection = cvSection.with(metadata: metadata) #let cvEntry = cvEntry.with(metadata: metadata) diff --git a/zh/projects.typ b/zh/projects.typ new file mode 100644 index 0000000..492fbb8 --- /dev/null +++ b/zh/projects.typ @@ -0,0 +1,33 @@ + +// Imports +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection +#let metadata = toml("../metadata.toml") +#let cvSection = cvSection.with(metadata: metadata) +#let cvEntry = cvEntry.with(metadata: metadata) + +#cvSection("项目经历") + + +#include "./projects/creeper.typ" + +#v(1em) + +#include "projects/guiiai.typ" + + +#v(1em) + +#include "projects/typhoon.typ" + +#v(1em) + +#include "projects/nuistshare.typ" + +#v(1em) + +#include "projects/maiqu.typ" + +#v(1em) + +#include "projects/mihome.typ" + diff --git a/zh/projects/creeper.typ b/zh/projects/creeper.typ new file mode 100644 index 0000000..0d6e3b8 --- /dev/null +++ b/zh/projects/creeper.typ @@ -0,0 +1,21 @@ + +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + +#cvEntry( + title: [智能安保机器人], + society: [Creeper Go], + date: [2025.7], + location: [杭州], + tags: ("ROS", "计算机视觉"), + description: "", +) + +这是一个基于 ROS2 的智能安保机器人,集成了计算机视觉、路径规划等功能。 + +我们现场微调了一个 Yolov8s 模型,训练其可以识别佩戴胸牌的行人。这个机器人会自动追逐场馆内未佩戴胸牌的人。 + +- *[推理延迟优化]* 通过数据预处理、模型量化、减少处理批次等手段,将 Yolov8s 模型的推理延迟从原本的 200ms 降低到 50ms,保证了机器人在移动中的实时识别能力。 + +- *[路径规划]* 构造的简易的自动机,实现了机器人在场馆内的自动巡逻和避障功能。 + +- *[数据回传]* 通过一个模块回传摄像头内容以及识别结果,方便安保人员远程监控。 diff --git a/zh/projects/guiiai.typ b/zh/projects/guiiai.typ new file mode 100644 index 0000000..757a0b7 --- /dev/null +++ b/zh/projects/guiiai.typ @@ -0,0 +1,29 @@ +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + + +#cvEntry( + title: [AI 赋能的前端开发工具], + society: [GuiiAI Devtools], + date: [2024.8 - 2025.1], + location: [杭州], + tags: ("Unplugin", "Vue", "Monorepo", "TypeScript", "Vite"), + description: "", +) + +这是一个作为 Vite Devtools 的 AI 编程开发工具,安装到任意现有项目,不依赖编辑器、IDE。 + +在2024年 AdventureX 黑客松中的作品,后续维护过几个月、开放过限量内测,内测用户大约 1k 人左右。 + +我主要负责的部分是:在比赛阶段和伙伴在三天内做出产品原型、VitePlugin Server 注入SPA 页面的部分、悬浮球的动画、Monorepo 重构后 RPC 库的构建,也参与产品设计的讨论、与投资人的沟通。 + + +- *[项目架构]* GuiiAI Devtools 分为多个包。主要组成部分为:Vite Plugin Server、悬浮球叠加层、操作面板。Vite Server 提供修改代码文件、获取源码的能力,悬浮球叠加层和操作面板可以让用户发出 Prompt。 + + +- *[项目基建]* GuiiAI Devtools 的仓库是一个大的 Monorepo,分为多个包发布。最开始使用 Vercel 的 ai-sdk 作为 AI 库,但由于其自定义能力不够,我们自己封装了 neuri 库作为替代 + +- *[编译时 DOM 注入]* 通过 Vite Plugin 的能力,将一个悬浮球注入到用户 Dev 模式的网页,作为用户控制 AI 写代码的操作中心。注入的元素使用另一个 Vue 实例,因此不要求用户使用 Vue 开发。 + +- *[UI 样式隔离]* 为避免用户页面的全局样式污染悬浮球和面板,我们使用 shadow-dom 隔离了悬浮球和主页面的样式,避免了样式污染,主面板使用 Iframe,隔绝上下文。 + +- *[Vite 到浏览器的 RPC 通信]* 为保证 Vite Plugin Server 和 前端的双向通信,我封装了一个简易的 RPC 库。浏览器不同上下文之间使用 BroadcastChannel 通信,浏览器与 Vite Plugin Server 复用 dev ws 相互通信。 diff --git a/zh/projects/maiqu.typ b/zh/projects/maiqu.typ new file mode 100644 index 0000000..783598e --- /dev/null +++ b/zh/projects/maiqu.typ @@ -0,0 +1,27 @@ + +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + + +#cvEntry( + title: "麦趣测评小游戏", + society: "麦趣职前教育小游戏", + tags: ("Uniapp", "Vue2", "Vue3", "TypeScript"), + description: "", + location: "南京", + date: "2022.7-2022.9", +) + +一个纯用 H5 技术做的游戏化测评类,内含大量游戏关卡,用于测评、品牌营销等。包含了大量的响应式适配、 动画、事件触发。 + +小游戏有几个版本,初版使用 Uniapp 开发微信小程序,后续有微信 H5 应用。管理平台为用户定制游戏化测评应用的管理平台。 + + +- *[报告图生成]* 在产品的不同时期采用 Canvas 绘制 HTML2CANVAS 的方案动态生成报告图用于用户保存和 分享。 + +- *[微信接入]* 负责完成小程序、H5 应用的 微信登录、支付的接入。 + +- *[组件封装]* 主导组件化工作,负责计时器、判题弹窗、关卡流程控制等游戏通用组件开发,提供给其他成员使用,编写了详 细的组件文档。 + +- *[响应式界面]* 设计响应式系统,基于媒体查询设计响应式断点规则,为多种窗口尺寸进行了响应式适配。对 IOS 微信下方导 航栏进行特殊处理。 + +- *[构建流水线与管理工作]* 使用了 Github Actions 进行自动化构建与部署,推送到相关云服务。负责内部测试、研发 外包的发布、对接工作。 diff --git a/zh/projects/mihome.typ b/zh/projects/mihome.typ new file mode 100644 index 0000000..9b9c0c3 --- /dev/null +++ b/zh/projects/mihome.typ @@ -0,0 +1,22 @@ +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + + +#cvEntry( + title: "基于 React native 开发的米家空调插件,基于 Spec 协议", + society: "米家空调插件", + tags: ("React Native", "Redux", "Spec Protocol", "i18n", "RTL"), + date: "2025.4-2025.8", + location: "南京", + description: "", +) + +在小米实习时,负责维护和迭代功能的的部分。我主要负责海外的空调产品线的插件迭代、Bugfix、新品需求。 + +- *[项目架构]* 项目采用 React Native 开发,使用 Spec 协议与米家 APP 进行通信。 + +- *[国际化支持]* 使用自封装库完成国际化支持,支持多语言切换。 + +- *[RTL 支持]* 支持了 RTL 布局,支持从右向左的布局。通过对 Victory Chart 等组件库的再封装,实现了图标等组件的 RTL 布局的支持。 + +- *[状态管理]* 使用 Redux 的修改版 Rematch 进行状态管理,自动订阅服务端 Spec 变更 + diff --git a/zh/projects/nuistshare.typ b/zh/projects/nuistshare.typ new file mode 100644 index 0000000..08a7184 --- /dev/null +++ b/zh/projects/nuistshare.typ @@ -0,0 +1,27 @@ +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + + +#cvEntry( + title: "一个资源分享站", + society: "NuistShare", + location: "南京", + tags: ("Nuxt", "NestJs", "Prisma", "TypeScript", "S3", "AList", "Github OAuth"), + description: "", + date: "2023.7-2023.9", +) + +一个使用 Nuxt3、NestJs 开发的学习资料共享站点。部署在腾讯云上。 + +- *[打包体积优化]* 优化字体以及部分样式进行懒加载,部分组件使用动态导入加载,将首屏需要加载的资源从 2M 优化到240k,大大缩短首屏加载时间。 + +- *[中文字体分块优化]* 使用开源项目中文网字计划对字体分包,导出为分片 woff 并在 CDN 处设置强缓存。解决字体过大加载缓慢 的问题。 + +- *[Prerender 支持]* 使用 Nuxt 3 的能力,提前预渲染主页样式,缩短首屏加载时间 + +- *[CDN 集成部署优化]* 利用 vite-plugin-qiniu, 将 assets 上传至 CDN 并配置强缓存 + +- *[S3、AList 多存储协议支持]* 通过抓包并分析 Alist,支持了 Alist 协议,并且支持了 S3 协议。 + +- *[Github OAuth、邮箱验证支持]* 通过 node-mail 库支持了发送邮件,支持了 Github OAuth 登录。 + +- *[响应式UI设计]* 使用了 Vue 3 的 Composition API 进行开发,使用了 Vue 3 的 Suspense 特性, 实现了响应式 UI 设计。 diff --git a/zh/projects/typhoon.typ b/zh/projects/typhoon.typ new file mode 100644 index 0000000..20d2106 --- /dev/null +++ b/zh/projects/typhoon.typ @@ -0,0 +1,22 @@ +#import "@preview/brilliant-cv:3.1.2": cvEntry, cvSection + +#cvEntry( + title: [气象科学与技术研究], + society: [次季节性热带气旋智能预报研究], + date: [2023.12 - 至今], + location: [南京], + tags: ("PyTorch", "深度学习", "气象预报"), + description: "", +) +开发轻量级多尺度卷积网络(LMCNet)预测台风活动,显著超越传统方法 + +- *[创新点]* 提出LMCNet (轻量级多尺度卷积网络),结合多模态预报数据与气候学观测数据,实现更精确的台风概率预测。针对S2S台风数据集规模小的特点,采用浅层网络架构和多尺度卷积操作,以更少的参数提高季节性台风预测的位置准确度。 + +- *[优秀的模型性能]* 在2023年季节30天预报期内,我们的方法在DBSS评分方面较ECMWF(最佳传统预报模式)提高36%,较UNet预报方法提高18%。当预报提前期少于5天时,LMCNet方法将均方误差降低了60%,显著提高了短期预报精度。 + +// - *[技术栈应用]* 采用PyTorch构建深度学习模型框架,使用PyTorch Lightning简化训练流程并提高代码可读性,通过Seaborn生成高质量可视化图表评估模型预测结果与真实气象数据的差异。 + +- *[成果]* 获得优秀毕业论文,目前正在整理并准备提交气象学顶级期刊发表。衍生项目得到全国软件设计大赛全国二等奖。项目展示了深度学习在气象学领域的应用潜力,为提高热带气旋预测准确性提供了新思路。 + +- *[能力提升]* 通过此项目,我系统掌握了深度学习算法设计、大规模气象数据处理、科研论文撰写和项目管理能力,为后续研究奠定了坚实基础。 + diff --git a/modules_zh/skills.typ b/zh/skills.typ similarity index 94% rename from modules_zh/skills.typ rename to zh/skills.typ index e555f03..b22df0a 100644 --- a/modules_zh/skills.typ +++ b/zh/skills.typ @@ -1,14 +1,14 @@ // Import -#import "@preview/brilliant-cv:2.0.5": cvSection, cvSkill, hBar +#import "@preview/brilliant-cv:3.1.2": cvSection, cvSkill, hBar #let metadata = toml("../metadata.toml") #let cvSection = cvSection.with(metadata: metadata) #cvSection("开发技能") -#set text(weight: 300) -#set strong(delta: 200) +// #set text(weight: 400) +#set strong(delta: 300) #columns(2)[