presentation vulga capitole du libre

This commit is contained in:
Amaury JOLY
2025-12-09 16:19:36 +01:00
parent ed3a31e66a
commit 9475510cdb

View File

@@ -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}