Compare commits

..

No commits in common. "main" and "polymny" have entirely different histories.

5 changed files with 39 additions and 160 deletions

Binary file not shown.

View File

@ -1,37 +1,17 @@
#import "template.typ" #import "template.typ"
// Configuration
// Polymny config
#let spacing = 0.2cm
#let show_publications = true
#let show_projects = false
= Parcours = Parcours
#template.entry2( #template.entry2(
left: image(height: 15pt, "./assets/icons/adjust.svg"), left: image(height: 15pt, "./assets/icons/adjust.svg"),
heading: [*Yuzzit*, _Paris (télétravail)_, #link("https://www.yuzzit.video")],
description: [Logiciel de découpe et de montage vidéo depuis un flux live],
note: [
Senior backend engineer
- découpe vidéo au format HLS
- ajout du support pour bucket S3 privé
- adaptation de la plate-forme à l'envoi de fichier via MASV
- authentification via google workspaces avec support des groupes
]
)
#template.entry2(
left: [2025],
heading: [*Polymny Studio*, _Toulouse_, #link("https://polymny.studio")], heading: [*Polymny Studio*, _Toulouse_, #link("https://polymny.studio")],
description: [Logiciel SAAS permettant la réalisation de MOOC facilement], description: [Logiciel SAAS permettant la réalisation de MOOC facilement],
note: [ note: [
Co-fondateur, responsable R&D, développeur Co-fondateur, responsable R&D, développeur
- pilotage et développement de l'architecture multi-instances - pilotage et développement de l'architecture multi-instances
// - instance sur cluster kubernetes OVHcloud avec stockage S3 - instance sur cluster kubernetes OVHcloud avec stockage S3
// - instance auto-hébergée chez tetaneutral - instance auto-hébergée chez tetaneutral
// - développement de l'UI/UX, frontend et backend - développement de l'UI/UX, frontend et backend
- président de lAssociation Polymny Studio jusquen Sept 2022 - président de lAssociation Polymny Studio jusquen Sept 2022
] ]
) )
@ -44,8 +24,8 @@
Transmission adaptative de modèles 3D massifs Transmission adaptative de modèles 3D massifs
- encodage de modèle 3D optimisé pour le streaming interactif - encodage de modèle 3D optimisé pour le streaming interactif
- streaming adapté au point de vue - streaming adapté au point de vue
// - interface du bureau avec clavier / souris - interface du bureau avec clavier / souris
// - interface smartphone avec joystick virtuel et gyroscope - interface smartphone avec joystick virtuel et gyroscope
] ]
) )
@ -56,54 +36,7 @@
note: [Spécialisation en multimédia et traitement d'images] note: [Spécialisation en multimédia et traitement d'images]
) )
#v(spacing) #v(0.8cm)
#if show_publications [
= Publications
#let local_spacing = 0.0em
#template.entry2(
left: [2019],
heading: [*Using 3D Bookmarks for Desktop and Mobile DASH-3D Clients*],
description: [
ACMMM 19 Demo Paper \
#link("https://tforgione.fr/publications/acmmm19/")
],
note: [T. Forgione, A. Carlier, G. Morin, W. T. Ooi, V. Charvillat],
disable_line: true,
)
#v(local_spacing)
#template.entry2(
left: [2018],
heading: [*DASH for 3D Networked Virtual Environment*],
description: [
ACMMM 18 Long Paper + Demo paper \
#link("https://tforgione.fr/publications/acmmm18/")
],
note: [T. Forgione, A. Carlier, G. Morin, W. T. Ooi, V. Charvillat, P. K. Yadav],
disable_line: true,
)
#v(local_spacing)
#template.entry2(
left: [2016],
heading: [*Impact of 3D Bookmarks on Navigation and Streaming in a Networked Virtual Environment*],
description: [
MMSys 16 Long Paper \
#link("https://tforgione.fr/publications/mmsys16/")
],
note: [T. Forgione, A. Carlier, G. Morin, W. T. Ooi, V. Charvillat],
disable_line: true,
)
]
#if show_projects [
= Projets = Projets
@ -132,9 +65,7 @@
] ]
) )
] #v(0.8cm)
#v(spacing)
= Loisirs = Loisirs

View File

@ -1,16 +1,8 @@
#import "template.typ" #import "template.typ"
#let is_polymny = false
#let is_yuzzit = true
#let spacing = 0.2cm
= Contact = Contact
#if is_polymny { #align(left + top, [
// Version polymny
align(left + top, [
#grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.2cm, #grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.2cm,
[ #image("assets/icons/location.svg", height: 10pt) ], [ #image("assets/icons/location.svg", height: 10pt) ],
[ Polymny Studio \ [ Polymny Studio \
@ -18,48 +10,12 @@ align(left + top, [
31110 Moustajon 31110 Moustajon
], ],
[ #image("assets/icons/phone.svg", height: 10pt) ], [ 05.82.95.91.76 ], [ #image("assets/icons/phone.svg", height: 10pt) ], [ 05.82.95.91.76 ],
[ #image("assets/icons/mail.svg", height: 10pt) ], [ #link("mailto:contact@polymny.studio")[contacter\@polymny.studio] ], [ #image("assets/icons/mail.svg", height: 10pt) ], [ #link("mailto:thomas@forgione.fr")[contacter\@polymny.studio] ],
[ #image("assets/icons/world.svg", height: 10pt) ], [ #link("https://tforgione.fr")[https://tforgione.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] ] [ #image("assets/icons/github.svg", height: 10pt) ], [ #link("https://github.com/tforgione")[\@tforgione] ]
) )
]) ])
} else if is_yuzzit {
// Version yuzzit
align(left + top, [
#grid(columns: (auto, auto), row-gutter: 0.5cm, column-gutter: 0.2cm,
[ #image("assets/icons/location.svg", height: 10pt) ],
[ 6 Rue de la Tourelle, \
92100 Boulogne-Billancourt
],
[ #image("assets/icons/phone.svg", height: 10pt) ], [ 06.71.22.05.84 ],
[ #image("assets/icons/mail.svg", height: 10pt) ], [ #link("mailto:thomas.forgione@yuzzitpro.com")[thomas.forgione \ \@yuzzitpro.com] ],
[ #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] ]
)
])
} else {
// Version perso
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
],
[ #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] ]
)
])
}
#v(spacing)
= Programmation = Programmation
#align(left + top, [ #align(left + top, [
@ -74,21 +30,17 @@ align(left + top, [
) )
]) ])
#v(spacing)
= DevOps = DevOps
#align(left + top, [ #align(left + top, [
#grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm, #grid(columns: (2cm, auto), row-gutter: 0.5cm, column-gutter: 0.5cm,
[ Docker ], [ #template.score(level: 4) ], [ Docker ], [ #template.score(level: 4) ],
[ Kubernetes ], [ #template.score(level: 3) ], [ Kubernetes ], [ #template.score(level: 4) ],
[ RabbitMQ ], [ #template.score(level: 3) ], [ RabbitMQ ], [ #template.score(level: 3) ],
[ S3 ], [ #template.score(level: 4) ], [ S3 ], [ #template.score(level: 3) ],
) )
]) ])
#v(spacing)
= Langues = Langues
#align(left + top, [ #align(left + top, [

View File

@ -18,10 +18,10 @@
#leftcolumn #leftcolumn
// Go back to the top of the page // Go back to the top of the page
#context { #style(styles => {
let size = measure(leftcolumn) let size = measure(leftcolumn, styles)
v(-size.height - 0.75cm) v(-size.height - 0.75cm)
} })
// Include content // Include content
#v(1.2cm) #v(1.2cm)

View File

@ -6,22 +6,22 @@
let opacity = "33" // opacity hex chars let opacity = "33" // opacity hex chars
// let polymny = read("./assets/polymny.svg") let polymny = read("./assets/polymny.svg")
// let polymny_transparent = polymny let polymny_transparent = polymny
// .replace("#FFFFFFFF", "#FFFFFF" + opacity) .replace("#FFFFFFFF", "#FFFFFF" + opacity)
// .replace("#EAE2D4FF", "#EAE2D4" + opacity) .replace("#EAE2D4FF", "#EAE2D4" + opacity)
// .replace("#BDB299FF", "#BDB299" + opacity) .replace("#BDB299FF", "#BDB299" + opacity)
set page( set page(
paper: "a4", paper: "a4",
numbering: none, numbering: none,
margin: (left: 0.25cm, right: 0.25cm, top: 0.5cm, bottom: 0.5cm), margin: (left: 0.25cm, right: 0.25cm, top: 0.5cm, bottom: 0.5cm),
background: [ background: [
// #place(bottom + left, dx: 2cm, dy: 2.75cm, { #place(bottom + left, dx: 2cm, dy: 2.75cm, {
// image.decode(polymny_transparent, width: 65em, height: 65em) image.decode(polymny_transparent, width: 65em, height: 65em)
// }) })
#place(top + left, rect(width: 5.8cm, height: 100%, fill: color.lighten(90%))) #place(top + left, rect(width: 5.55cm, height: 100%, fill: color.lighten(90%)))
#place(top + left, rect(width: 100%, height: 4.4cm, fill: color)) #place(top + left, rect(width: 100%, height: 4.4cm, fill: color))
#place(top + left, dx: 0.8cm, dy: 1cm, image("./assets/moi.png", height: 4cm)) #place(top + left, dx: 0.8cm, dy: 1cm, image("./assets/moi.png", height: 4cm))
], ],
@ -63,7 +63,7 @@
set text(fill: color) set text(fill: color)
grid( grid(
gutter: 1em, gutter: 1em,
columns: (5.25cm, 7fr), columns: (5cm, 7fr),
[], // align(horizon, [#v(3pt) #rect(width: 1cm, height: 0.33em, fill: color)]), [], // align(horizon, [#v(3pt) #rect(width: 1cm, height: 0.33em, fill: color)]),
[ [
#it.body #it.body
@ -99,7 +99,7 @@
#let entry(body, left: content) = { #let entry(body, left: content) = {
grid( grid(
gutter: 1em, gutter: 1em,
columns: (5.75cm, 0.75fr, 7fr), columns: (5.5cm, 0.75fr, 7fr),
[], [],
align(right, left), align(right, left),
body, body,
@ -108,7 +108,7 @@
} }
// An entry in the CV with "until" date, heading, description and note. // An entry in the CV with "until" date, heading, description and note.
#let entry2(left: content, heading: content, description: content, note: content, disable_line: false) = { #let entry2(left: content, heading: content, description: content, note: content) = {
let content = [ let content = [
#heading \ #heading \
@ -118,39 +118,35 @@
#note #note
] ]
layout(size => { layout(size =>
context { style(styles => {
let size = measure({ let size = measure({
block( block(
width: size.width, width: size.width,
grid( grid(
gutter: 1em, gutter: 1em,
columns: (5.75cm, 0.75fr, 7fr), columns: (5.5cm, 0.75fr, 7fr),
[], [], content [], [], content
) )
) )
}) }, styles)
let offset = measure(left) let offset = measure(left, styles)
grid( grid(
gutter: 1em, gutter: 1em,
columns: (5.75cm, 0.75fr, 7fr), columns: (5.5cm, 0.75fr, 7fr),
[], [],
if not disable_line {
align(center, [ align(center, [
#left #left
#v(-0.5em) #v(-0.5em)
#line(angle: 90deg, length: size.height - offset.height - 0.5em) #line(angle: 90deg, length: size.height - offset.height - 0.5em)
]) ]),
} else {
left
},
content content
) )
v(-4pt) v(-4pt)
}
}) })
)
} }
// A score box between 1 and 5. // A score box between 1 and 5.