\documentclass{beamer}
%\documentclass[ignorenonframetext,handout]{beamer}
%\usepackage{pgfpages}
%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

\usetheme{JuanLesPins}
\usepackage[french]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{bortzmeyer-utils}

% https://capitoledulibre.org/programme/
% 25 minutes
\title{Les types de média, c'est quoi, et à quoi sert l'haptique ? (\insertframenumber/\inserttotalframenumber)}
\author{Stéphane Bortzmeyer\\\texttt{stephane+cdl@bortzmeyer.org}}
\date{Capitole du Libre, 16 novembre 2025}
\setlength{\parskip}{15pt plus 10pt minus 10pt} 
\setbeamersize{text margin left=0.2cm,text margin right=1.8cm}
\newcommand{\figscale}{0.37}
\newcommand{\of}{.6}

\begin{document}

\maketitle

\begin{frame}
  \frametitle{On trouve de tout sur l'Internet}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Du texte, des images, des films, des odeurs (non, ça,
       pas encore)…
     \item<3-> Même pour le même type de contenu, il y a plusieurs
       formats (GIF, JPEG, PNG, WebP…)
     \item<4-> Des logiciels savent gérer différents types de contenus
       et différent formats, ou bien le faire suivre à un logiciel
       plus adapté.
     \item<5-> Mais comment connaitre le format d'une ressource qu'on
       vient de récupérer ?
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame} % Demander à la salle
  \frametitle{Les mauvaises méthodes pour identifier le format}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Se fier à l'extension\only<2>{ (mais un \computer{.php}
       identifie le producteur, pas la production)}, % Et dans le cas
       % d'une erreur 404, le message n'a pas le format de la
       % ressource demandée.
     \item<3-> Se fier au nombre magique au début du fichier\only<3>{
       (mais tous les formats ne l'ont pas)}, 
     \item<4-> Combiner diverses heuristiques en examinant le
       contenu\only<4>{ (fragile…)}. 
     \item<5-> Solution extrême, rare aujourd'hui mais qui a été courante :
     n'accepter qu'un format (le courrier, il y a très longtemps).
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Exemple de nombre magique}
  \includegraphics[scale=0.62]{gif-emacs.png}
\end{frame}

\begin{frame}
  \frametitle{La bonne méthode}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Le serveur indique le \emph{type de média} (dit aussi type MIME pour des
       raisons historiques).
     \item<3-> Vous avez sans doute déjà vu \computer{text/plain}, \computer{image/png},
       \computer{application/octet-stream}, \computer{video/webm}
       ou \computer{audio/ogg}.
       %
% lupa=> SELECT mediatype,count(url) AS total FROM URLs WHERE mediatype LIKE 'video/%' GROUP BY mediatype ORDER BY total DESC;
%    mediatype     | total 
% ------------------+-------
% video/mp4        |   244
% video/webm       |    32
% video/ogg        |    10
% video/quicktime  |    10
% video/x-matroska |     5
% video/x-msvideo  |     4
% video/x-mng      |     1
% video/mp2ts      |     1
% (8 rows)
     \item<4-> Un \emph{type} et un \emph{sous-type}, séparés
       par une barre oblique.
     \item<5-> Utilisé par le courrier électronique, le Web, Gemini et plein
       d'autres systèmes.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Le type de média vu par curl}
  \begin{info}
% curl -i -s https://http.pizza/static/codes/pizza/large/200.avif 
HTTP/2 200 
…
content-type: image/avif  
  \end{info}
\end{frame}

\begin{frame}
  \frametitle{Le type de média vu par Firefox}
  \includegraphics[scale=0.67]{type-firefox.png}
\end{frame}

\begin{frame}
  \frametitle{Et dans Gemini}
  \includegraphics[scale=0.45]{gemini-types.png}
\end{frame}

\begin{frame}
  \frametitle{Types et sous-types}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Le type indique une catégorie très générale : texte,
       son, image…
     \item<3-> Il n'y a que 11 types normalisés et les ajouts sont
       rares.
     \item<4-> Le sous-type indique un format précis.
     \item<5-> Innombrables sous-types enregistrés et des nouveaux
       apparaissent tout le temps. Aucun logiciel ne peut les
       connaitre tous.  
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{L'intéret de la distinction type/sous-type}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> L'idée est qu'un logiciel qui ne connait pas le
       sous-type peut quand même tenter de traiter selon le type seul.
     \item<3-> Ça marche bien pour \computer{text/}, mais moins bien pour
       \computer{image/}\only<3>{ (on peut toujours lancer un
         visualisateur d'images, on verra bien)} et pas du tout pour \computer{application/}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Le type text/}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Pour du texte qu'on peut éditer avec un éditeur
       quelconque\only<2>{ (mais il faut évidemment utiliser emacs, vi
         est nul)}.
     \item<3-> Et lire avec cat, more, less…
     \item<4-> Le HTML est-il du texte ? (Oui, le type officiel a
       toujours été
       \computer{text/html}.) % https://www.iana.org/assignments/media-types/text/html
     \item<5-> Le même débat a eu lieu pour les langages de
       programmation\only<5>{ (\computer{text/javascript} remplaçant
         \computer{application/javascript}, RFC 9239)}.  
    \end{itemize}  
  \end{overlayarea}
\end{frame} 

\begin{frame}
  \frametitle{Le type application}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Le reste…
     \item<3->Ce type est prévu pour du binaire.
     \item<4->\computer{application/octet-stream} : données
       binaires quelconques. % RFC 2046
     \item<5->Mais aussi des formats standards comme
       \computer{application/tzif} ou \computer{application/pdf}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Mais qui enregistre les types et les sous-types ?}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->L'enregistrement officiel est à l'IANA\only<2>{
       (\foreign{Internet Assigned Numbers Authority}, cf. \url{https://www.iana.org/assignments/media-types/media-types.xml})}
     \item<3-> Textes à lire : les RFC 6838
\only<3>{ ``\foreign{Media Type Specifications and Registration
    Procedures}''} et 4289\only<3>{ ``\foreign{Multipurpose Internet
      Mail Extensions (MIME) Part Four: Registration Procedures}''}. % Aussi RFC 6657 Update to MIME regarding "charset" Parameter Handling in Textual Media Types
    \item<4->Pour un type, il faut écrire un RFC et qui ait le statut
      de norme (voir RFC
  9694\only<4>{ 
       ``\foreign{Guidelines for the Definition of New Top-Level Media
      Types}''}).
    \item<5-> Exemple \computer{font/}\only<5>{ (RFC 8081 en 2017)}
     \item<6-> Il faut bien décrire les critères d'acceptation des
       sous-types et en avoir des réels.
     \item<7-> Enregistrer les sous-types est bien plus facile. \url{https://www.iana.org/form/media-types}
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Et haptics/ ?}
  \includegraphics[scale=0.27]{toy.png}
\end{frame}

\begin{frame}
  \frametitle{L'exemple haptics/}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Pour les ressources décrivant des actions physiques,
     \item<3-> RFC 9695 ``\foreign{The 'haptics' Top-level Media
       Type}'' en mars 2025.
     \item<4-> \computer{haptics/ivs}, \computer{haptics/hjif}, \computer{haptics/hmpg}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Facettes des sous-types}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2->Préfixe \computer{vnd} pour \foreign{vendor} ;
       \computer{application/vnd.adobe.flash.movie}
       \computer{application/vnd.openxmlformats-officedocument.wordprocessingml.document}
     \item<3->Convention \computer{+formatdebase} pour des types
       dérivés (\computer{application/activity+json}, \computer{application/atom+xml} ou \computer{application/dots+cbor}).
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{On n'utilise plus x-}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Autrefois, il était courant d'utiliser des types
       expérimentaux préfixés par \computer{x-}.
     \item<3-> Auto-attribués sans formalités.
     \item<4-> C'est (théoriquement) fini depuis le RFC 6648 en 2012.
     \item<5-> C'était prévu pour les expérimentations mais ça a été abusé.
     \item<6-> Et puis les expérimentatipons temporaires durent…
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{On ne fait pas de classification}
   \begin{overlayarea}{\textwidth}{\of\textheight}
     \begin{itemize}
     \item<2-> Les types de média sont conçus pour une utilisation
       pratique : permettre au client Internet de savoir quel logiciel
       lancer.
     \item<3-> Ce n'est pas une vraie classification, au sens des
       bibliothécaires ou archivistes.
     \item<4-> Par exemple, il n'y a pas de types de média pour les langages de programmation car on n'imagine pas le logiciel client lancer le compilateur : \computer{text/plain} suffit.
     \item<5-> Et si on faisait des types de média pour les langages de programmation (\computer{text/c}, \computer{text/zig}, \computer{text/rust}, etc) se poserait la question des versions, pour les langages dont la norme évolue, comme C. 
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\end{document}

