Clean
This commit is contained in:
parent
c18aae8a6c
commit
9fb016d579
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/main.pdf
BIN
build/main.pdf
Binary file not shown.
|
@ -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*]
|
|
@ -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_ ]
|
||||||
|
)
|
||||||
|
])
|
171
main.typ
171
main.typ
|
@ -1,171 +1,30 @@
|
||||||
#import "template.typ"
|
#import "template.typ"
|
||||||
#show: doc => template.apply(doc)
|
#show: doc => template.init(doc)
|
||||||
|
|
||||||
#v(1cm)
|
// Include template
|
||||||
|
#template.header(
|
||||||
#grid(
|
name: [Thomas Forgione],
|
||||||
columns: (6cm, 1fr),
|
description: [Docteur en informatique et télécommunications],
|
||||||
|
|
||||||
[],
|
|
||||||
|
|
||||||
[
|
|
||||||
#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 left column
|
||||||
|
#show: doc => template.leftColumn(doc)
|
||||||
|
|
||||||
|
#let leftcolumn = {
|
||||||
#v(1cm)
|
v(0.5cm)
|
||||||
#set text(size: 12pt)
|
include "./left-column.typ"
|
||||||
|
|
||||||
#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_ ]
|
|
||||||
)
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
#leftcolumn
|
#leftcolumn
|
||||||
|
|
||||||
|
// Go back to the top of the page
|
||||||
#style(styles => {
|
#style(styles => {
|
||||||
let size = measure(leftcolumn, styles)
|
let size = measure(leftcolumn, styles)
|
||||||
v(-size.height - 0.75cm)
|
v(-size.height - 0.75cm)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Include content
|
||||||
|
#v(1.2cm)
|
||||||
|
#show: doc => template.content(doc)
|
||||||
|
|
||||||
#show link: content => {
|
#include "./content.typ"
|
||||||
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*]
|
|
||||||
|
|
49
template.typ
49
template.typ
|
@ -1,4 +1,5 @@
|
||||||
#let apply(doc) = {
|
// Basic template settings. Must be shown at very begining
|
||||||
|
#let init(doc) = {
|
||||||
set page(
|
set page(
|
||||||
paper: "a4",
|
paper: "a4",
|
||||||
numbering: none,
|
numbering: none,
|
||||||
|
@ -16,6 +17,30 @@
|
||||||
set text(font: "CMU Sans Serif")
|
set text(font: "CMU Sans Serif")
|
||||||
set par(leading: 0.4em)
|
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 => {
|
show heading.where(level: 1): it => {
|
||||||
set text(fill: blue)
|
set text(fill: blue)
|
||||||
grid(
|
grid(
|
||||||
|
@ -33,6 +58,26 @@
|
||||||
doc
|
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) = {
|
#let entry(body, left: content) = {
|
||||||
grid(
|
grid(
|
||||||
gutter: 1em,
|
gutter: 1em,
|
||||||
|
@ -44,6 +89,7 @@
|
||||||
v(-4pt)
|
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 entry2(left: content, heading: content, description: content, note: content) = {
|
||||||
|
|
||||||
let content = [
|
let content = [
|
||||||
|
@ -73,6 +119,7 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A score box between 1 and 5.
|
||||||
#let score(level: int) = {
|
#let score(level: int) = {
|
||||||
|
|
||||||
let elems = ()
|
let elems = ()
|
||||||
|
|
Loading…
Reference in New Issue