diff --git a/assets/fonts/cmunsi.ttf b/assets/fonts/cmunsi.ttf new file mode 100644 index 0000000..bcbbb14 Binary files /dev/null and b/assets/fonts/cmunsi.ttf differ diff --git a/assets/fonts/cmunssdc.ttf b/assets/fonts/cmunssdc.ttf deleted file mode 100644 index c46b443..0000000 Binary files a/assets/fonts/cmunssdc.ttf and /dev/null differ diff --git a/assets/fonts/cmunsx.ttf b/assets/fonts/cmunsx.ttf new file mode 100644 index 0000000..53d642c Binary files /dev/null and b/assets/fonts/cmunsx.ttf differ diff --git a/build/main.pdf b/build/main.pdf index 36149b8..1126046 100644 Binary files a/build/main.pdf and b/build/main.pdf differ diff --git a/content.typ b/content.typ new file mode 100644 index 0000000..8d36ec9 --- /dev/null +++ b/content.typ @@ -0,0 +1,68 @@ +#import "template.typ" + += Parcours + +#template.entry2( + left: image(height: 15pt, "./assets/icons/adjust.svg"), + heading: [*Polymny Studio*, _Toulouse_, #link("https://polymny.studio")], + description: [ Logiciel SAAS permettant la réalisation de MOOC facilement ], + note: [ + Co-fondateur, responsable R&D, développeur + - président de l'Association Polymny Studio jusqu'en Sept 2022 + - base de données unique pour deux instances : gratuite / payante + - partie gratuite auto-hébergée chez tetaneutral + - partie payante sur cluster kubernetes OVHcloud avec stockage S3 + ] +) + +#template.entry2( + left: [2019], + heading: [*Doctorat*, _Toulouse INP_, #link("https://tforgione.fr/phd/")], + description: [Doctorat en informatique et télécommunications], + note: [ + Transmission adaptative de modèles 3D massifs + - encodage de modèle 3D optimisé pour le streaming interactif + - streaming adapté au point de vue + - interface du bureau avec clavier / souris + - interface smartphone avec joystick virtuel et gyroscope + ] +) + +#template.entry2( + left: [2015], + heading: [*Diplôme d'ingénieur*, _ENSEEIHT_], + description: [_Diplôme d'ingénieur en informatique et mathématiques appliquées_], + note: [_Spécialisation en multimédia et traitement d'images_] +) + += Projets + +#template.entry2( + left: [2021], + heading: [*Ergol*, #link("https://ergol-rs.github.io")], + description: [ORM asynchrone pour Rust], + note: [ + - proc macro via annotation pour génération de code lié aux tables + - gestion des one-to-one, one-to-many, many-to-many + - création / réinitialisation de tables automatiques + - fonctions utilitaires pour SELECT, UPDATE, DELETE + - intégration avec le framework web Rocket + ] +) + +#template.entry2( + left: [2019], + heading: [*My Twitch Replays*, #link("https://twitch.tforgione.fr")], + description: [Plate-forme de vidéo à la demande serverless via HTTP], + note: [ + - encodage vidéo multi-résolution en HLS avec FFmpeg + - lecteur vidéo custom en elm avec miniatures de navigation + - selection manuelle ou automatique de la résolution via hls.js + ] +) + += Loisirs + +#template.entry(left: [Sport])[*jiujitsu brésilien depuis 2021, ceinture bleue*] +#template.entry(left: [Moto])[*permis A2 depuis 2016, permis A depuis 2018*] +#template.entry(left: [Musique])[*guitare acoustique et éléctrique depuis 2008*] diff --git a/left-column.typ b/left-column.typ new file mode 100644 index 0000000..5c80376 --- /dev/null +++ b/left-column.typ @@ -0,0 +1,50 @@ +#import "template.typ" + += Contact + +#align(left + top, [ + #grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.2cm, + [ #image("assets/icons/location.svg", height: 10pt) ], + [ 9 bd de la Gare, appt 83 \ + 31500 Toulouse France + ], + [ #image("assets/icons/phone.svg", height: 10pt) ], [ 06.71.22.05.84 ], + [ #image("assets/icons/mail.svg", height: 10pt) ], [ #link("mailto:thomas@forgione.fr")[thomas\@forgione.fr] ], + [ #image("assets/icons/world.svg", height: 10pt) ], [ #link("https://tforgione.fr")[https://tforgione.fr] ], + [ #image("assets/icons/github.svg", height: 10pt) ], [ #link("https://github.com/tforgione")[\@tforgione] ] + ) +]) + += Programmation + +#align(left + top, [ + #grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm, + [ Rust ], [ #template.score(level: 4) ], + [ Elm ], [ #template.score(level: 4) ], + [ JS ], [ #template.score(level: 4) ], + [ C++ ], [ #template.score(level: 3) ], + [ Python ], [ #template.score(level: 3) ], + [ Java ], [ #template.score(level: 3) ], + [ Shell ], [ #template.score(level: 4) ], + ) +]) + += DevOps + +#align(left + top, [ + #grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm, + [ Docker ], [ #template.score(level: 3) ], + [ Kubernetes ], [ #template.score(level: 3) ], + [ RabbitMQ ], [ #template.score(level: 2) ], + [ S3 ], [ #template.score(level: 3) ], + ) +]) + += Langues + +#align(left + top, [ + #grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.3cm, + [ *Français* ], [ _Langue maternelle_ ], + [ *Anglais* ], [ _Niveau C1_ ] + ) +]) diff --git a/main.typ b/main.typ index 7008ae7..57d860e 100644 --- a/main.typ +++ b/main.typ @@ -1,171 +1,30 @@ #import "template.typ" -#show: doc => template.apply(doc) +#show: doc => template.init(doc) -#v(1cm) - -#grid( - columns: (6cm, 1fr), - - [], - - [ - #v(-0.25cm) - #set text(size: 40pt, fill: white) - Thomas Forgione \ - #set text(size: 18pt, style: "italic") - Docteur en informatique et télécommunications - ], +// Include template +#template.header( + name: [Thomas Forgione], + description: [Docteur en informatique et télécommunications], ) +// Include left column +#show: doc => template.leftColumn(doc) - -#v(1cm) -#set text(size: 12pt) - -#let leftcolumn = [ - - #show link: content => { - underline(content) - } - - #show heading.where(level: 1): it => { - v(0.75cm) - text(size: 16pt, weight: "bold", it.body) - v(-0.5cm) - line(length: 5cm) - } - - #v(-0.5cm) - - = Contact - - #align(left + top, [ - #grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.2cm, - [ #image("assets/icons/location.svg", height: 10pt) ], - [ 9 bd de la Gare, appt 83 \ - 31500 Toulouse France - ], - [ #image("assets/icons/phone.svg", height: 10pt) ], [ 06.71.22.05.84 ], - [ #image("assets/icons/mail.svg", height: 10pt) ], [ #link("mailto:thomas@forgione.fr")[thomas\@forgione.fr] ], - [ #image("assets/icons/world.svg", height: 10pt) ], [ #link("https://tforgione.fr")[https://tforgione.fr] ], - [ #image("assets/icons/github.svg", height: 10pt) ], [ #link("https://github.com/tforgione")[\@tforgione] ] - ) - ]) - - = Programmation - - #align(left + top, [ - #grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm, - [ Rust ], [ #template.score(level: 4) ], - [ Elm ], [ #template.score(level: 4) ], - [ JS ], [ #template.score(level: 4) ], - [ C++ ], [ #template.score(level: 3) ], - [ Python ], [ #template.score(level: 3) ], - [ Java ], [ #template.score(level: 3) ], - [ Shell ], [ #template.score(level: 4) ], - ) - ]) - - = DevOps - - #align(left + top, [ - #grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm, - [ Docker ], [ #template.score(level: 3) ], - [ Kubernetes ], [ #template.score(level: 3) ], - [ RabbitMQ ], [ #template.score(level: 2) ], - [ S3 ], [ #template.score(level: 3) ], - ) - ]) - - = Langues - - #align(left + top, [ - #grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.3cm, - [ *Français* ], [ _Langue maternelle_ ], - [ *Anglais* ], [ _Niveau C1_ ] - ) - ]) - - -] +#let leftcolumn = { + v(0.5cm) + include "./left-column.typ" +} #leftcolumn +// Go back to the top of the page #style(styles => { let size = measure(leftcolumn, styles) v(-size.height - 0.75cm) }) +// Include content +#v(1.2cm) +#show: doc => template.content(doc) -#show link: content => { - set text(fill: blue) - underline(content) -} - -#v(0.21cm) -= Parcours - -#template.entry2( - left: image(height: 15pt, "./assets/icons/adjust.svg"), - heading: [*Polymny Studio*, _Toulouse_, #link("https://polymny.studio")], - description: [ Logiciel SAAS permettant la réalisation de MOOC facilement ], - note: [ - Co-fondateur, responsable R&D, développeur - - président de l'Association Polymny Studio jusqu'en Sept 2022 - - base de données unique pour deux instances : gratuite / payante - - partie gratuite auto-hébergée chez tetaneutral - - partie payante sur cluster kubernetes OVHcloud avec stockage S3 - ] -) - -#template.entry2( - left: [2019], - heading: [*Doctorat*, _Toulouse INP_, #link("https://tforgione.fr/phd/")], - description: [Doctorat en informatique et télécommunications], - note: [ - Transmission adaptative de modèles 3D massifs - - encodage de modèle 3D optimisé pour le streaming interactif - - streaming adapté au point de vue - - interface du bureau avec clavier / souris - - interface smartphone avec joystick virtuel et gyroscope - ] -) - -#template.entry2( - left: [2015], - heading: [*Diplôme d'ingénieur*, _ENSEEIHT_], - description: [_Diplôme d'ingénieur en informatique et mathématiques appliquées_], - note: [_Spécialisation en multimédia et traitement d'images_] -) - -= Projets - -#template.entry2( - left: [2021], - heading: [*Ergol*, #link("https://ergol-rs.github.io")], - description: [ORM asynchrone pour Rust], - note: [ - - proc macro via annotation pour génération de code lié aux tables - - gestion des one-to-one, one-to-many, many-to-many - - création / réinitialisation de tables automatiques - - fonctions utilitaires pour SELECT, UPDATE, DELETE - - intégration avec le framework web Rocket - ] -) - -#template.entry2( - left: [2019], - heading: [*My Twitch Replays*, #link("https://twitch.tforgione.fr")], - description: [Plate-forme de vidéo à la demande serverless via HTTP], - note: [ - - encodage vidéo multi-résolution en HLS avec FFmpeg - - lecteur vidéo custom en elm avec miniatures de navigation - - selection manuelle ou automatique de la résolution via hls.js - ] -) - -= Loisirs - -#template.entry(left: [Sport])[*jiujitsu brésilien depuis 2021, ceinture bleue*] -#template.entry(left: [Moto])[*permis A2 depuis 2016, permis A depuis 2018*] -#template.entry(left: [Musique])[*guitare acoustique et éléctrique depuis 2008*] +#include "./content.typ" diff --git a/template.typ b/template.typ index 2f70152..df9b153 100644 --- a/template.typ +++ b/template.typ @@ -1,4 +1,5 @@ -#let apply(doc) = { +// Basic template settings. Must be shown at very begining +#let init(doc) = { set page( paper: "a4", numbering: none, @@ -16,6 +17,30 @@ set text(font: "CMU Sans Serif") set par(leading: 0.4em) + doc +} + +// Template for the left column. Must be shown before filling the left column content. +#let leftColumn(doc) = { + set text(size: 12pt) + + show link: content => { + underline(content) + } + + show heading.where(level: 1): it => { + v(0.75cm) + text(size: 16pt, weight: "bold", it.body) + v(-0.5cm) + line(length: 5cm) + } + + doc +} + +// Template for the rest of the CV. Must be shown after the left column is done. +#let content(doc) = { + show heading.where(level: 1): it => { set text(fill: blue) grid( @@ -33,6 +58,26 @@ doc } +// Print the header of the CV. +#let header(name: content, description: content) = { + v(1cm) + grid( + columns: (6cm, 1fr), + + [], + + [ + #v(-0.25cm) + #set text(size: 40pt, fill: white) + Thomas Forgione \ + #set text(size: 18pt, style: "italic") + Docteur en informatique et télécommunications + ], + ) +} + + +// A simple entry in the CV. #let entry(body, left: content) = { grid( gutter: 1em, @@ -44,6 +89,7 @@ v(-4pt) } +// An entry in the CV with "until" date, heading, description and note. #let entry2(left: content, heading: content, description: content, note: content) = { let content = [ @@ -73,6 +119,7 @@ }) } +// A score box between 1 and 5. #let score(level: int) = { let elems = ()