{ "cells": [ { "cell_type": "markdown", "id": "eb748e14-7607-4b80-a278-0d93ed0da0bd", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "# Ecosystème Jupyter\n", "*Bruno Denis, mai 2024* \n", "\n", "
\n", "\"Nuage\n", "
\n", "\n", "Environnement open source qui propose\n", "- un format ouvert de carnet\n", "- des applications web pour\n", " - créer des carnets\n", " - partager des carnets\n", " - collaborer autour de carnets\n", "- des applications pour générer\n", " - des documents\n", " - des applications\n", " \n", "[![NbViewer](https://badgen.net/static/render/NbViewer/orange)](https://nbviewer.org/urls/gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter/-/raw/main/notebooks/presentation_2024_05.ipynb) " ] }, { "cell_type": "markdown", "id": "b7759803", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Une enquête auprès des lecteurs de la revue \"Nature\" place \"IPython Notebook\" en troisième place par ordre d'impact sur le travail des chercheurs [Perkel 2021].\n", "\n", "| Année | Code informatique majeur | Description | Impact |\n", "| ----- | ------------------------ | ----------- | :----: |\n", "| 1957 | Fortran compiler | le langage pionnier | 1er |\n", "| 1965 | FFT (Fast Fourier Transform) | le traitement du signal | 2e |\n", "| 1965 | Atlas of protein sequence and structure | le catalogueur de molécules | 7e |\n", "| 1969 | Modèle de circulation générale| le leadeur de la prévision météo| 10e |\n", "| 1979 | BLAS (Basic Linear Algebra Subprograms) | pionnier du calcul matriciel | 5e |\n", "| 1987 | NIH Image | les bases de l'imagerie médicale | 8e |\n", "| 1990 | BLAST (Basic Local Alignment Search Tool) | le chercheur de séquence | 6e |\n", "| 1991 | arXiv.org | le serveur de preprints | 4e |\n", "| 2011 | **IPython Notebook** | l'explorateur de donnée, mais pas que... | **3e** |\n", "| 2012 | AlexNet | deep learning basé sur les réseaux de neurones | 9e |\n", "\n", "[Perkel 2021] J. M. Perkel, “Ten computer codes that transformed science,” Nature, vol. 589, no. 7842, pp. 344–348, Jan. 2021, doi: 10.1038/d41586-021-00075-2." ] }, { "cell_type": "markdown", "id": "5433259d", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Carnet\n", "\n", "### Carnet du scientifique\n", "\n", "Il sert à documenter les hypothèses, les expériences, les mesures, les analyses, les interprétations. C'est un outil d'aide mémoire et de réflexion, il organique du texte, des formules mathématiques, des données, des figures...\n", "\n", "\"Exemples" ] }, { "cell_type": "markdown", "id": "36ceb894-c953-497c-b7c5-73e7153fdefc", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Carnet électronique\n", "\n", "
\n", "\"exemple\n", "
\n", "\n", "Un carnet électronique est une succession ordonnée de **cellules** en langage naturel et en langage informatique.\n", "\n", "Les **cellules en langage naturel** se composent de texte formaté, d'expressions mathématiques, de tableaux de données et/ou de médias (images, vidéos ...)\n", "\n", "Les **cellules en langage informatique** se composent d'une partie avec le code et d'une partie avec le résultat de l'exécution du code (donnée, graphiques...) " ] }, { "cell_type": "markdown", "id": "84fab8e0-14fe-4c1a-a7d5-badb8b30f083", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "
\n", "\"Structure\n", "
\n", "\n", "Techniquement, pour obtenir une interaction entre l'utilisateur et le code des cellules en langage informatique, les logiciels d'édition disposent de deux composantes\n", "- un **noyau d'exécution** (*kernel*) qui assure l'exécution des cellules de code de programmation et renvoie les résultats\n", "- une application avec deux aspects \n", " - une **interface utilisateur** (*GUI* ou *front-end*) qui gère les interactions avec l'utilisateur\n", " - une **dorsale** (*back-end*) qui, selon les demandes de l'utilisateur, émet des requêtes d'exécution de code au noyau et met à jour le fichier qui stocke le carnet électronique." ] }, { "cell_type": "markdown", "id": "5f983194-aeae-48f9-b0b8-139655075ad8", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "
\n", "

\"exemple

\n", "
\n", "\n", "### Le pionier : Mathematica\n", "\n", "- Utilisation des carnets
électroniques dès 1987
[Wolfram 2023]\n", "- Format propriétaire
qui limite sa diffusion\n", " \n", "\n", "[Wolfram 2023] Stephen Wolfram, \"Introducing Chat Notebooks: Integrating LLMs into the Notebook Paradigm,\" Stephen Wolfram Writings, 2023" ] }, { "cell_type": "markdown", "id": "b0f2f496", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Carnet Jupyter (Jupyter notebook)\n", "\n", "Un carnet Jupyter est une succession de cellules de 3 types différents :\n", "- Texte brut\n", "- Texte formaté et enrichi d'expressions mathématiques des liens vers des images, des vidéos ... (langage de balisage Markdown)\n", "- Code informatique (avec une partie dédiée aux résultats de l'exécution du code)\n", "\n", "\n", "| type de cellule | langage du contenu de la cellule |\n", "| ----------------- | -------- |\n", "| Texte brute | - |\n", "| Texte formaté | [Markdown](https://daringfireball.net/projects/markdown/) ([Tutoriel](https://www.markdowntutorial.com/))|\n", "| Code informatique | Python, Julia, R, C++, Matlab ... |\n", "\n", "Un carnet Jupyter est sauvegardé dans un fichier à l'extension `.ipynb` (IPython notebook)\n", "\n", "Le format de sauvegarde est ouvert ([nbformat](https://nbformat.readthedocs.io/)) et basé sur le format [JSON](https://json.org/json-fr.html) (JavaScript Object Notation)" ] }, { "cell_type": "markdown", "id": "70833a3d", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "\n" ] }, { "cell_type": "markdown", "id": "851c2a32-bf55-43fd-8d71-5f80791a2ef3", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemples de carnets Jupyter en ligne\n", "\n", "| Titre et lien | Description | Auteurs |\n", "|---------------|-------------|---------|\n", "| [Équations Lotka-Volterra](https://nbviewer.org/urls/gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter/-/raw/main/notebooks/lokta_volterra.ipynb) | Exemple basic intégré à ce livre et déjà présenté ci-dessus | *Bruno Denis*, ENS Paris-Saclay, France |\n", "| [Evaluation of a force sensor](https://nbviewer.org/github/agmarrugo/sensors-actuators/blob/master/notebooks/Ex6_4_evaluation_force_sensor.ipynb) | Analyse de résultat de mesure en travaux pratiques | *Andrés Marrugo*, Universidad Tecnológica de Bolívar, Bolivie |\n", "| [Biharmonic equation and Stresses in Polar coordinates](https://nbviewer.org/github/jeevanjyoti4/elasticity/blob/master/PolarCoordinates_Definitions.ipynb) | Calcul symbolique pour obtenir l'équation $\\left ( \\frac{\\partial^4}{\\partial x^4} + 2 \\frac{\\partial^4}{\\partial x^2\\partial y^2} + \\frac{\\partial^4}{\\partial y^4} \\right ) \\Phi = 0$ en coordonnées polaires| *Jeevanjyoti Chakraborty*, IIT , Inde |\n", "| [Rigid-body transformations in a plane (2D)](https://nbviewer.org/github/demotu/BMC/blob/master/notebooks/Transformation2D.ipynb) | Cours interactif sur les transformations planes appliquées aux chaines cinématiques avec Python | *Marcos Duarte* et *Renato Naville Watanabe*, Federal University of ABC, Brésil |" ] }, { "cell_type": "markdown", "id": "947be828", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "
\n", "\"logo\n", "
\n", "\n", "### Langage Markdown \n", "\n", "Markdown est un langage de balisage pour le formatage de texte brut facile à lire et facile à écrire. Il inclus\n", "\n", "- les éléments localisés de type : accentuation, code, liens, images, équations\n", "- les blocs de type : paragraphe, titres, listes, block de code, bloc d'équation\n" ] }, { "cell_type": "markdown", "id": "94b4293a", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Ecrireoupour obtenir

*Italique*

_Italic_

Italic

**Gras**

__Gras__

Gras

# Titre 1

Titre 1\n",
    "=======

Titre 1

## Titre 2

Titre 2\n",
    "-------

Titre 2

### Titre 3

Titre 3\n",
    ".......

Titre 3

#### Titre 4

Titre 4

" ] }, { "cell_type": "markdown", "id": "45139ed8", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Ecrireoupour obtenir

[Link](https://a.org)

[Link][1]\n",
    "⋮\n",
    "[1]: https://a.org

Link

![Image](http://url/b.png)

![Image][1]\n",
    "⋮\n",
    "[1]: http://url/b.jpg

\"Ampoule\"/

> Bloc de citation

 

Bloc de citation

\n", "

* Liste\n",
    "* Liste\n",
    "* Liste
\n", "

\n", "
\n", "

- Liste\n",
    "- Liste\n",
    "- Liste
\n", "

\n", "
\n", "
    \n", "
  • Liste
  • \n", "
  • Liste
  • \n", "
  • Liste
  • \n", "
\n", "
\n", "

1. Un\n",
    "2. Deux\n",
    "3. Trois

\n", "
\n", "
1) Un\n",
    "2) Deux\n",
    "3) Trois
\n", "

\n", "
\n", "
    \n", "
  1. One
  2. \n", "
  3. Two
  4. \n", "
  5. Three
  6. \n", "
\n", "
" ] }, { "cell_type": "markdown", "id": "cf4fa2d1", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "**Ecrire**\n", "\n", "```\n", "`Code` entre 2 accents grave\n", "```\n", "\n", "**pour obtenir**\n", "\n", "`Code` entre 2 accents grave\n", "\n", "---\n", "\n", "**Ecrire**\n", "\n", "````\n", "``` Python\n", "s = input(\"Taper un mot :\")\n", "print(\"Vous avez tapé\", s)\n", "```\n", "````\n", "\n", "**pour obtenir**\n", "\n", "``` Python\n", "s = input(\"Taper un mot :\")\n", "print(\"Vous avez tapé\", s)\n", "```\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "4b3f2e40", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "**Ecrire**\n", "\n", "```\n", "Équation $E=mc^2$ en ligne\n", "```\n", "\n", "**pour obtenir**\n", "\n", "Équation $E=mc^2$ en ligne\n", "\n", "---\n", "\n", "**Ecrire**\n", "\n", "```\n", "Équation :\n", "\n", "$$\n", "E_c = \\frac{1}{2} \\int \\int \\int \\rho v^2 \\text{d}\\tau\n", "$$\n", "```\n", "\n", "**pour obtenir**\n", "\n", "Équation :\n", "\n", "$$\n", "E_c = \\frac{1}{2} \\int \\int \\int \\rho v^2 \\text{d}\\tau\n", "$$\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "0a333a7c", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Créer un carnet\n", "\n", "**Logiciels de création de carnets Jupyter** : Jupyter est une application web, l'utilisateur interagir au travers d'un navigateur web.\n", "\n", "
\n", "

\n", "
\n", "\n", "\n", "| Interface utilisateur | Dorsale (back-end) | Noyaux d'exécution |\n", "| ----------------------|--------------------|--------------------------|\n", "| Jupyter Notebook | Jupyter | **Ju**lia |\n", "| Jupyter Lab | Jupyter Hub | **Pyt**hon |\n", "| | | **R** |\n", "| | | mais pas que ... |" ] }, { "cell_type": "markdown", "id": "b2d76140", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "En marge du projet Jupyter, le projet **JupyterLite** propose une structure logicielle plus compacte en intégrant le noyau d'exécution dans l'application web grâce à la technologie WebAssembly (wasm).\n", "\n", "
\n", "

\n", "
\n", "\n", "[![badge JupyterLite](../assets/img/badge_jupyter_lite.svg)](https://jupyterlite.readthedocs.io/en/stable/_static/lab/)\n", "\n", "" ] }, { "cell_type": "markdown", "id": "23a0f016", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Organisation matérielle\n", "\n", "Deux organisations matérielles pour la création d'un carnet Jupyter, à gauche une installation \"locale\" et à gauche une installation \"distante\".\n", "\n", "" ] }, { "cell_type": "markdown", "id": "b3527ce5", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Lancement de Jupyter\n", "\n", "Pour l'installation locale\n", "- depuis le navigateur Anconda\n", "- depuis le menu Windows\n", "- depuis une interface de commande\n", "\n", "```\n", "jupyter notebook\n", "```\n", "\n", "```\n", "jupyter lab\n", "```\n", "\n", "Pour l'installation distante\n", "- [https://jupyterhub.ijclab.in2p3.fr/](https://jupyterhub.ijclab.in2p3.fr/)" ] }, { "cell_type": "markdown", "id": "7c50a69b-cfec-4615-b23d-2ece81e49aa4", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Interface JupyterLab\n", "\n", "" ] }, { "cell_type": "markdown", "id": "a8aa3f35-2c1a-4e0e-8d8e-307fa2e9ca99", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Création d'un carnet avec JupyterLab\n", "\n", "" ] }, { "cell_type": "markdown", "id": "db1ff135-a637-4edd-8180-37ef99603bd4", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Édition d'un carnet\n", "\n", "Voir le tutoriel ressource de l'Université Paris-Saclay :\n", "- https://jupyter.gitlab.dsi.universite-paris-saclay.fr/tutoriel-jupyter/index.html" ] }, { "cell_type": "markdown", "id": "7a3ad93e-c8c3-4e0e-a5f2-d752126b78fc", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Partager un carnet\n", "\n", "Il y a plusieurs usages liés au partage d'un carnet Jupyter. On peut souhaiter permettre à des personnes tierces extérieures de :\n", "- **lire** le contenu d'un carnet (transmission d'informations)\n", "- **(ré)exécuter** le contenu du carnet, éventuellement avec des données d'entrées différentes (reproductibilité des résultats, ou carnet comme outil de travail)\n", "- **amender** et compléter un carnet (travail collaboratif)" ] }, { "cell_type": "markdown", "id": "70ea759e-fef3-4f79-9626-76b966a76bd9", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Lire un carnet partagé sur une forge\n", "\n", "Avec [**nbviewer**](https://github.com/jupyter/nbviewer/) (application web open source) soit\n", "- avec serveur interne\n", "- avec [nbviewer.org](https://nbviewer.org/) (service hébergé gratuitement par OVHcloud et fastly)\n", "\n", "\n", "\n", "Des services d'hébergement en ligne comme github.com ou gitlab.com proposent aussi la visualisation en ligne de carnet Jupyter." ] }, { "cell_type": "markdown", "id": "2ee70646-ddad-44b3-a7b4-9bb68342319e", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "| Carnet Jupyter | lien de
visualisation |\n", "|----------------|----------------------------|\n", "| **Evaluation of a force sensor**
*Andrés Marrugo*, Universidad Tecnológica de Bolívar, Bolivie
Analyse de résultat de mesure en travaux pratiques. | [![NbViewer](https://badgen.net/static/NbViewer/render/orange)](https://nbviewer.org/github/agmarrugo/sensors-actuators/blob/master/notebooks/Ex6_4_evaluation_force_sensor.ipynb)
[![GitHub](https://badgen.net/static/github/render/blue?icon=github)](https://github.com/jeevanjyoti4/elasticity/blob/master/PolarCoordinates_Definitions.ipynb) |\n", "| **Biharmonic equation and Stresses in Polar coordinates**
*Jeevanjyoti Chakraborty*, IIT , Inde
Calcul symbolique pour obtenir l'équation $\\left ( \\frac{\\partial^4}{\\partial x^4} + 2 \\frac{\\partial^4}{\\partial x^2\\partial y^2} + \\frac{\\partial^4}{\\partial y^4} \\right ) \\Phi = 0$ en coordonnées polaires. | [![NbViewer](https://badgen.net/static/NbViewer/render/orange)](https://nbviewer.org/github/jeevanjyoti4/elasticity/blob/master/PolarCoordinates_Definitions.ipynb)
[![GitHub](https://badgen.net/static/github/render/blue?icon=github)](https://github.com/jeevanjyoti4/elasticity/blob/master/PolarCoordinates_Definitions.ipynb) |\n", "| **Rigid-body transformations in a plane (2D)**
*Marcos Duarte* et *Renato Naville Watanabe*, Federal University of ABC, Brésil
Cours interactif sur les transformations planes appliquées aux chaines cinématiques avec Python | [![NbViewer](https://badgen.net/static/NbViewer/render/orange)](https://nbviewer.org/github/demotu/BMC/blob/master/notebooks/Transformation2D.ipynb)
[![GitHub](https://badgen.net/static/github/render/blue?icon=github)](https://github.com/demotu/BMC/blob/master/notebooks/Transformation2D.ipynb) |" ] }, { "cell_type": "markdown", "id": "fcd92d72-2832-4e1e-abc0-5f34e5143014", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exécuter un carnet partagé sur une forge\n", "\n", "Avec la pile logicielle open source [**Binder**](https://jupyter.org/binder) qui construit l'environnement d'exécution adapté à un carnet, exécute cet environnement et propose l'interface utilisateur Jupyter Notebook ou Jupyter Lab pour interagir avec le carnet.\n", "- avec serveur interne\n", "- avec [mybinder.org](https://mybinder.org/) (service hébergé gratuitement par OVHcloud)\n", "\n", "" ] }, { "cell_type": "markdown", "id": "9730def4-9750-4b12-9138-80ab1e534ed2", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Illustration du processus de partager des résultats reproductibles avec un carnet Jupyter [Beg 2021]\n", "\n", "\n", "\n", "[Beg 2021] Marijan Beg, Juliette Taka, Thomas Kluyver, Alexander Konovalov, Min Ragan-Kelley, Nicolas M. Thiéry, and Hans Fangohr. Using Jupyter for Reproducible Scientific Workflows. Computing in Science & Engineering, 23(2):36–46, March 2021. doi:10.1109/MCSE.2021.3052101." ] }, { "cell_type": "markdown", "id": "dfbfe6f6-153b-4583-873a-1591d8690ff0", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### Exemple\n", "\n", "Les carnets associés à cette présentation sont disponibles sur la forge de l'université Paris-Saclay\n", "\n", "lien vers le dépôt\n", "\n", "[https://gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter](https://gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter)\n", "\n", "lien vers le site mybinder.org\n", "\n", "[https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2Fbruno.denis%2Fintro_jupyter/HEAD?labpath=notebooks%2Flokta_volterra.ipynb](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2Fbruno.denis%2Fintro_jupyter/HEAD?labpath=notebooks%2Flokta_volterra.ipynb)\n", "\n", "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2Fbruno.denis%2Fintro_jupyter/HEAD?labpath=notebooks%2Flokta_volterra.ipynb)" ] }, { "cell_type": "markdown", "id": "efdb7754-8eb8-46f7-92b3-07f42f5d1a20", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Convertir un carnet" ] }, { "cell_type": "markdown", "id": "aa26fbec-a134-4fd6-ad03-2dd4372c058e", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "| Convertion
\\ $\\rightarrow$ \\ | Outils
générateur | Résultat d'exécution
des cellules de code |\n", "|------------|------------|--------|\n", "| carnet $\\rightarrow$ page html | nbconvert | statique |\n", "| carnet $\\rightarrow$ fichier pdf | nbconvert | statique |\n", "| carnet $\\rightarrow$ fichier Latex | nbconvert | statique |\n", "| carnet $\\rightarrow$ script Python | nbconvert | statique |\n", "| carnet $\\rightarrow$ diaporama html | nbconvert, dejavu | statique |\n", "| carnet $\\rightarrow$ diaporama html | RISE | dynamique, avec le
noyau embarqué coté serveur |\n", "| carnets + fichiers Markdown $\\rightarrow$ site web | jupyter-book | statique |\n", "| carnet $\\rightarrow$ application web | voila | dynamique, avec le
noyau embarqué coté serveur |\n", "| carnet $\\rightarrow$ application web | voici | dynamique, avec le
noyau embarqué coté client |" ] }, { "cell_type": "markdown", "id": "f4f29cf9-541d-46fb-a747-504b1b29201d", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Diaporama\n", "\n", "Les diaporamas générés à partir de carnets Jupyter sont construits avec la technologie open source [Reveal.js](https://revealjs.com/)\n", "\n", "Concepts d'un diaporama Reveal.js :\n", "- format de fichier : `html`\n", "- organisation en série de diapositives\n", " - pour passer d'une série à une autre, utiliser les touches et \n", " - pour passer d'une diapositive à l'autre dans une même série, utiliser les touches et \n", "\n", "
" ] }, { "cell_type": "markdown", "id": "d5df523b-30c5-465f-ae26-e0cf76863f61", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Le diaporama intègre une vue \"présentateur\" qui s'affiche dans une autre fenêtre du navigateur web en appuyant sur la touche s. \n", "\n", "
" ] }, { "cell_type": "markdown", "id": "df2f45ea-fea7-4f06-b4da-4a51fcb28675", "metadata": { "editable": true, "slideshow": { "slide_type": "notes" }, "tags": [] }, "source": [ "Cette cellule contient une note pour le présentateur. Elle sera affichée dans une secondes fenêtre lorsque ce carnet est utilisé comme diaporama.\n", "\n", "[1] : la métadonnée \"slide_type\": \"notes\" est associée à cette cellule" ] }, { "cell_type": "markdown", "id": "e62c2071-774f-477a-95d1-8536e509002f", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### Préparation d'un carnet Jupyter avant la génération du diaporama\n", "\n", "Associer une étiquette (*tag*) à chaque cellule du carnet pour lui attribuer un comportement dans le diaporama.\n", "\n", "| Tag | Comportement de la cellule dans le diaporama |\n", "|:-------------:|----------------------------------------------|\n", "| **-** | La cellule prend place dans la diapositive en cours, à la suite des cellules qui y sont déjà présentes |\n", "| **Slide** | La cellule débute une nouvelle série de diapositives |\n", "| **Sub-Slide** | La cellule débute une nouvelle diapositive dans la série en cours |\n", "| **Fragment** | La cellule prend place à la suite de la diapositive en cours, à la suite des cellules qui y sont déjà présentes et elles n'apparaissent qu'après une action du présentateur |\n", "| **Skip** | La cellule n'apparait pas dans le diaporama |\n", "| **Note** | La cellule sert de note pour l'orateur, elle pourra apparaitre sur une fenêtre du navigateur web, différente de celle des diapositives à destination de l'auditoire |" ] }, { "cell_type": "markdown", "id": "6a8662a7-0a45-4bc0-bf57-8d1e8e5ee6ee", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Ajout de tag avec l'interface JupyterLab\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "30e1e366-9775-4ff7-bf0e-a97b9e5dab9f", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### Génération d'un diaporama\n", "\n", "En version statique (sans noyau d'exécution)\n", "- par le menu de JupyterLab
file -> Save and Export Notebook As... -> Reveal.js Slides\n", "- par une interface de commande avec nbconvert, exemples
`jupyter nbconvert --to slides lokta_volterra_plotly.ipynb`
`jupyter nbconvert --to slides --embed-images lokta_volterra_plotly.ipynb`\n", "\n", "\n", "En version dynamique (noyau d'exécution nécessaire à l'utilisation)\n", "- par l'extention RISE (**R**eveal **I**Python **S**lideshow **E**xtension)\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "15387d7c-56da-450f-b063-21ae9db3ad65", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Jupyter book\n", "\n", "Le projet Jupyter Book propose de rassembler un ensemble de carnets en un livre unique cohérent (site web statique, document pdf ou LaTeX, ...).\n", "\n", "
\n" ] }, { "cell_type": "markdown", "id": "0abd2ecf-5f0c-46d1-849f-3239142ca292", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Le contenu type d'un répertoire de travail pour construire un livre Jypyter est le suivant : \n", "\n", "```\n", "monlivre/ <- répertoire du libre\n", " │\n", " ├── _config.yml ) fichiers de\n", " ├── _toc.yml ) configuration\n", " │\n", " ├── intro.md )\n", " ├── chap1.md ) Contenu du livre,\n", " ├── chap2.ipynb ) des carnets Jupyter\n", " ├── section2.1.md ) ou des fichiers textes\n", " ├── section2.2.ipynb ) (CommonMark,\n", " └── chap3.ipynb ) MyST Markdown, ...)\n", "```\n", "\n", "Le fichier `_toc.yml` (table of content) organise le contenu en parties, chapitres, sections. Exemple :\n", "\n", "```yaml\n", "# fichier _toc.yml\n", "format: jb-book # format du livre\n", "root: intro # page d'accueil du livre\n", "chapters: # une liste de chapitres va suivre\n", "- file: chap1 # fichier qui contient les chapitre 1\n", "- file: chap2 # fichier qui contient les chapitre 2\n", " sections: # une liste de sections va suivre\n", " - file: section2.1\n", " - file: section2.2\n", "- file: chap3 # fichier qui contient les chapitre 3\n", "```" ] }, { "cell_type": "markdown", "id": "b0bbe5ae-9d1c-4f93-927e-d80fcbc82790", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Le fichier `_config.yml` contient des informations et des directives pour l'application Jupyter Book. L'exemple minimal suivant fourni des informations pour la génération des hauts et des bas de page.\n", "\n", "```yaml\n", "# fichier _config.yml\n", "title: Introduction à l'écosystème Jupyter\n", "author: Bruno DENIS (ENS Paris-Saclay)\n", "logo: https://jupyterbook.org/en/stable/_static/logo-wide.svg\n", "execute:\n", " execute_notebooks: force\n", "```" ] }, { "cell_type": "markdown", "id": "2eb6a9d7-02ab-4013-950d-1cce223f1408", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Pour générer le livre, il n'y a pas d'interface graphique utilisateur, il faut donc utiliser la ligne de commande. La génération type se fait par la commande suivante :\n", "\n", "```bash\n", "jupyter book build monlivre/\n", "```\n", "où `monlivre` est le chemin d'accès au répertoire qui contient le livre. Par défaut, Jupyter Book construit l'ensemble des pages html nécessaires pour le site web du livre. Les fichiers sont placés dans le répertoire `_build/html`\n", "\n", "```\n", "monlivre/\n", " └──_build\n", " └── html\n", " ├── _images\n", " ├── _static\n", " ├── index.html\n", " ├── intro.html\n", " ...\n", "``` " ] }, { "cell_type": "markdown", "id": "a05fc102-8df8-4276-944f-91eea445628a", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "
" ] }, { "cell_type": "markdown", "id": "9e683de2", "metadata": {}, "source": [ "## Exemples" ] }, { "cell_type": "markdown", "id": "a9c00df9-b0a4-4686-919b-1cb3758e4b8a", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Conclusions\n", "\n", "Les quatre axes de Jupyter [Massot 2023] :\n", "\n", "- **Interopérabilité** : plus de 40 langages de programmation, intégration d'images, de visualisations, de formules mathématiques, d'explications textuelles et même de vidéos.\n", "- **Partage** : grande facilité d’appropriation et de réutilisation. Les carnet peuvent être exportés au format HTML, PDF ou Markdown. Très pratiques dans le cadre de la recherche collaborative mais aussi dans un contexte d’enseignement.\n", "- **Interactivité** : les utilisateurs peuvent directement exécuter le code dans le carnet numérique, voir instantanément le résultat et le modifier si besoin.\n", "- **Écosystème** : les carnets Jupyter permettent d’interagir avec de nombreuses bibliothèques et profitent d’une communauté très active. Il est donc facile de trouver des ressources et de se faire aider pour résoudre des tâches spécifiques.\n", "\n", "[Massot 2023] Marie-Laure Massot, Arnaud Picandet, Maxime Popineau, Émilien Schultz, Agnès Tricoche. Jupyter, un carnet numérique au service des SHS. Atelier Digit_Hum 2023. Oct 2023, Paris, France" ] }, { "cell_type": "markdown", "id": "74d31236-0134-4bc1-86f6-1078fd7b3464", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Points forts de Jupyter\n", "\n", "Un support unique pour penser et raconter, avec du code et des données [Massot 2023]\n", "\n", "" ] }, { "cell_type": "markdown", "id": "27ada9d3-7532-42dd-bd13-a29e946b8666", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Points faibles de Jupyter\n", "\n", "Un environnement complexe [Massot 2023]\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "id": "98568946-3eaa-47f8-94c0-3a2977f788e8", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }