Initial commit
|
@ -0,0 +1,2 @@
|
|||
all:
|
||||
mkdir -p build && typst compile --font-path assets/fonts main.typ build/main.pdf
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-360q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35Zm0 280q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg>
|
After Width: | Height: | Size: 470 B |
|
@ -0,0 +1 @@
|
|||
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>
|
After Width: | Height: | Size: 963 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path d="M480-480q33 0 56.5-23.5T560-560q0-33-23.5-56.5T480-640q-33 0-56.5 23.5T400-560q0 33 23.5 56.5T480-480Zm0 294q122-112 181-203.5T720-552q0-109-69.5-178.5T480-800q-101 0-170.5 69.5T240-552q0 71 59 162.5T480-186Zm0 106Q319-217 239.5-334.5T160-552q0-150 96.5-239T480-880q127 0 223.5 89T800-552q0 100-79.5 217.5T480-80Zm0-480Z"/></svg>
|
After Width: | Height: | Size: 426 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path fill="#000000" d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80 320-200H160l320 200ZM160-640v-80 480-400Z"/></svg>
|
After Width: | Height: | Size: 325 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path fill="#000000" d="M280-40q-33 0-56.5-23.5T200-120v-720q0-33 23.5-56.5T280-920h400q33 0 56.5 23.5T760-840v720q0 33-23.5 56.5T680-40H280Zm0-120v40h400v-40H280Zm0-80h400v-480H280v480Zm0-560h400v-40H280v40Zm0 0v-40 40Zm0 640v40-40Z"/></svg>
|
After Width: | Height: | Size: 331 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 -960 960 960" width="24"><path fill="#000000" d="M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-7-.5-14.5T799-507q-5 29-27 48t-52 19h-80q-33 0-56.5-23.5T560-520v-40H400v-80q0-33 23.5-56.5T480-720h40q0-23 12.5-40.5T563-789q-20-5-40.5-8t-42.5-3q-134 0-227 93t-93 227h200q66 0 113 47t47 113v40H400v110q20 5 39.5 7.5T480-160Z"/></svg>
|
After Width: | Height: | Size: 564 B |
After Width: | Height: | Size: 583 KiB |
|
@ -0,0 +1,171 @@
|
|||
#import "template.typ"
|
||||
#show: doc => template.apply(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
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
|
||||
#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_ ]
|
||||
)
|
||||
])
|
||||
|
||||
|
||||
]
|
||||
|
||||
#leftcolumn
|
||||
|
||||
#style(styles => {
|
||||
let size = measure(leftcolumn, styles)
|
||||
v(-size.height - 0.75cm)
|
||||
})
|
||||
|
||||
|
||||
#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*]
|
|
@ -0,0 +1,97 @@
|
|||
#let apply(doc) = {
|
||||
set page(
|
||||
paper: "a4",
|
||||
numbering: none,
|
||||
margin: (left: 0.25cm, right: 0.25cm, top: 0.5cm, bottom: 0.5cm),
|
||||
background: [
|
||||
#align(top + left, rect(width: 5.55cm, height: 100%, fill: blue.lighten(90%)))
|
||||
#v(-100%)
|
||||
#v(-1.3em)
|
||||
#align(top, rect(width: 100%, height: 4.4cm, fill: blue))
|
||||
#v(-5cm)
|
||||
#align(top + left, box(inset: (x: 0.8cm, y: 1cm), image("./assets/moi.png", height: 4cm)))
|
||||
],
|
||||
)
|
||||
|
||||
set text(font: "CMU Sans Serif")
|
||||
set par(leading: 0.4em)
|
||||
|
||||
show heading.where(level: 1): it => {
|
||||
set text(fill: blue)
|
||||
grid(
|
||||
gutter: 1em,
|
||||
columns: (5cm, 7fr),
|
||||
[], // align(horizon, [#v(3pt) #rect(width: 1cm, height: 0.33em, fill: blue)]),
|
||||
[
|
||||
#it.body
|
||||
#v(-0.5cm)
|
||||
#line(stroke: blue, length: 100%)
|
||||
],
|
||||
)
|
||||
}
|
||||
|
||||
doc
|
||||
}
|
||||
|
||||
#let entry(body, left: content) = {
|
||||
grid(
|
||||
gutter: 1em,
|
||||
columns: (5.5cm, 0.75fr, 7fr),
|
||||
[],
|
||||
align(right, left),
|
||||
body,
|
||||
)
|
||||
v(-4pt)
|
||||
}
|
||||
|
||||
#let entry2(left: content, heading: content, description: content, note: content) = {
|
||||
|
||||
let content = [
|
||||
#heading \
|
||||
#set text(size: 12pt, style: "italic")
|
||||
#description \
|
||||
#set text(size: 11pt, style: "normal")
|
||||
#note
|
||||
]
|
||||
|
||||
style(styles => {
|
||||
let size = measure(content, styles)
|
||||
let offset = measure(left, styles)
|
||||
grid(
|
||||
gutter: 1em,
|
||||
columns: (5.5cm, 0.75fr, 7fr),
|
||||
[],
|
||||
align(center, [
|
||||
#left
|
||||
#v(-0.5em)
|
||||
#line(angle: 90deg, length: size.height - offset.height - 0.5em)
|
||||
]),
|
||||
content
|
||||
)
|
||||
v(-4pt)
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
#let score(level: int) = {
|
||||
|
||||
let elems = ()
|
||||
|
||||
for x in range(5) {
|
||||
if level > x {
|
||||
elems.push(rect(width: 0.4cm, height: 0.2cm, fill: blue))
|
||||
} else {
|
||||
elems.push(rect(width: 0.4cm, height: 0.2cm, fill: blue.lighten(60%)))
|
||||
}
|
||||
}
|
||||
|
||||
v(0.1cm)
|
||||
stack(
|
||||
dir: ltr,
|
||||
elems.at(0), h(0.1cm),
|
||||
elems.at(1), h(0.1cm),
|
||||
elems.at(2), h(0.1cm),
|
||||
elems.at(3), h(0.1cm),
|
||||
elems.at(4),
|
||||
)
|
||||
}
|