mirror of
				https://github.com/theoludwig/theoludwig.git
				synced 2025-10-14 20:23:25 +02:00 
			
		
		
		
	fix: update Curriculum Vitae
This commit is contained in:
		| @@ -74,6 +74,10 @@ | ||||
|     @apply font-semibold italic; | ||||
|     cursor: help; | ||||
|   } | ||||
|  | ||||
|   small { | ||||
|     font-size: 87%; | ||||
|   } | ||||
| } | ||||
|  | ||||
| body { | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     "en-US": "English", | ||||
|     "fr-FR": "French" | ||||
|   }, | ||||
|   "fr-FR-main": "French (primary language)", | ||||
|   "loading": "Loading...", | ||||
|   "errors": { | ||||
|     "error": "Error", | ||||
| @@ -24,7 +25,7 @@ | ||||
|       "description": "I constantly wonder how to improve our present, to make our future better, particularly thanks to the advancements in computer science. <br></br> My priority is to craft intuitive user experiences (UX), that meet the needs of the users in the most efficient way possible.", | ||||
|       "title": "About" | ||||
|     }, | ||||
|     "description": "Developer Full Stack • Student", | ||||
|     "description": "Developer Full Stack • French Student", | ||||
|     "education": { | ||||
|       "cnam": { | ||||
|         "institution": "Conservatoire National des Arts et Métiers (CNAM), in Eckbolsheim - UIMM Alsace - ITII Alsace", | ||||
| @@ -45,7 +46,7 @@ | ||||
|           "2021-2022": { | ||||
|             "courses": { | ||||
|               "java": "Object Oriented Development in Java", | ||||
|               "sql": "Relational database and SQL language", | ||||
|               "sql": "<strong>Relational database and SQL language</strong>", | ||||
|               "systems-c": "Systems programming in C (Memory allocation, Pointers, Structures)", | ||||
|               "windows-forms": "Windows Forms (.NET Framework) Application Development in C#" | ||||
|             }, | ||||
| @@ -54,10 +55,10 @@ | ||||
|           }, | ||||
|           "2022-2023": { | ||||
|             "courses": { | ||||
|               "clean-code": "Design Patterns and Principles (Maintainable and Reusable Code) in UML", | ||||
|               "clean-code": "Design Patterns and Principles (<strong>Maintainable and Reusable Code</strong>) in UML", | ||||
|               "sql-security": "Securing database access and PL/SQL", | ||||
|               "systems-c": "Systems programming in C (Multi-Thread, Server/Client UDP/TCP)", | ||||
|               "tests": "Development Quality and Automated Testing", | ||||
|               "systems-c": "Systems programming in <strong>C (Multi-Thread, Server/Client UDP/TCP)</strong>", | ||||
|               "tests": "<strong>Development Quality and Automated Testing</strong>", | ||||
|               "web": "Web development with the Laravel framework in PHP" | ||||
|             }, | ||||
|             "description": "2nd year", | ||||
| @@ -68,7 +69,7 @@ | ||||
|               "ci-cd": "Continuous Integration/Deployment (CI/CD) and Docker", | ||||
|               "complexity-algorithms": "Theoretical and Practical Algorithmic Complexity in C++", | ||||
|               "no-sql": "NoSQL database (Redis, MongoDB, Cassandra)", | ||||
|               "web": "Web development in Node.js and React.js" | ||||
|               "web": "<strong>Web development in Node.js and React.js</strong>" | ||||
|             }, | ||||
|             "description": "3rd year", | ||||
|             "title": "2023 - 2024" | ||||
| @@ -90,7 +91,7 @@ | ||||
|     "interests": { | ||||
|       "title": "Interests & hobbies", | ||||
|       "fusey": "<link>Fusey (fusey.gg)</link>: website I'm developing for the game ARK that tracks the number of players connected to the servers in real time and has <strong>over ~5,000 visitors each month, ~100,000 members on Discord, and ~120,000 followers on X/Twitter</strong>.", | ||||
|       "open-source": "Open-Source Enthusiast" | ||||
|       "open-source": "<strong>Open-Source Contributor</strong>: publishing and <strong>contributing to npm packages</strong> and <link-github>GitHub</link-github> repositories, notably with <link-markdownlint>markdownlint-rule-relative-links</link-markdownlint> (around 20,000 downloads per week), contributions to <link-leon>Leon</link-leon>, an open-source personal assistant, among other projects." | ||||
|     }, | ||||
|     "work": { | ||||
|       "ircad": { | ||||
| @@ -98,12 +99,12 @@ | ||||
|         "position": "Full Stack Web Developer Apprentice", | ||||
|         "tasks": { | ||||
|           "WebSurg": "Development of WebSurg, a virtual university dedicated to medical-surgical training, built with React.js/Next.js and API Platform with Symfony.", | ||||
|           "Figma": "Integration of Figma mockups for WebSurg, website dedicated to medical-surgical training.", | ||||
|           "Figma": "<strong>Integration of Figma mockups</strong> for WebSurg, website dedicated to medical-surgical training.", | ||||
|           "IRCAD-Core": "IRCAD Core, an internal tool for managing medical training sessions and their requirements (anatomical models, medications, staff training, etc.).", | ||||
|           "feature-logs": "History and traceability of data modifications (what? who? when?) in IRCAD Core.", | ||||
|           "feature-permissions": "Advanced permissions system and OAuth2 authentication, with read, write, and delete access restricted for specific users of the IRCAD Core application.", | ||||
|           "feature-search": "Search engine with filters, sorting, and customizable display for each user of IRCAD Core.", | ||||
|           "feature-architecture": "IRCAD Core project architecture in TypeScript Monorepo with Turborepo, automatic deployment (CI/CD) and self-hosted internally with Docker Compose." | ||||
|           "feature-permissions": "<strong>Advanced permissions system and OAuth2 authentication</strong>, with read, write, and delete access restricted for specific users of the IRCAD Core application.", | ||||
|           "feature-search": "<strong>Search engine with filters, sorting, and customizable display</strong> for each user of IRCAD Core.", | ||||
|           "feature-architecture": "IRCAD Core project architecture in <strong>TypeScript Monorepo</strong> with Turborepo, <strong>automatic deployment (CI/CD)</strong> and <strong>self-hosted internally with Docker Compose</strong>." | ||||
|         } | ||||
|       }, | ||||
|       "numerize": { | ||||
| @@ -175,7 +176,10 @@ | ||||
|       "others": "Others", | ||||
|       "programming-languages": "Programming languages", | ||||
|       "software-tools": "Software and tools", | ||||
|       "title": "Skills" | ||||
|       "title": "Skills", | ||||
|  | ||||
|       "rust-advent-of-code": " (as hobby and <link-aoc>Advent Of Code</link-aoc>)", | ||||
|       "go-basics": " (basics and fundamentals)" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     "en-US": "Anglais", | ||||
|     "fr-FR": "Français" | ||||
|   }, | ||||
|   "fr-FR-main": "Français (langue principale)", | ||||
|   "loading": "Chargement...", | ||||
|   "errors": { | ||||
|     "error": "Erreur", | ||||
| @@ -45,7 +46,7 @@ | ||||
|           "2021-2022": { | ||||
|             "courses": { | ||||
|               "java": "Développement Orientée Objet en Java", | ||||
|               "sql": "Base de données relationnelles et langage SQL", | ||||
|               "sql": "<strong>Base de données relationnelles et langage SQL</strong>", | ||||
|               "systems-c": "Programmation systèmes en C (Allocation mémoire, Pointeurs, Structures)", | ||||
|               "windows-forms": "Développement d'application Windows Forms (.NET Framework) en C#" | ||||
|             }, | ||||
| @@ -54,10 +55,10 @@ | ||||
|           }, | ||||
|           "2022-2023": { | ||||
|             "courses": { | ||||
|               "clean-code": "Patrons et Principes de conceptions (Code maintenable et réutilisable) en UML", | ||||
|               "clean-code": "Patrons et Principes de conceptions (<strong>Code maintenable et réutilisable</strong>) en UML", | ||||
|               "sql-security": "Sécurisation des accès à la base de données et PL/SQL", | ||||
|               "systems-c": "Programmation systèmes en C (Multi-Thread, Serveur/Client UDP/TCP)", | ||||
|               "tests": "Qualité de développement et Tests automatisés", | ||||
|               "systems-c": "Programmation systèmes en <strong>C (Multi-Thread, Serveur/Client UDP/TCP)</strong>", | ||||
|               "tests": "<strong>Qualité de développement et Tests automatisés</strong>", | ||||
|               "web": "Développement Web avec le framework Laravel en PHP" | ||||
|             }, | ||||
|             "description": "2ème année", | ||||
| @@ -68,7 +69,7 @@ | ||||
|               "ci-cd": "Intégration/Déploiement Continue et Docker", | ||||
|               "complexity-algorithms": "Complexité Algorithmique Théorique et Pratique en C++", | ||||
|               "no-sql": "Base de données NoSQL (Redis, MongoDB, Cassandra)", | ||||
|               "web": "Développement Web en Node.js et React.js" | ||||
|               "web": "<strong>Développement Web en Node.js et React.js</strong>" | ||||
|             }, | ||||
|             "description": "3ème année", | ||||
|             "title": "2023 - 2024" | ||||
| @@ -90,7 +91,7 @@ | ||||
|     "interests": { | ||||
|       "title": "Intérêts & loisirs", | ||||
|       "fusey": "<link>Fusey (fusey.gg)</link> : site web que je développe pour le jeu ARK qui permet de suivre en temps réel le nombre de joueurs connectés sur les serveurs et a plus de <strong>~5 000 visiteurs chaque mois, ~100 000 membres sur Discord et ~120 000 followers sur X/Twitter</strong>.", | ||||
|       "open-source": "Enthousiaste de l'Open-Source" | ||||
|       "open-source": "<strong>Contributeur de l'Open-Source</strong> : publications et <strong>contributions sur npm</strong> et <link-github>GitHub</link-github> avec notamment <link-markdownlint>markdownlint-rule-relative-links</link-markdownlint> avec ~20 000 téléchargements par semaine, contributions à <link-leon>Leon</link-leon>, un assistant personnel open source, parmis d'autres projets." | ||||
|     }, | ||||
|     "work": { | ||||
|       "ircad": { | ||||
| @@ -98,12 +99,12 @@ | ||||
|         "position": "Apprenti Développeur Web Full Stack", | ||||
|         "tasks": { | ||||
|           "WebSurg": "Développement de WebSurg, une université virtuelle consacrée à la formation médico-chirurgicale, en React.js/Next.js et API Platform avec Symfony.", | ||||
|           "Figma": "Intégration des maquettes Figma pour WebSurg, site web consacrée à la formation médico-chirurgicale.", | ||||
|           "Figma": "<strong>Intégration des maquettes Figma</strong> pour WebSurg, site web consacrée à la formation médico-chirurgicale.", | ||||
|           "IRCAD-Core": "IRCAD Core, outil interne de gestion des formations médicales et leurs besoins (modèles anatomiques, médicaments, formations du personnel, etc.).", | ||||
|           "feature-logs": "Historique et traçabilité des modifications des données (quoi? qui? quand?) dans IRCAD Core.", | ||||
|           "feature-permissions": "Système de permissions avancé et authentification OAuth2, avec accès en lecture, écriture et suppression restreint pour des utilisateurs spécifiques de l'application IRCAD Core.", | ||||
|           "feature-search": "Moteur de recherche avec filtres, tris et ordre d'affichage personnalisable pour IRCAD Core.", | ||||
|           "feature-architecture": "Architecture du projet IRCAD Core en Monorepo TypeScript avec Turborepo, déploiement automatique (CI/CD) et hébergé en interne avec Docker Compose." | ||||
|           "feature-permissions": "<strong>Système de permissions avancé</strong> et authentification OAuth2, avec accès en lecture, écriture et suppression restreint pour des utilisateurs spécifiques de l'application IRCAD Core.", | ||||
|           "feature-search": "<strong>Moteur de recherche avec filtres, tris et ordre d'affichage personnalisable</strong> pour IRCAD Core.", | ||||
|           "feature-architecture": "Architecture du projet IRCAD Core en <strong>Monorepo TypeScript</strong> avec Turborepo, <strong>déploiement automatique (CI/CD)</strong> et <strong>hébergé en interne avec Docker Compose</strong>." | ||||
|         } | ||||
|       }, | ||||
|       "numerize": { | ||||
| @@ -175,7 +176,10 @@ | ||||
|       "others": "Autres", | ||||
|       "programming-languages": "Langages de programmation", | ||||
|       "software-tools": "Logiciels et outils", | ||||
|       "title": "Compétences" | ||||
|       "title": "Compétences", | ||||
|  | ||||
|       "rust-advent-of-code": " (pendant temps libre et <link-aoc>Advent Of Code</link-aoc>)", | ||||
|       "go-basics": " (bases et fondamentaux)" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -33,7 +33,14 @@ export const CurriculumVitaeEducation: React.FC< | ||||
|             // t( | ||||
|             //   "curriculum-vitae.education.iut.years.2021-2022.courses.windows-forms", | ||||
|             // ), | ||||
|             t("curriculum-vitae.education.iut.years.2021-2022.courses.sql"), | ||||
|             t.rich( | ||||
|               "curriculum-vitae.education.iut.years.2021-2022.courses.sql", | ||||
|               { | ||||
|                 strong: (children) => { | ||||
|                   return <strong>{children}</strong> | ||||
|                 }, | ||||
|               }, | ||||
|             ), | ||||
|           ], | ||||
|         }, | ||||
|         { | ||||
| @@ -41,13 +48,30 @@ export const CurriculumVitaeEducation: React.FC< | ||||
|           title: t("curriculum-vitae.education.iut.years.2022-2023.title"), | ||||
|           courses: [ | ||||
|             t("curriculum-vitae.education.iut.years.2022-2023.courses.web"), | ||||
|             t("curriculum-vitae.education.iut.years.2022-2023.courses.tests"), | ||||
|             t( | ||||
|             t.rich( | ||||
|               "curriculum-vitae.education.iut.years.2022-2023.courses.tests", | ||||
|               { | ||||
|                 strong: (children) => { | ||||
|                   return <strong>{children}</strong> | ||||
|                 }, | ||||
|               }, | ||||
|             ), | ||||
|             t.rich( | ||||
|               "curriculum-vitae.education.iut.years.2022-2023.courses.clean-code", | ||||
|               { | ||||
|                 strong: (children) => { | ||||
|                   return <strong>{children}</strong> | ||||
|                 }, | ||||
|               }, | ||||
|             ), | ||||
|             // t("curriculum-vitae.education.iut.years.2022-2023.courses.sql-security"), | ||||
|             t( | ||||
|             t.rich( | ||||
|               "curriculum-vitae.education.iut.years.2022-2023.courses.systems-c", | ||||
|               { | ||||
|                 strong: (children) => { | ||||
|                   return <strong>{children}</strong> | ||||
|                 }, | ||||
|               }, | ||||
|             ), | ||||
|           ], | ||||
|         }, | ||||
| @@ -55,7 +79,14 @@ export const CurriculumVitaeEducation: React.FC< | ||||
|           year: t("curriculum-vitae.education.iut.years.2023-2024.description"), | ||||
|           title: t("curriculum-vitae.education.iut.years.2023-2024.title"), | ||||
|           courses: [ | ||||
|             t("curriculum-vitae.education.iut.years.2023-2024.courses.web"), | ||||
|             t.rich( | ||||
|               "curriculum-vitae.education.iut.years.2023-2024.courses.web", | ||||
|               { | ||||
|                 strong: (children) => { | ||||
|                   return <strong>{children}</strong> | ||||
|                 }, | ||||
|               }, | ||||
|             ), | ||||
|             t("curriculum-vitae.education.iut.years.2023-2024.courses.ci-cd"), | ||||
|             t( | ||||
|               "curriculum-vitae.education.iut.years.2023-2024.courses.complexity-algorithms", | ||||
| @@ -114,8 +145,8 @@ export const CurriculumVitaeEducation: React.FC< | ||||
|                             paddingInlineStart: 20, | ||||
|                           }} | ||||
|                         > | ||||
|                           {courses.map((course) => { | ||||
|                             return <li key={course}>{course}</li> | ||||
|                           {courses.map((course, index) => { | ||||
|                             return <li key={index}>{course}</li> | ||||
|                           })} | ||||
|                         </ul> | ||||
|                       </li> | ||||
|   | ||||
| @@ -10,9 +10,44 @@ export const CurriculumVitaeInterests: React.FC< | ||||
|   const t = useTranslations() | ||||
|  | ||||
|   const interests = [ | ||||
|     <strong key="open-source"> | ||||
|       {t("curriculum-vitae.interests.open-source")} | ||||
|     </strong>, | ||||
|     t.rich("curriculum-vitae.interests.open-source", { | ||||
|       strong: (children) => { | ||||
|         return <strong>{children}</strong> | ||||
|       }, | ||||
|       "link-github": (children) => { | ||||
|         return ( | ||||
|           <a | ||||
|             href="https://github.com/theoludwig" | ||||
|             target="_blank" | ||||
|             className="font-semibold" | ||||
|           > | ||||
|             {children} | ||||
|           </a> | ||||
|         ) | ||||
|       }, | ||||
|       "link-leon": (children) => { | ||||
|         return ( | ||||
|           <a | ||||
|             href="https://github.com/leon-ai/leon" | ||||
|             target="_blank" | ||||
|             className="font-semibold" | ||||
|           > | ||||
|             {children} | ||||
|           </a> | ||||
|         ) | ||||
|       }, | ||||
|       "link-markdownlint": (children) => { | ||||
|         return ( | ||||
|           <a | ||||
|             href="https://www.npmjs.com/package/markdownlint-rule-relative-links" | ||||
|             target="_blank" | ||||
|             className="font-semibold" | ||||
|           > | ||||
|             {children} | ||||
|           </a> | ||||
|         ) | ||||
|       }, | ||||
|     }), | ||||
|     t.rich("curriculum-vitae.interests.fusey", { | ||||
|       link: (children) => { | ||||
|         return ( | ||||
|   | ||||
| @@ -30,7 +30,9 @@ export const CurriculumVitaeProfile: React.FC< | ||||
|           <h1 className="h3 my-1!"> | ||||
|             <strong>{t("meta.title")}</strong> | ||||
|           </h1> | ||||
|           <h2 className="text-muted h5">{t("curriculum-vitae.description")}</h2> | ||||
|           <h2 className="text-muted h5 font-semibold"> | ||||
|             {t("curriculum-vitae.description")} | ||||
|           </h2> | ||||
|           <h2 className="text-muted h5"> | ||||
|             <BirthDate /> | ||||
|           </h2> | ||||
| @@ -39,17 +41,13 @@ export const CurriculumVitaeProfile: React.FC< | ||||
|       </div> | ||||
|       <div className="flex justify-center"> | ||||
|         <div className="relative px-3"> | ||||
|           <strong className="info"> | ||||
|             <a className="" href="mailto:contact@theoludwig.fr"> | ||||
|               contact@theoludwig.fr | ||||
|             </a> | ||||
|           <strong className="info font-bold"> | ||||
|             <a href="mailto:contact@theoludwig.fr">contact@theoludwig.fr</a> | ||||
|           </strong> | ||||
|         </div> | ||||
|         <div className="detail"> | ||||
|           <strong className="info"> | ||||
|             <Link className="" href="/"> | ||||
|               https://theoludwig.fr | ||||
|             </Link> | ||||
|           <strong className="info font-bold"> | ||||
|             <Link href="/">https://theoludwig.fr</Link> | ||||
|           </strong> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
| @@ -23,7 +23,11 @@ export const CurriculumVitaeSkills: React.FC< | ||||
|     }), | ||||
|     { | ||||
|       category: "others", | ||||
|       skillNames: [t("locales.en-US"), t("home.skills.driving-license")], | ||||
|       skillNames: [ | ||||
|         t("fr-FR-main"), | ||||
|         t("locales.en-US"), | ||||
|         t("home.skills.driving-license"), | ||||
|       ], | ||||
|     }, | ||||
|   ] as const | ||||
|  | ||||
| @@ -45,6 +49,23 @@ export const CurriculumVitaeSkills: React.FC< | ||||
|                     return ( | ||||
|                       <p key={skillName} className="label label-keyword"> | ||||
|                         {skillName} | ||||
|                         {skillName === "Rust" | ||||
|                           ? t.rich("home.skills.rust-advent-of-code", { | ||||
|                               "link-aoc": (children) => { | ||||
|                                 return ( | ||||
|                                   <a | ||||
|                                     href="https://github.com/theoludwig/advent_of_code" | ||||
|                                     target="_blank" | ||||
|                                     className="no-underline" | ||||
|                                   > | ||||
|                                     {children} | ||||
|                                   </a> | ||||
|                                 ) | ||||
|                               }, | ||||
|                             }) | ||||
|                           : skillName === "Go" | ||||
|                             ? t("home.skills.go-basics") | ||||
|                             : ""} | ||||
|                       </p> | ||||
|                     ) | ||||
|                   })} | ||||
|   | ||||
| @@ -17,12 +17,28 @@ export const CurriculumVitaeWork: React.FC<CurriculumVitaeWorkProps> = () => { | ||||
|       duration: t("curriculum-vitae.work.ircad.duration"), | ||||
|       tasks: [ | ||||
|         // t("curriculum-vitae.work.ircad.tasks.WebSurg"), | ||||
|         t("curriculum-vitae.work.ircad.tasks.Figma"), | ||||
|         t.rich("curriculum-vitae.work.ircad.tasks.Figma", { | ||||
|           strong: (children) => { | ||||
|             return <strong>{children}</strong> | ||||
|           }, | ||||
|         }), | ||||
|         t("curriculum-vitae.work.ircad.tasks.IRCAD-Core"), | ||||
|         t("curriculum-vitae.work.ircad.tasks.feature-logs"), | ||||
|         t("curriculum-vitae.work.ircad.tasks.feature-permissions"), | ||||
|         t("curriculum-vitae.work.ircad.tasks.feature-search"), | ||||
|         t("curriculum-vitae.work.ircad.tasks.feature-architecture"), | ||||
|         t.rich("curriculum-vitae.work.ircad.tasks.feature-permissions", { | ||||
|           strong: (children) => { | ||||
|             return <strong>{children}</strong> | ||||
|           }, | ||||
|         }), | ||||
|         t.rich("curriculum-vitae.work.ircad.tasks.feature-search", { | ||||
|           strong: (children) => { | ||||
|             return <strong>{children}</strong> | ||||
|           }, | ||||
|         }), | ||||
|         t.rich("curriculum-vitae.work.ircad.tasks.feature-architecture", { | ||||
|           strong: (children) => { | ||||
|             return <strong>{children}</strong> | ||||
|           }, | ||||
|         }), | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
| @@ -74,8 +90,8 @@ export const CurriculumVitaeWork: React.FC<CurriculumVitaeWorkProps> = () => { | ||||
|                   }} | ||||
|                   className="space-y-1" | ||||
|                 > | ||||
|                   {workExperience.tasks.map((task) => { | ||||
|                     return <li key={task}>{task}</li> | ||||
|                   {workExperience.tasks.map((task, index) => { | ||||
|                     return <li key={index}>{task}</li> | ||||
|                   })} | ||||
|                 </ul> | ||||
|               ) : ( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user