initial commit

This commit is contained in:
khannurien
2026-01-17 08:39:11 +01:00
commit d4b7a1ba99
43 changed files with 5026 additions and 0 deletions

54
.devcontainer/Dockerfile Normal file
View File

@@ -0,0 +1,54 @@
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# Install dependencies for TeX Live installation and usage
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
perl \
biber \
wget \
fontconfig \
make \
git \
curl \
python3 \
python3-pygments \
&& rm -rf /var/lib/apt/lists/*
# Set non-root user provided by Microsoft base image
ARG USERNAME=vscode
# Switch to user home directory
USER $USERNAME
WORKDIR /home/$USERNAME
# Set TeX Live paths and update environment
ENV TEXLIVE_INSTALL_PREFIX="/usr/local/texlive"
ENV TEXLIVE_INSTALL_TEXDIR="${TEXLIVE_INSTALL_PREFIX}/2025"
ENV PATH="${TEXLIVE_INSTALL_TEXDIR}/bin/x86_64-linux:${PATH}"
# Download and install TeX Live 2025 as root
RUN wget -q https://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz && \
tar -xzf install-tl-unx.tar.gz && \
rm install-tl-unx.tar.gz && \
cd install-tl-* && \
echo "selected_scheme scheme-full" > texlive.profile && \
echo "TEXDIR ${TEXLIVE_INSTALL_TEXDIR}" >> texlive.profile && \
echo "TEXMFCONFIG /home/vscode/.texlive2025/texmf-config" >> texlive.profile && \
echo "TEXMFVAR /home/vscode/.texlive2025/texmf-var" >> texlive.profile && \
echo "instopt_adjustpath 1" >> texlive.profile && \
echo "tlpdbopt_autobackup 0" >> texlive.profile && \
sudo perl ./install-tl --profile=texlive.profile --no-interaction && \
cd .. && rm -rf install-tl-*
# User-writeable directories for TeX Live and LuaLaTeX
ENV TEXMFCONFIG="/home/vscode/.texlive2025/texmf-config"
ENV TEXMFVAR="/home/vscode/.texlive2025/texmf-var"
ENV LUAOTFLOAD_HOME="/home/vscode/.texlive2025/texmf-var/luatex-cache"
ENV LUAOTFLOAD_DB="/home/vscode/.texlive2025/texmf-var/luatex-cache/database.sqlite"
# Install latexmk
RUN sudo tlmgr option autobackup 0 && \
sudo tlmgr install latexmk && \
sudo tlmgr path add
# Set the working directory back to a neutral location
WORKDIR /workspace

View File

@@ -0,0 +1,118 @@
{
"name": "LaTeX Dev Container",
"image": "ghcr.io/khannurien/latex-devcontainer:2025.12",
"customizations": {
"vscode": {
"settings": {
// VSCode text editor settings
"editor.fontSize": 16,
"editor.tabSize": 2,
"editor.lineHeight": 1.8,
"editor.cursorBlinking": "phase",
"editor.unicodeHighlight.nonBasicASCII": false,
"editor.wordWrap": "on",
"editor.wrappingStrategy": "advanced",
"editor.wordBasedSuggestions": "off",
// "editor.quickSuggestions": {
// "other": "on",
// "comments": "off",
// "strings": "off"
// },
// "editor.acceptSuggestionOnEnter": "off",
// LaTeX Workshop settings
"latex-workshop.intellisense.package.enabled": true,
"latex-workshop.intellisense.unimathsymbols.enabled": true,
"latex-workshop.intellisense.citation.backend": "biblatex",
"latex-workshop.latex.outDir": "build",
"latex-workshop.latex.autoBuild.run": "onFileChange",
"latex-workshop.latex.autoBuild.interval": 3000,
"latex-workshop.synctex.afterBuild.enabled": true,
"latex-workshop.view.autoFocus.enabled": false,
"latex-workshop.view.pdf.reload.transition": "fade",
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.view.pdf.zoom": "auto",
"latex-workshop.latex.tools": [
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-pdflatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + pdflatex + biber"
},
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-xelatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + xelatex + biber"
},
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-lualatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + lualatex + biber"
}
],
"latex-workshop.latex.recipes": [
{
"name": "latexmk + lualatex + biber",
"tools": [
"latexmk + lualatex + biber"
]
},
{
"name": "latexmk + xelatex + biber",
"tools": [
"latexmk + xelatex + biber"
]
},
{
"name": "latexmk + pdflatex + biber",
"tools": [
"latexmk + pdflatex + biber"
]
}
],
"latex-workshop.latex.recipe.default": "lastUsed"
},
"extensions": [
"james-yu.latex-workshop",
"wayou.vscode-todo-highlight"
]
}
},
"remoteUser": "vscode",
"updateRemoteUserUID": true,
"features": {}
}

301
.gitignore vendored Normal file
View File

@@ -0,0 +1,301 @@
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
.*.lb
## Intermediate documents:
*.dvi
*.xdv
*-converted-to.*
# these rules might exclude image files for figures etc.
# *.ps
# *.eps
# *.pdf
## Generated if empty string is given at "Please type another file name for output:"
.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Build tool directories for auxiliary files
# latexrun
latex.out/
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# comment
*.cut
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
*.lzo
*.lzs
*.slg
*.slo
*.sls
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
# *.ist
# gnuplot
*.gnuplot
*.table
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.glog
*.gtex
# htlatex
*.4ct
*.4tc
*.idv
*.lg
*.trc
*.xref
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
# *.tikz
*-tikzDictionary
# listings
*.lol
# luatexja-ruby
*.ltjruby
# makeidx
*.idx
*.ilg
*.ind
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# newpax
*.newpax
# nomencl
*.nlg
*.nlo
*.nls
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# svg
svg-inkscape/
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# tcolorbox
*.listing
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# titletoc
*.ptc
# todonotes
*.tdo
# vhistory
*.hst
*.ver
# easy-todo
*.lod
# xcolor
*.xcp
# xmpincl
*.xmpi
# xindy
*.xdy
# xypic precompiled matrices and outlines
*.xyc
*.xyd
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# LyX
*.lyx~
# Kile
*.backup
# gummi
.*.swp
# KBibTeX
*~[0-9]*
# TeXnicCenter
*.tps
# auto folder when using emacs and auctex
./auto/*
*.el
# expex forward references with \gathertags
*-tags.tex
# standalone packages
*.sta
# Makeindex log files
*.lpz
# xwatermark package
*.xwm
# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
# Uncomment the next line to have this generated file ignored.
#*Notes.bib

3
.vscode/ltex.dictionary.fr.txt vendored Normal file
View File

@@ -0,0 +1,3 @@
UMR
STICC
POJO

View File

@@ -0,0 +1 @@
{"rule":"FR_SPELLING_RULE","sentence":"^\\QVincent Lannurien 1 \\E(?:Dummy|Ina|Jimmy-|Dummy-|Maniquí-|Maniquíes-|Dummy\\+|Dummy's\\+)[0-9]+\\Q Vincent Lannurien\\E$"}

103
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,103 @@
{
// VSCode text editor settings
"editor.fontSize": 16,
"editor.tabSize": 2,
"editor.lineHeight": 1.8,
"editor.cursorBlinking": "phase",
"editor.unicodeHighlight.nonBasicASCII": false,
"editor.wordWrap": "on",
"editor.wrappingStrategy": "advanced",
"editor.wordBasedSuggestions": "off",
// "editor.quickSuggestions": {
// "other": "on",
// "comments": "off",
// "strings": "off"
// },
// "editor.acceptSuggestionOnEnter": "off",
// LaTeX Workshop settings
"latex-workshop.intellisense.package.enabled": true,
"latex-workshop.intellisense.unimathsymbols.enabled": true,
"latex-workshop.intellisense.citation.backend": "biblatex",
"latex-workshop.latex.outDir": "build",
"latex-workshop.latex.autoBuild.run": "onFileChange",
"latex-workshop.latex.autoBuild.interval": 3000,
"latex-workshop.synctex.afterBuild.enabled": true,
"latex-workshop.view.autoFocus.enabled": false,
"latex-workshop.view.pdf.reload.transition": "fade",
"latex-workshop.view.pdf.viewer": "tab",
"latex-workshop.view.pdf.zoom": "auto",
"latex-workshop.latex.tools": [
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-pdflatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + pdflatex + biber"
},
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-xelatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + xelatex + biber"
},
{
"args": [
"-shell-escape",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"-out2dir=.",
"-lualatex",
"-e",
"$bibtex='biber %O %S';",
"%DOC%"
],
"command": "latexmk",
"name": "latexmk + lualatex + biber"
}
],
"latex-workshop.latex.recipes": [
{
"name": "latexmk + lualatex + biber",
"tools": [
"latexmk + lualatex + biber"
]
},
{
"name": "latexmk + xelatex + biber",
"tools": [
"latexmk + xelatex + biber"
]
},
{
"name": "latexmk + pdflatex + biber",
"tools": [
"latexmk + pdflatex + biber"
]
}
],
"latex-workshop.latex.recipe.default": "lastUsed"
}

110
build/slides.bbl-SAVE-ERROR Normal file
View File

@@ -0,0 +1,110 @@
% $ biblatex auxiliary file $
% $ biblatex bbl format version 3.3 $
% Do not modify the above lines!
%
% This is an auxiliary file used by the 'biblatex' package.
% This file may safely be deleted. It will be recreated by
% biber as required.
%
\begingroup
\makeatletter
\@ifundefined{ver@biblatex.sty}
{\@latex@error
{Missing 'biblatex' package}
{The bibliography requires the 'biblatex' package.}
\aftergroup\endinput}
{}
\endgroup
\refsection{0}
\datalist[entry]{nty/global//global/global/global}
\entry{greggFlameGraph2016}{article}{}{}
\name{author}{1}{}{%
{{hash=b45aef384111d7e9dd71b74ba427b5f1}{%
family={Gregg},
familyi={G\bibinitperiod},
given={Brendan},
giveni={B\bibinitperiod}}}%
}
\strng{namehash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{fullhash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{fullhashraw}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{bibnamehash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{authorbibnamehash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{authornamehash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{authorfullhash}{b45aef384111d7e9dd71b74ba427b5f1}
\strng{authorfullhashraw}{b45aef384111d7e9dd71b74ba427b5f1}
\field{sortinit}{G}
\field{sortinithash}{32d67eca0634bf53703493fb1090a2e8}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{abstract}{This visualization of software execution is a new necessity for performance profiling and debugging.}
\field{issn}{0001-0782, 1557-7317}
\field{journaltitle}{Communications of the ACM}
\field{langid}{english}
\field{month}{5}
\field{number}{6}
\field{title}{The Flame Graph}
\field{urlday}{16}
\field{urlmonth}{1}
\field{urlyear}{2026}
\field{volume}{59}
\field{year}{2016}
\field{urldateera}{ce}
\field{pages}{48\bibrangedash 57}
\range{pages}{10}
\verb{doi}
\verb 10.1145/2909476
\endverb
\endentry
\entry{HandbookTypeScriptHandbook}{book}{}{}
\name{author}{1}{}{%
{{hash=140864078aeca1c7c35b4beb33c53c34}{%
family={Microsoft},
familyi={M\bibinitperiod}}}%
}
\strng{namehash}{140864078aeca1c7c35b4beb33c53c34}
\strng{fullhash}{140864078aeca1c7c35b4beb33c53c34}
\strng{fullhashraw}{140864078aeca1c7c35b4beb33c53c34}
\strng{bibnamehash}{140864078aeca1c7c35b4beb33c53c34}
\strng{authorbibnamehash}{140864078aeca1c7c35b4beb33c53c34}
\strng{authornamehash}{140864078aeca1c7c35b4beb33c53c34}
\strng{authorfullhash}{140864078aeca1c7c35b4beb33c53c34}
\strng{authorfullhashraw}{140864078aeca1c7c35b4beb33c53c34}
\field{sortinit}{M}
\field{sortinithash}{4625c616857f13d17ce56f7d4f97d451}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{https://www.typescriptlang.org/docs/handbook/intro.html}
\field{title}{The {{TypeScript Handbook}}}
\field{year}{2026}
\endentry
\entry{poggialiConciseTypeScriptBook2026}{book}{}{}
\name{author}{1}{}{%
{{hash=6455011b3c9d32fd16da63c7b54ef9e8}{%
family={Poggiali},
familyi={P\bibinitperiod},
given={Simone},
giveni={S\bibinitperiod}}}%
}
\strng{namehash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{fullhash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{fullhashraw}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{bibnamehash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{authorbibnamehash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{authornamehash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{authorfullhash}{6455011b3c9d32fd16da63c7b54ef9e8}
\strng{authorfullhashraw}{6455011b3c9d32fd16da63c7b54ef9e8}
\field{sortinit}{P}
\field{sortinithash}{ff3bcf24f47321b42cb156c2cc8a8422}
\field{labelnamesource}{author}
\field{labeltitlesource}{title}
\field{howpublished}{https://gibbok.github.io/typescript-book/book/the-concise-typescript-book/}
\field{title}{The {{Concise TypeScript Book}}}
\field{year}{2026}
\endentry
\enddatalist
\endrefsection
\endinput

2377
build/slides.bcf-SAVE-ERROR Normal file

File diff suppressed because it is too large Load Diff

BIN
build/slides.pdf Normal file

Binary file not shown.

BIN
img/async-joke.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
img/brace.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
img/deno.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
img/flamegraph.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

BIN
img/http-message.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

BIN
img/javascript-alert.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
img/js-event-loop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

BIN
img/js.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
img/jsr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
img/logos.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
img/netscape.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
img/nodejs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
img/npm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
img/oak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
img/osi-model.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
img/point.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
img/promises.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
img/scaling-monolith.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
img/scaling-uservices.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
img/series-of-tubes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
img/sqlite.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
img/tbl.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

BIN
img/ts.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,45 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5" pages="2">
<diagram name="Page-1" id="WE2OBRBfjwrgRAvIH2Xi">
<mxGraphModel dx="1106" dy="963" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="njQ_imjs8zr5ET9f7Rwc-4" value="réponse HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-1" target="njQ_imjs8zr5ET9f7Rwc-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-5" value="WebSocket" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-1" target="njQ_imjs8zr5ET9f7Rwc-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-1" value="Serveur web (Deno)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="130" y="410" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-3" value="requête HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-2" target="njQ_imjs8zr5ET9f7Rwc-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-2" value="Client web (navigateur)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="520" y="410" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-1" value="Application client&lt;div&gt;HTML, CSS, TypeScript&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="630" y="290" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-2" value="Application serveur&lt;div&gt;Deno, Oak&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="70" y="280" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-3" value="Base de données" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="240" y="270" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-4" value="Cache" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="384" y="270" width="60" height="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="wkPXxGK0bhSZwc4x9mIX" name="Page-2">
<mxGraphModel grid="1" page="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,82 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5">
<diagram name="Page-1" id="o2Z0k-pMrQSQu8LE0CHS">
<mxGraphModel dx="2066" dy="1235" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-2" value="" style="html=1;shadow=0;dashed=0;align=center;verticalAlign=middle;shape=mxgraph.arrows2.uTurnArrow;dy=11;arrowHead=43;dx2=25;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="380" y="360" width="310" height="300" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-10" value="Register callback" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=144.75;exitDy=300;exitPerimeter=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-3" target="I0g5zxyyZJP6Qi3c9r4H-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-3" value="" style="html=1;shadow=0;dashed=0;align=center;verticalAlign=middle;shape=mxgraph.arrows2.uTurnArrow;dy=11;arrowHead=43;dx2=25;flipV=1;flipH=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="570" y="370" width="310" height="300" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-4" value="Event Loop" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;fontSize=48;" vertex="1" parent="1">
<mxGeometry x="480" y="450" width="300" height="70" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-5" value="&lt;span style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 24px;&quot;&gt;(1 thread)&lt;/font&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="530" y="540" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-35">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-6" value="I/O&lt;div&gt;Operations&lt;/div&gt;" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fontFamily=Lucida Console;verticalAlign=top;fontSize=24;" vertex="1" parent="1">
<mxGeometry x="960" y="382.5" width="210" height="275" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-7" value="FS" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="990" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-8" value="DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1080" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-9" value="NET" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1035" y="560" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-11" value="Operation complete" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=227.375;entryDy=300;entryPerimeter=0;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-12" value="Internal Thread Pool" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;verticalAlign=bottom;labelPosition=center;verticalLabelPosition=top;align=center;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1210" y="410" width="120" height="178.75" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-13" value="Call Stack" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fontFamily=Lucida Console;verticalAlign=bottom;labelPosition=center;verticalLabelPosition=top;align=center;" vertex="1" parent="1">
<mxGeometry x="200" y="382.5" width="120" height="277.5" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-19" value="Thread 1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1222.5" y="428.75" width="95" height="40" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-22" value="Thread n" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1223.5" y="528.75" width="95" height="40" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-23" value="..." style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1241" y="490" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-28" value="fn1&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;(...)&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="401.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-29" value="fn2(...)" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="461.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-30" value="callback(...)" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="581.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-31" value="..." style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="230" y="541.25" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.081;entryY=0.24;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-28" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.113;entryY=0.84;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-30" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-35" value="OS async syscalls" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;verticalAlign=middle;labelPosition=center;verticalLabelPosition=middle;align=center;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1210" y="610" width="120" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

45
res/architecture.drawio Normal file
View File

@@ -0,0 +1,45 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5" pages="2">
<diagram name="Architecture (locale)" id="WE2OBRBfjwrgRAvIH2Xi">
<mxGraphModel dx="1106" dy="963" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="njQ_imjs8zr5ET9f7Rwc-4" value="réponse HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-1" target="njQ_imjs8zr5ET9f7Rwc-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-5" value="WebSocket" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-1" target="njQ_imjs8zr5ET9f7Rwc-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-1" value="Serveur web (Deno)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="130" y="410" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-3" value="requête HTTP" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="njQ_imjs8zr5ET9f7Rwc-2" target="njQ_imjs8zr5ET9f7Rwc-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="njQ_imjs8zr5ET9f7Rwc-2" value="Client web (navigateur)" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;" vertex="1" parent="1">
<mxGeometry x="520" y="410" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-1" value="Application client&lt;div&gt;HTML, CSS, TypeScript&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="630" y="290" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-2" value="Application serveur&lt;div&gt;Deno, Oak&lt;/div&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="70" y="280" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-3" value="Base de données" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="240" y="270" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="1ptE3tQJX40rlnvv1j5o-4" value="Cache" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="384" y="270" width="60" height="80" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="wkPXxGK0bhSZwc4x9mIX" name="Architecture (reverse proxy)">
<mxGraphModel dx="1106" dy="963" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
</root>
</mxGraphModel>
</diagram>
</mxfile>

82
res/js-event-loop.drawio Normal file
View File

@@ -0,0 +1,82 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5">
<diagram name="Page-1" id="o2Z0k-pMrQSQu8LE0CHS">
<mxGraphModel dx="2066" dy="1235" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-2" value="" style="html=1;shadow=0;dashed=0;align=center;verticalAlign=middle;shape=mxgraph.arrows2.uTurnArrow;dy=11;arrowHead=43;dx2=25;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="380" y="360" width="310" height="300" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-10" value="Register callback" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0;exitDx=144.75;exitDy=300;exitPerimeter=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-3" target="I0g5zxyyZJP6Qi3c9r4H-6">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-3" value="" style="html=1;shadow=0;dashed=0;align=center;verticalAlign=middle;shape=mxgraph.arrows2.uTurnArrow;dy=11;arrowHead=43;dx2=25;flipV=1;flipH=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="570" y="370" width="310" height="300" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-4" value="Event Loop" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;fontSize=48;" vertex="1" parent="1">
<mxGeometry x="480" y="450" width="300" height="70" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-5" value="&lt;span style=&quot;&quot;&gt;&lt;font style=&quot;font-size: 24px;&quot;&gt;(1 thread)&lt;/font&gt;&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="530" y="540" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=classic;startFill=1;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-35">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-6" value="I/O&lt;div&gt;Operations&lt;/div&gt;" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fontFamily=Lucida Console;verticalAlign=top;fontSize=24;" vertex="1" parent="1">
<mxGeometry x="960" y="382.5" width="210" height="275" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-7" value="FS" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="990" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-8" value="DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1080" y="470" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-9" value="NET" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1035" y="560" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-11" value="Operation complete" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=227.375;entryDy=300;entryPerimeter=0;fontFamily=Lucida Console;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-6" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-12" value="Internal Thread Pool" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;verticalAlign=bottom;labelPosition=center;verticalLabelPosition=top;align=center;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1210" y="410" width="120" height="178.75" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-13" value="Call Stack" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fontFamily=Lucida Console;verticalAlign=bottom;labelPosition=center;verticalLabelPosition=top;align=center;" vertex="1" parent="1">
<mxGeometry x="200" y="382.5" width="120" height="277.5" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-19" value="Thread 1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1222.5" y="428.75" width="95" height="40" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-22" value="Thread n" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1223.5" y="528.75" width="95" height="40" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-23" value="..." style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1241" y="490" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-28" value="fn1&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;(...)&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="401.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-29" value="fn2(...)" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="461.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-30" value="callback(...)" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="212.5" y="581.25" width="95" height="60" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-31" value="..." style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="230" y="541.25" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.081;entryY=0.24;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-28" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.113;entryY=0.84;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="I0g5zxyyZJP6Qi3c9r4H-30" target="I0g5zxyyZJP6Qi3c9r4H-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="I0g5zxyyZJP6Qi3c9r4H-35" value="OS async syscalls" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;verticalAlign=middle;labelPosition=center;verticalLabelPosition=middle;align=center;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1210" y="610" width="120" height="50" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

155
res/scaling.drawio Normal file
View File

@@ -0,0 +1,155 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.5 Chrome/138.0.7204.251 Electron/37.6.1 Safari/537.36" version="28.2.5" pages="2">
<diagram name="Page-1" id="xunzUwHFhwkz4ZFfysU3">
<mxGraphModel dx="1307" dy="1078" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="1ADzjnrqRUSSSZhDYKZD-6" value="Server 2" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="931" y="740" width="180" height="300" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-7" value="Server 1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="712.5" y="740" width="180" height="160" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-8" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="733.5" y="760" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-9" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="742.5" y="820" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-10" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="803.5" y="760" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-11" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="952" y="820" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-12" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="1021" y="760" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-13" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="951" y="760" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-17" value="&lt;font face=&quot;Lucida Console&quot;&gt;Horizontal Scaling&lt;br&gt;&lt;/font&gt;" style="endArrow=classic;html=1;rounded=0;dashed=1;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="678.5" y="1085" as="sourcePoint" />
<mxPoint x="1360" y="1085" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-18" value="Server count" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1303.5" y="1105" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-19" value="Server 3" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="1149.5" y="740" width="180" height="160" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-20" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="1179.5" y="760" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-21" value="&lt;font face=&quot;Lucida Console&quot;&gt;Vertical Scaling&lt;br&gt;&lt;/font&gt;" style="endArrow=classic;startArrow=none;html=1;rounded=0;startFill=0;dashed=1;horizontal=0;" edge="1" parent="1">
<mxGeometry x="-0.0556" width="50" height="50" relative="1" as="geometry">
<mxPoint x="678.5" y="1085" as="sourcePoint" />
<mxPoint x="678.5" y="725" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-22" value="Compute power" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="600" y="720" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-23" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="961" y="880" width="120" height="140" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-24" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="1021" y="820" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-25" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="1169.5" y="820" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="1ADzjnrqRUSSSZhDYKZD-26" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="1239.5" y="820" width="70" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="XuR8pBeYArQNiwP7_7Y3" name="Page-2">
<mxGraphModel dx="1307" dy="1078" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="uBfJnC3izJ6YzHo_WmXs-1" value="Server 2" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="781" y="590" width="180" height="300" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-2" value="Server 3" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="995" y="590" width="180" height="160" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-3" value="Server 1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Lucida Console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" vertex="1" parent="1">
<mxGeometry x="565" y="590" width="180" height="160" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-4" value="" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="575" y="600" width="160" height="140" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-5" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="586" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-6" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="656" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-7" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="595" y="670" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-8" value="" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="791" y="600" width="160" height="140" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-9" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="802" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-10" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="872" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-11" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="811" y="670" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-16" value="" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="1005" y="600" width="160" height="140" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-17" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="1016" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-18" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="1086" y="610" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-19" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="1025" y="670" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-22" value="" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
<mxGeometry x="791" y="740" width="160" height="140" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-23" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="802" y="750" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-24" value="Frontend" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="872" y="750" width="70" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-25" value="Authentication" style="rounded=1;whiteSpace=wrap;html=1;fontFamily=Lucida Console;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="811" y="810" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-26" value="&lt;font face=&quot;Lucida Console&quot;&gt;Vertical Scaling&lt;br&gt;&lt;/font&gt;" style="endArrow=classic;startArrow=none;html=1;rounded=0;startFill=0;dashed=1;horizontal=0;" edge="1" parent="1">
<mxGeometry x="-0.0556" width="50" height="50" relative="1" as="geometry">
<mxPoint x="528.5" y="935" as="sourcePoint" />
<mxPoint x="528.5" y="575" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-27" value="&lt;font face=&quot;Lucida Console&quot;&gt;Horizontal Scaling&lt;br&gt;&lt;/font&gt;" style="endArrow=classic;html=1;rounded=0;dashed=1;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="528.5" y="935" as="sourcePoint" />
<mxPoint x="1210" y="935" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-28" value="Compute power" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="450" y="570" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="uBfJnC3izJ6YzHo_WmXs-29" value="Server count" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Lucida Console;" vertex="1" parent="1">
<mxGeometry x="1153.5" y="955" width="60" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

29
slides.bib Normal file
View File

@@ -0,0 +1,29 @@
@book{poggialiConciseTypeScriptBook2026,
title = {The {{Concise TypeScript Book}}},
author = {Poggiali, Simone},
year = 2026,
howpublished = {https://gibbok.github.io/typescript-book/book/the-concise-typescript-book/},
}
@book{HandbookTypeScriptHandbook,
title = {The {{TypeScript Handbook}}},
author = {Microsoft},
year = 2026,
howpublished = {https://www.typescriptlang.org/docs/handbook/intro.html},
}
@article{greggFlameGraph2016,
title = {The Flame Graph},
author = {Gregg, Brendan},
year = 2016,
month = may,
journal = {Communications of the ACM},
volume = {59},
number = {6},
pages = {48--57},
issn = {0001-0782, 1557-7317},
doi = {10.1145/2909476},
urldate = {2026-01-16},
abstract = {This visualization of software execution is a new necessity for performance profiling and debugging.},
langid = {english},
}

215
slides.cls Normal file
View File

@@ -0,0 +1,215 @@
\ProvidesClass{slides}[27/01/2025 v1]
\PassOptionsToPackage{dvipsnames}{xcolor}
\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{naturalnames}{hyperref}
\LoadClass[aspectratio=169,10pt]{beamer}
% speaker notes
% open pdf in dual screen using pympress (https://github.com/Cimbali/pympress)
% \setbeameroption{show notes on second screen=right}
% listings (should be loaded before csquotes)
\RequirePackage{minted}
% language and encoding
\RequirePackage[french]{babel}
\RequirePackage[T1]{fontenc}
\RequirePackage{csquotes}
% biblatex for references on slides
\RequirePackage[backend=biber]{biblatex}
% clean, short citations in footnotes (cf. https://tex.stackexchange.com/a/587604)
\renewbibmacro{in:}{}
% \AtEveryCitekey{\clearfield{journaltitle}}
\AtEveryCitekey{\clearfield{volume}}
\AtEveryCitekey{\clearfield{number}}
% \AtEveryCitekey{\clearfield{booktitle}}
% \AtEveryCitekey{\clearfield{series}}
\AtEveryCitekey{\clearfield{pages}}
\AtEveryCitekey{\clearfield{month}}
\AtEveryCitekey{\clearlist{publisher}}
\AtEveryCitekey{\clearname{editor}}
\AtEveryCitekey{\clearlist{location}}
\AtEveryCitekey{\clearfield{doi}}
\AtEveryCitekey{\clearfield{isbn}}
\AtEveryCitekey{\clearfield{issn}}
\AtEveryCitekey{\clearfield{eprint}}
\AtEveryCitekey{\clearfield{url}}
\AtEveryCitekey{\clearfield{urlyear}}
\AtEveryCitekey{\clearfield{urlmonth}}
\AtEveryCitekey{\clearfield{urlday}}
% include reference number in citations (cf. https://tex.stackexchange.com/a/176295)
\DeclareCiteCommand{\fullcite}
{\usebibmacro{prenote}}
{{\printtext[labelnumberwidth]{%
\printfield{prefixnumber}%
\printfield{labelnumber}}} %
\usedriver
{\DeclareNameAlias{sortname}{default}}
{\thefield{entrytype}}}
{\multicitedelim}
{\usebibmacro{postnote}}
% blank footnotes using \footnote[]{}
\let\svthefootnote\thefootnote
\textheight 1in
\newcommand\blankfootnote[1]{%
\let\thefootnote\relax\footnotetext{#1}%
\let\thefootnote\svthefootnote%
}
\let\svfootnote\footnote
\renewcommand\footnote[2][?]{%
\if\relax#1\relax%
\blankfootnote{#2}%
\else%
\if?#1\svfootnote{#2}\else\svfootnote[#1]{#2}\fi%
\fi
}
% captions
\RequirePackage{caption}
\captionsetup{font=scriptsize,labelfont=scriptsize}
% beamer theme
\usetheme{moloch}
\RequirePackage{appendixnumberbeamer}
\RequirePackage{fontspec}
\setsansfont[
ItalicFont={Fira Sans Light Italic},
BoldFont={Fira Sans},
BoldItalicFont={Fira Sans Italic}
]{Fira Sans Light}
\setmonofont[BoldFont={Fira Mono Medium}]{Fira Mono}
% \setmonofont{Fantasque Sans Mono}
\AtBeginEnvironment{tabular}{%
\addfontfeature{Numbers={Monospaced}}
}
% https://steeven9.github.io/USI-LaTeX/html/packages_hyperref_babel_xcolor3.html
% Section 3.2 of:
% https://mirror.ibcp.fr/pub/CTAN/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdf
\definecolor{ubo}{HTML}{8c3759}
\setbeamercolor{progress bar}{fg=ubo}
\setbeamercolor{title separator}{fg=ubo}
\setbeamercolor{frametitle}{bg=ubo}
% \setbeamercolor{progress bar}{fg=BrickRed}
% \setbeamercolor{title separator}{fg=BrickRed}
% footnote font size
\setbeamerfont{footnote}{size=\tiny}
% frame numbering font size
\setbeamerfont{footline}{size=\footnotesize}
% solid background for blocks
\molochset{block=fill}
% remove section frames
% \molochset{sectionpage=none}
% enable subsection frames
\molochset{subsectionpage=progressbar}
% table of contents
\setbeamertemplate{section in toc}[sections numbered]
% smaller first-level bullet points
\setbeamertemplate{itemize item}{\textbullet}
% smaller bibliography entries
\renewcommand*{\bibfont}{\scriptsize}
% figures uncover animation (cf. https://tex.stackexchange.com/a/354033/95423)
\setbeamercovered{transparent}
\newcommand<>{\uncovergraphics}[2][{}]{
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (B) at (4,0)
{\includegraphics[#1]{#2}};
\alt#3{}{%
\fill [draw=none, fill=palette primary.fg, fill opacity=0.9] (B.north west) -- (B.north east) -- (B.south east) -- (B.south west) -- (B.north west) -- cycle;
}
\end{tikzpicture}
}
% fonts and symbols
\RequirePackage{pifont}
\newcommand{\cmark}{\color{YellowGreen}\ding{51}}
\newcommand{\xmark}{\color{BrickRed}\ding{55}}
\RequirePackage{textcomp}
\RequirePackage{emoji}
% markers
\RequirePackage{circledsteps}
\pgfkeys{/csteps/inner color=white}
\pgfkeys{/csteps/fill color=black}
\newcommand{\DONE}{%
\CircledParamOpts{inner color=black, outer color=LimeGreen, fill color=LimeGreen}{1}{\textbf{DONE}} %
}
\newcommand{\TODO}{%
\CircledParamOpts{inner color=black, outer color=Goldenrod, fill color=Goldenrod}{1}{\textbf{TODO}} %
}
\newcommand{\FIXME}{%
\CircledParamOpts{inner color=white, outer color=Red, fill color=Red}{1}{\textbf{FIXME}} %
}
% custom font size for a slide (cf. https://tex.stackexchange.com/a/401409)
\RequirePackage{environ}
\newcommand{\customframefont}[1]{
\setbeamertemplate{itemize/enumerate body begin}{#1}
\setbeamertemplate{itemize/enumerate subbody begin}{#1}
}
\NewEnviron{framefont}[1]{
\customframefont{#1} % for itemize/enumerate
{#1 % For the text outside itemize/enumerate
\BODY
}
\customframefont{\normalsize}
}
% math
\RequirePackage{amsmath,amssymb,amsfonts}
% resizebox
\RequirePackage{graphicx}
\RequirePackage{subcaption}
% tables
\RequirePackage{tabularx}
\RequirePackage{booktabs}
% various tabular columns with text wrapping
\newcolumntype{L}{>{\arraybackslash}m{\linewidth}}
\newcolumntype{M}{>{\centering\arraybackslash}m{0.33\linewidth}}
\newcolumntype{Y}{>{\centering\arraybackslash}m{0.15\linewidth}}
\newcolumntype{y}{>{\arraybackslash}m{0.15\linewidth}}
% generic horizontally centered column with line breaks
\newcolumntype{Z}{>{\centering\arraybackslash}X}
% vertical centering of text in all tabularx columns
\renewcommand\tabularxcolumn[1]{m{#1}}
% links
\RequirePackage{hyperref}
% redefine title page
% https://tex.stackexchange.com/a/396409
% Section 6.2.3 of:
% https://ctan.math.illinois.edu/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdf
\makeatletter
\setbeamertemplate{title page}{
\begin{minipage}[b][\paperheight]{\textwidth}
% \vfill%
\ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
\ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
\vspace{.2cm}
\ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
\usebeamertemplate*{title separator}
\vspace{-.2cm}
\begin{columns}[]
\column{0.4\linewidth}
\ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
\column{0.4\linewidth}
% \begin{table}[]
% \begin{flushleft}
% \small
% \begin{tabular}{ll}
% Rapporteur & Blabla \\
% Rapporteur & Blabla
% \end{tabular}
% \end{flushleft}
% \end{table}
\end{columns}
\begin{columns}[b]
\column{0.4\linewidth}
\ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
\column{0.5\linewidth}
\vspace{-2cm}
\ifx\inserttitlegraphic\@empty\else\inserttitlegraphic\fi
\end{columns}
\vspace*{.2cm}
\end{minipage}
}
\makeatother

BIN
slides.pdf Normal file

Binary file not shown.

1306
slides.tex Normal file

File diff suppressed because it is too large Load Diff