diff --git a/docs/presentations/autre/capitoledulibre/main.tex b/docs/presentations/autre/capitoledulibre/main.tex new file mode 100644 index 0000000..93fb356 --- /dev/null +++ b/docs/presentations/autre/capitoledulibre/main.tex @@ -0,0 +1,647 @@ +\documentclass[aspectratio=43]{beamer} + +\usetheme{Berlin} +%\usefonttheme{professionalfonts} + +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage{mathtools,amssymb} +\usepackage{microtype} +\usepackage{pgfgantt} +\usepackage{adjustbox} +\usetikzlibrary{positioning} +% \usepackage{qrcode} + +\title[]{Systèmes centralisés, fédérés et pair à pair : vu par la théorie des graphs} +\author{Amaury JOLY} +\institute[AMU - Skeptikon - Parsec]{Aix-Marseille université, Skeptikon, Parsec.cloud} + +\begin{document} + +\begin{frame}{} + \titlepage +\end{frame} + +\note{test} +\begin{frame}{Qui suis-je} + \begin{itemize} + \item \textbf{Doctorant} en informatique distribué + \begin{itemize} + \item \textit{Étude de la cohérence des données dans les systèmes distribués} + \end{itemize} + \item Ingénieur R\&D chez \textbf{Parsec.cloud} + \item Membre de l'association \textbf{Skeptikon} + \end{itemize} +\end{frame} + +\section{Introduction a l'algorithmie distribué} + +\begin{frame}{Un système distribué c'est quoi} + \begin{quote} + On définit un système comme un ensemble de processus. On considère qu'un système est dit distribué lorsque plusieurs processus distincts travail à la réalisation d'une tâche commune. + \end{quote} + + \vspace{1em} + Par exemple la rédaction de documents collaboratifs (ex: cryptpad, grist, colabora), le chat (ex: matrix, signal, XMPP, IRC, IMAP), le partage d'annuaire de vidéo (ex: PeerTube), la résolution des noms de domaines (DNS). +\end{frame} + +\begin{frame}{Définir un système distribué: le modèle de communication} + La recherche traite globalement deux modèles de communication + \begin{itemize} + \item Shared-Register + + \pause + + \resizebox{0.5\linewidth}{!}{% + \begin{tikzpicture}[ + node distance=1.8cm and 2.4cm, + process/.style={draw, circle, thick, minimum size=1cm, font=\small}, + mem/.style={draw, thick, rounded corners, minimum width=5cm, minimum height=1.8cm, fill=gray!10}, + reg/.style={draw, thin, minimum width=1.1cm, minimum height=0.7cm, font=\scriptsize}, + arrow/.style={-Latex, thick} + ] + + % --- Mémoire partagée (abstraction) --- + \node[mem] (mem) {}; + + % Quelques registres logiques dans la mémoire + \node[reg] (r1) at ($(mem.west)!0.2!(mem.east)$) {$R_1$}; + \node[reg] (r2) at ($(mem.west)!0.5!(mem.east)$) {$R_\dots$}; + \node[reg] (r3) at ($(mem.west)!0.8!(mem.east)$) {$R_n$}; + + \node[font=\scriptsize, below=0.15cm of mem]{Tous les processus voient la même mémoire logique}; + + % --- Processus concurrents --- + \node[process] (p1) [left=of p2] {$P_1$}; + \node[process] (p2) [above=1.8cm of mem] {$P_\dots$}; + \node[process] (p3) [right=of p2] {$P_n$}; + + % --- Accès mémoire : opérations read/write --- + \draw[arrow] (p1.south) -- (r1.north); + \draw[arrow] (p1.south) -- (r2.north); + \draw[arrow] (p1.south) -- (r3.north); + \draw[arrow] (p2.south) -- (r2.north); + \draw[arrow] (p2.south) -- (r1.north); + \draw[arrow] (p2.south) -- (r3.north); + \draw[arrow] (p3.south) -- (r1.north); + \draw[arrow] (p3.south) -- (r2.north); + \draw[arrow] (p3.south) -- (r3.north); + + \end{tikzpicture} + } + \end{itemize} +\end{frame} + +\begin{frame}{Définir un système distribué: le modèle de communication} + \begin{itemize} + \item Shared-Register + \item \textbf{Message-passing} + + \centering + \resizebox{0.2\linewidth}{!}{% + \begin{tikzpicture}[ + node distance=2.2cm and 1.4cm, + process/.style={draw, circle, thick, minimum size=1cm, font=\small}, + state/.style={draw, thin, rounded corners, minimum width=1.6cm, + minimum height=0.7cm, font=\scriptsize, fill=gray!10}, + msg/.style={-Latex, thick}, + netbox/.style={draw, dashed, rounded corners, thick, inner sep=0.4cm} + ] + + % --- Processus avec état local --- + \node[process] (p1) {$P_1$}; + \node[process] (p2) [above=of p1] {$P_2$}; + \node[process] (p3) [right=of p1] {$P_3$}; + + \node[state] (s1) [below=0.7cm of p1] {état local $S_1$}; + \node[state] (s2) [above=0.7cm of p2] {état local $S_2$}; + \node[state] (s3) [below=0.7cm of p3] {état local $S_3$}; + + % --- Messages entre processus --- + \draw[msg] (p1) to[bend left=15] node[above, font=\scriptsize]{message $m_1$} (p2); + \draw[msg] (p2) to[bend left=15] node[above, font=\scriptsize]{message $m_2$} (p3); + \draw[msg] (p3) to[bend left=15] node[above, font=\scriptsize]{message $m_3$} (p1); + + \end{tikzpicture} + }% + + \end{itemize} +\end{frame} + +\begin{frame}{Définir un système distribué: le modèle de synchronisme} + La recherche distingue deux grandes hypothèses de synchronisme : + \begin{itemize} + \item \textbf{Synchrone} (temps découpé en tours / rounds) + + \pause + + \centering + \resizebox{0.7\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + msg/.style={-Latex, thick}, + proc/.style={font=\small}, + roundline/.style={thick}, + sep/.style={dashed, gray} + ] + + % --- Processus --- + \node[proc, anchor=east] at (0,0) {$P_1$}; + \node[proc, anchor=east] at (0,-1) {$P_2$}; + \node[proc, anchor=east] at (0,-2) {$P_3$}; + + % --- Lignes de temps pour chaque processus --- + \foreach \y in {0,-1,-2}{ + \draw[roundline] (0.2,\y) -- (3.0,\y); + } + + % --- Séparation en tours synchrones --- + \foreach \x/\t in {0.8/1,1.6/2,2.4/3}{ + \draw[sep] (\x,0.3) -- (\x,-2.3); + \node[font=\scriptsize] at (\x+0.35,0.35) {tour \t}; + } + + % --- Messages livrés dans le tour suivant --- + \draw[msg] (0.35,0) .. controls (0.55,-0.2) .. (0.75,-1); % P1 -> P2 dans le tour 1 + \draw[msg] (1.0,-1) .. controls (1.2,-1.8) .. (1.4,-2); % P2 -> P3 dans le tour 2 + \draw[msg] (1.7,-2) .. controls (1.9,-1.2) .. (2.1,0); % P3 -> P1 dans le tour 3 + + % --- Légende --- + \node[font=\scriptsize, align=center] at (1.6,-2.6){Bornes connues sur les durées de calcul et de communication,\\ + tous les processus avancent par tours synchrones}; + + \end{tikzpicture} + } + \end{itemize} +\end{frame} + +\begin{frame}{Définir un système distribué: les modèles de synchronisme} + \begin{itemize} + \item Synchrone + \item \textbf{Asynchrone} + \end{itemize} + + \pause + + \centering + \resizebox{0.7\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + msg/.style={-Latex, thick}, + proc/.style={font=\small}, + opbox/.style={draw, rounded corners, thick} + ] + + % --- Processus --- + \node[proc, anchor=east] at (0,0) {$P_1$}; + \node[proc, anchor=east] at (0,-1) {$P_2$}; + \node[proc, anchor=east] at (0,-2) {$P_3$}; + + \pause + + % --- Lignes de temps pour chaque processus --- + \foreach \y in {0,-1,-2}{ + \draw[thick] (0.2,\y) -- (3.0,\y); + } + + \pause + + % --- "Ticks" locaux non alignés (horloges indépendantes) --- + \foreach \x in {0.5,1.2,2.3}{ + \draw (\x,0.1) -- (\x,-0.1); % P1 + } + \foreach \x in {0.4,1.5,2.6}{ + \draw (\x,-0.9) -- (\x,-1.1); % P2 + } + \foreach \x in {0.7,1.8,2.1}{ + \draw (\x,-1.9) -- (\x,-2.1); % P3 + } + + \pause + + % --- Messages --- + \draw[msg] (0.35,0) -- (0.8,-1); + \draw[msg] (0.35,0) -- (2.5,-2); + + \pause + + \draw[msg] (1.0,-1) -- (1.8,0); + \draw[msg] (1.0,-1) -- (2.2,-2); + + \pause + + \draw[msg] (1.4,-2) -- (2.1,0); + \draw[msg] (1.4,-2) -- (2.5,-1); + + \pause + % op_1 : diffusion de P1 + % commence à x = 0.35 (émission) et finit à x = 2.5 (dernier reçu : P3) + \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); + % ligne de vie de P1 en pointillé dans l'intervalle de op_1 + \draw[thick,densely dotted] (0.35,0) -- (2.5,0); + \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; + + \pause + % op_2 : diffusion de P2 + % commence à x = 1.0 (émission) et finit à x = 2.2 (dernier reçu : P3) + \draw[opbox,densely dotted] (1.0,-0.75) rectangle (2.2,-1.25); + % ligne de vie de P2 en pointillé dans l'intervalle de op_2 + \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); + \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; + + \pause + % op_3 : diffusion de P3 + % commence à x = 1.4 (émission) et finit à x = 2.5 (dernier reçu : P2) + \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); + % ligne de vie de P3 en pointillé dans l'intervalle de op_3 + \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); + \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; + + \end{tikzpicture} + } +\end{frame} + +\begin{frame}{Définir un système distribué: les modèles de synchronisme} + \begin{itemize} + \item Synchrone + \item \textbf{Asynchrone} + \end{itemize} + + \centering + \resizebox{0.7\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + msg/.style={-Latex, thick}, + proc/.style={font=\small}, + opbox/.style={draw, rounded corners, thick} + ] + + % --- Processus --- + \node[proc, anchor=east] at (0,0) {$P_1$}; + \node[proc, anchor=east] at (0,-1) {$P_2$}; + \node[proc, anchor=east] at (0,-2) {$P_3$}; + + % --- Lignes de temps pour chaque processus --- + \foreach \y in {0,-1,-2}{ + \draw[thick] (0.2,\y) -- (3.0,\y); + } + + % op_1 : diffusion de P1 + % commence à x = 0.35 (émission) et finit à x = 2.5 (dernier reçu : P3) + \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); + % ligne de vie de P1 en pointillé dans l'intervalle de op_1 + \draw[thick,densely dotted] (0.35,0) -- (2.5,0); + \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; + + % op_2 : diffusion de P2 + % commence à x = 1.0 (émission) et finit à x = 2.2 (dernier reçu : P3) + \draw[opbox,densely dotted] (1.0,-0.75) rectangle (2.2,-1.25); + % ligne de vie de P2 en pointillé dans l'intervalle de op_2 + \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); + \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; + + % op_3 : diffusion de P3 + % commence à x = 1.4 (émission) et finit à x = 2.5 (dernier reçu : P2) + \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); + % ligne de vie de P3 en pointillé dans l'intervalle de op_3 + \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); + \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; + + \end{tikzpicture} + } +\end{frame} + +\section{Les différentes architectures de systèmes} + +\subsection{Les systèmes centralisés} + +\begin{frame}{Système centralisé} + \begin{itemize} + \item Architecture client--serveur + \item Un seul serveur central maintient l'état + \end{itemize} + + \vspace{0.3cm} + \centering + \resizebox{0.6\linewidth}{!}{% + \begin{tikzpicture}[ + node distance=1.8cm and 2.5cm, + client/.style={draw, circle, thick, minimum size=1cm, font=\small}, + server/.style={draw, thick, rounded corners, minimum width=2.8cm, + minimum height=1.2cm, font=\small, fill=gray!10}, + msg/.style={-Latex, thick}, + resp/.style={Latex-, thick, dashed} + ] + + % --- Serveur central --- + \node[server] (srv) at (0,0) {Serveur central}; + + % --- Clients --- + \node[client] (c1) at (-3,0) {$P_1$}; + \node[client] (c2) at (0,-2) {$P_2$}; + \node[client] (c3) at (3,-0) {$P_3$}; + + % --- Messages requête / réponse --- + \draw[msg] (c1.east) -- (srv.west); + \draw[msg] (c2.north) -- (srv.south); + \draw[msg] (c3.west) -- (srv.east); + + \end{tikzpicture} + } +\end{frame} + + +\begin{frame}{Système centralisé : exécution parallèle des clients} + \begin{itemize} + \item Requêtes concurrentes côté clients + \item Traitement séquentiel côté serveur (ordre total) + \end{itemize} + + \vspace{0.3cm} + \centering + \resizebox{0.6\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + msg/.style={-Latex, thick}, + proc/.style={font=\small}, + opbox/.style={draw, rounded corners, thick, fill=gray!10} + ] + + % --- Processus : serveur + clients (lignes de vie) --- + \node[proc, anchor=east] at (0,0) {$Serveur$}; + \node[proc, anchor=east] at (0,-1) {$P_1$}; + \node[proc, anchor=east] at (0,-2) {$P_2$}; + \node[proc, anchor=east] at (0,-3) {$P_3$}; + + \pause + + % --- Lignes de temps --- + \foreach \y in {0,-1,-2,-3}{ + \draw[thick] (0.2,\y) -- (4.0,\y); + } + + \pause + % --- Requêtes des clients vers le serveur (légèrement décalées) --- + \draw[msg] (0.8,-1) -- (1.2,0) + node[midway, left, font=\scriptsize] {$op_1$}; + \draw[msg] (0.9,-2) -- (1.3,0) + node[midway, left, font=\scriptsize] {$op_2$}; + \draw[msg] (1.0,-3) -- (1.4,0) + node[midway, left, font=\scriptsize] {$op_3$}; + + % (On suggère qu'elles sont émises "en parallèle" côté clients.) + + \pause + % --- Traitement séquentiel au serveur : op_1, op_2, op_3 --- + % op_1 + \node[opbox, minimum width=0.2cm, minimum height=0.5cm] (o1) at (1.8,0) {$op_1$}; + % op_2 + \node[opbox, minimum width=0.2cm, minimum height=0.5cm, right=0.2cm of o1] (o2) {$op_2$}; + % op_3 + \node[opbox, minimum width=0.2cm, minimum height=0.5cm, right=0.2cm of o2] (o3) {$op_3$}; + + % Relier dans l'ordre pour bien montrer la séquentialisation + \draw[->, thick] (o1.east) -- (o2.west); + \draw[->, thick] (o2.east) -- (o3.west); + + % --- Réponses (optionnelles, pour fermer la boucle) --- + \pause + \draw[msg] (o1.south) -- (2,-1); + \draw[msg] (o1.south) -- (2,-2); + \draw[msg] (o1.south) -- (2,-3); + \draw[msg] (o2.south) -- (2.8,-1); + \draw[msg] (o2.south) -- (2.8,-2); + \draw[msg] (o2.south) -- (2.8,-3); + \draw[msg] (o3.south) -- (3.8,-1); + \draw[msg] (o3.south) -- (3.8,-2); + \draw[msg] (o3.south) -- (3.8,-3); + + % --- Évolution de l'état (optionnel mais parlant) --- + \node[font=\scriptsize, align=left] at (2.7,0.9) + {$S_0 \xrightarrow{op_1} S_1 \xrightarrow{op_2} S_2 \xrightarrow{op_3} S_3$}; + \end{tikzpicture} + } +\end{frame} + +\subsection{Les systèmes pair à pair} + +\begin{frame}{Système pair à pair} + \begin{itemize} + \item Pas de serveur central + \item Chaque processus entretient son état local en fonction des messages recu. + \end{itemize} + + \vspace{0.3cm} + \centering + \resizebox{0.6\linewidth}{!}{% + \begin{tikzpicture}[ + node distance=1.8cm and 2.5cm, + peer/.style={draw, circle, thick, minimum size=1cm, font=\small}, + link/.style={<->, thick} + ] + + % --- Pairs --- + \node[peer] (p1) at (-2,0) {$P_1$}; + \node[peer] (p2) at ( 2,0) {$P_2$}; + \node[peer] (p3) at ( 0,-2) {$P_3$}; + + % --- Connexions pair à pair --- + \draw[link] (p1) -- (p2); + \draw[link] (p1) -- (p3); + \draw[link] (p2) -- (p3); + + \end{tikzpicture} + } +\end{frame} + +\begin{frame}{Système pair à pair : exécution parallèle} + \begin{itemize} + \item Chaque pair exécute des opérations concurrentes + \item Pas de serveur central pour imposer un ordre total + \end{itemize} + + \centering + \resizebox{0.7\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + proc/.style={font=\small}, + opbox/.style={draw, rounded corners, thick} + ] + + % --- Processus --- + \node[proc, anchor=east] at (0,0) {$P_1$}; + \node[proc, anchor=east] at (0,-1) {$P_2$}; + \node[proc, anchor=east] at (0,-2) {$P_3$}; + + % --- Lignes de temps pour chaque processus --- + \foreach \y in {0,-1,-2}{ + \draw[thick] (0.2,\y) -- (3.0,\y); + } + + % op_1 : opération de P1 + % commence à x = 0.35 et finit à x = 2.5 + \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.5,-0.25); + % ligne de vie de P_1 en pointillé dans l'intervalle de op_1 + \draw[thick,densely dotted] (0.35,0) -- (2.5,0); + \node[font=\scriptsize, anchor=west] at (2.55,-0.2) {$op_1$}; + + % op_2 : opération de P2 + % commence à x = 1.0 et finit à x = 2.2 + \draw[opbox,densely dotted] (0.45,-0.75) rectangle (1.2,-1.25); + % ligne de vie de P_2 en pointillé dans l'intervalle de op_2 + \draw[thick,densely dotted] (1.0,-1) -- (2.2,-1); + \node[font=\scriptsize, anchor=west] at (2.25,-1.2) {$op_2$}; + + % op_3 : opération de P3 + % commence à x = 1.4 et finit à x = 2.5 + \draw[opbox,densely dotted] (1.4,-1.75) rectangle (2.5,-2.25); + % ligne de vie de P_3 en pointillé dans l'intervalle de op_3 + \draw[thick,densely dotted] (1.4,-2) -- (2.5,-2); + \node[font=\scriptsize, anchor=west] at (2.55,-2.2) {$op_3$}; + + \end{tikzpicture} + } +\end{frame} + +\subsection{Les systèmes fédérés} + +\begin{frame}{Système fédéré} + \begin{itemize} + \item Plusieurs serveurs, chacun gère un sous-ensemble de processus + \item Les serveurs se synchronisent entre eux (fédération) + \end{itemize} + + \vspace{0.3cm} + \centering + \resizebox{0.4\linewidth}{!}{% + \begin{tikzpicture}[ + node distance=1.8cm and 2.5cm, + server/.style={draw, thick, rounded corners, minimum width=2.8cm, + minimum height=1.2cm, font=\small, fill=gray!10}, + client/.style={draw, circle, thick, minimum size=0.9cm, font=\scriptsize}, + srvlink/.style={<->, thick} + ] + + % --- Serveurs fédérés --- + \node[server] (s1) at (0,1.5) {Serveur $S_1$}; + \node[server] (s2) at (-3,-0.5){Serveur $S_2$}; + \node[server] (s3) at ( 3,-0.5){Serveur $S_3$}; + + % --- Processus locaux à chaque serveur --- + \node[client] (p1) at (0,3) {$P_1$}; + \node[client] (p2) at (-3,-2.5) {$P_2$}; + \node[client] (p3) at ( 3,-2.5) {$P_3$}; + + % --- Liens client -- serveur local --- + \draw[-Latex, thick] (p1.south) -- (s1.north); + \draw[-Latex, thick] (p2.north) -- (s2.south); + \draw[-Latex, thick] (p3.north) -- (s3.south); + + % --- Fédération entre serveurs --- + \draw[srvlink] (s1) -- (s2); + \draw[srvlink] (s1) -- (s3); + \draw[srvlink] (s2) -- (s3); + + \end{tikzpicture} + } +\end{frame} + +\begin{frame}{Système fédéré : exécution parallèle des serveurs} + \begin{itemize} + \item Chaque serveur impose un ordre total local sur ses opérations + \item Globalement, les opérations sur différents serveurs sont concurrentes + \end{itemize} + + \centering + \resizebox{0.7\linewidth}{!}{% + \begin{tikzpicture}[ + x=1.4cm, y=0.9cm, + proc/.style={font=\small}, + opbox/.style={draw, rounded corners, thick} + ] + + % --- Processus (serveurs fédérés) --- + \node[proc, anchor=east] at (0,0) {$S_1$}; + \node[proc, anchor=east] at (0,-1) {$S_2$}; + \node[proc, anchor=east] at (0,-2) {$S_3$}; + + % --- Lignes de temps pour chaque serveur --- + \foreach \y in {0,-1,-2}{ + \draw[thick] (0.2,\y) -- (3.2,\y); + } + + % op_1 : opération sur S_1 (longue) + \draw[opbox,densely dotted] (0.35,0.25) rectangle (2.3,-0.25); + \draw[thick,densely dotted] (0.35,0) -- (2.3,0); + \node[font=\scriptsize, anchor=west] at (2.35,-0.2) {$op_1$}; + + % op_2 : opération sur S_2 (décalée, plus courte) + \draw[opbox,densely dotted] (0.8,-0.75) rectangle (2.0,-1.25); + \draw[thick,densely dotted] (0.8,-1) -- (2.0,-1); + \node[font=\scriptsize, anchor=west] at (2.05,-1.2) {$op_2$}; + + % op_3 : opération sur S_3 (commence plus tard, finit après op_2) + \draw[opbox,densely dotted] (1.3,-1.75) rectangle (2.8,-2.25); + \draw[thick,densely dotted] (1.3,-2) -- (2.8,-2); + \node[font=\scriptsize, anchor=west] at (2.85,-2.2) {$op_3$}; + + \end{tikzpicture} + } +\end{frame} + + + +\begin{frame}{Jeu : placer les applications dans les architectures} + \begin{itemize} + \item À quel type d'architecture appartient chaque application ? + \end{itemize} + + \vspace{0.3cm} + \centering + \resizebox{0.95\linewidth}{!}{% + \begin{tikzpicture}[ + archibox/.style={draw, rounded corners, thick, + minimum width=3.5cm, minimum height=1.6cm, + font=\small, align=center, fill=gray!10}, + app/.style={draw, rounded corners, thick, + minimum width=2.0cm, minimum height=0.8cm, + font=\scriptsize, align=center} + ] + + % --- Zones d'architecture --- + \node[archibox] (central) at (-4, 1.5) {Centralisé}; + \node[archibox] (p2p) at ( 0, 1.5) {Pair à pair}; + \node[archibox] (federated) at ( 4, 1.5) {Fédéré}; + + % --- Jetons d'applications à placer --- + \node[app] at (-5, -0.2) {cryptpad}; + \node[app] at (-2.5,-0.2) {grist}; + \node[app] at ( 0, -0.2) {colabora}; + \node[app] at ( 2.5,-0.2) {matrix}; + \node[app] at ( 5, -0.2) {signal}; + + \node[app] at (-5, -1.8) {XMPP}; + \node[app] at (-2.5,-1.8) {IRC}; + \node[app] at ( 0, -1.8) {IMAP}; + \node[app] at ( 2.5,-1.8) {PeerTube}; + \node[app] at ( 5, -1.8) {DNS}; + + \end{tikzpicture} + } +\end{frame} + + +\begin{frame}{Un petit Quizz} + % \qrcode{partici.fi/38956702} +\end{frame} + +\begin{frame} + \frametitle{MERCI !} + + + +\end{frame} + + +\end{document} \ No newline at end of file