diff --git a/.gradebook.db b/.gradebook.db
index 095710177373085e56bbaffc2cac368d729f0c51..1ea2024a3c167792dba03764dcabc2535c3ca34e 100644
Binary files a/.gradebook.db and b/.gradebook.db differ
diff --git a/00-jupyter-indentation.md b/00-jupyter-indentation.md
index d1d548014f5629e52ad93777f129f9001570cea4..9aec54e319fc64966ca586cfbe7e8610ca9175c9 100644
--- a/00-jupyter-indentation.md
+++ b/00-jupyter-indentation.md
@@ -59,13 +59,13 @@ Exécutez les deux cellules suivantes :
 
 ```{code-cell}
 Maliste=["I","love","Python"]
-for ligne in Maliste :
+for ligne in Maliste:
     print(ligne)
 ```
 
 ```{code-cell}
 Maliste=["I","love","Python"]
-for ligne in Maliste :
+for ligne in Maliste:
 print(ligne)
 ```
 
@@ -88,7 +88,7 @@ for ligne in range (0, len(Maliste)):
 print("Maliste contient ", a, " : ", Maliste[a])
 ```
 
-+++ {"deletable": false, "editable": false, "tags": []}
++++ {"deletable": false, "editable": false}
 
 ## Exercice
 
@@ -98,7 +98,7 @@ de sa souris](../Semaine6/00-jupyter-jeter-sa-souris.md)).
 
 :::{admonition} Raccourcis clavier
 
-* Utilisez <kbd>Tab</kbd> pour indenter .
+* Utilisez <kbd>Tab</kbd> pour indenter.
 * Pour désindenter utilisez <kbd>Maj</kbd>+<kbd>Tab</kbd>.
 * Pour indenter ou désindenter plusieurs lignes d'un coup,
   sélectionnez les avec <kbd>Maj</kbd>+<kbd>↑</kbd> ou <kbd>↓</kbd>
diff --git a/bla.txt b/bla.txt
deleted file mode 100644
index 13462d90664b2c2813189bda60489ffe67e0cb52..0000000000000000000000000000000000000000
--- a/bla.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-     Noel    
-     
-         42
diff --git a/cours-etat-fichier.md b/cours-etat-fichier.md
index 2b61684b457d5ff1e2fb9a5d69afe96e8ace7dbc..de8908c70cb92a2bc2b3834c06e2919000ae920f 100644
--- a/cours-etat-fichier.md
+++ b/cours-etat-fichier.md
@@ -374,4 +374,3 @@ tel échec au moyen d'une exception**.
 
 La notion d'état d'un flux s'utilise naturellement avec l'idiome «lire
 depuis un flux tant que la lecture se passe bien».
-
diff --git a/cours-fichiers.md b/cours-fichiers.md
index 25702dc55dc5bd076c1d38575935938603e60913..a6de34551878f86bb14e25d6d07e3c0f271e37c5 100644
--- a/cours-fichiers.md
+++ b/cours-fichiers.md
@@ -225,4 +225,3 @@ lire ou n'en modifier qu'une fraction -- on parler d'accès aléatoire
 (*random access*) -- mais nous n'en aurons pas besoin ce semestre.
 
 :::
-
diff --git a/cours-flux-chaines-de-caracteres.md b/cours-flux-chaines-de-caracteres.md
index dd2c1a238f20acceb23f2e40b4a1ecf4b338ab8f..db8d33ed1d550a4f137fe2a03dfe6f07985358a8 100644
--- a/cours-flux-chaines-de-caracteres.md
+++ b/cours-flux-chaines-de-caracteres.md
@@ -157,7 +157,7 @@ séparateur, et que l'on peut enchaîner ces lectures :
 slideshow:
   slide_type: fragment
 ---
-string s = "truc 33   bidule   2.5 reste"
+string s = "truc 33 bidule   2.5 reste"
 ```
 
 ```{code-cell}
@@ -470,4 +470,3 @@ Dans cette feuille:
 - Enfin nous avons noté que, grâce au concept de flux, on peut
   utiliser la même syntaxe que pour lire et écrire dans un fichier ou
   pour interagir avec l'utilisateur.
-
diff --git a/cours-flux.md b/cours-flux.md
index 5910aea76564d1dd4aa244d7cc6fbc45af57c2a0..bdf666c4ba6840701d40bd359b4f42c693f7b7d7 100644
--- a/cours-flux.md
+++ b/cours-flux.md
@@ -46,7 +46,7 @@ des données, successivement *l’une après l’autre*.
 
 :::{admonition} Syntaxe
 ```
-flux << expression
+flux << expression;
 ```
 :::
 
diff --git a/cours.md b/cours.md
index 75eab07ac400e954a728e2d88410756d283c8ec2..ca415f8343d6b8287fc6a83e92d7b955d31897e7 100644
--- a/cours.md
+++ b/cours.md
@@ -33,6 +33,17 @@ rise:
 
 ## Prélude
 
++++ {"slideshow": {"slide_type": "fragment"}, "tags": ["instructor-disabled"]}
+
+### Comment vous sentez-vous en ce début de cours?
+
+|                                                                   |         |
+|-------------------------------------------------------------------|---------|
+| <div style="width: 4ex; height: 4ex; background: green;"  ></div> | Curieux |
+| <div style="width: 4ex; height: 4ex; background: magenta;"></div> | Grognon |
+| <div style="width: 4ex; height: 4ex; background: yellow;" ></div> | Inquiet |
+| <div style="width: 4ex; height: 4ex; background: blue;"   ></div> | Épuisé  |
+
 +++ {"slideshow": {"slide_type": "slide"}}
 
 ### Annonces
@@ -217,4 +228,3 @@ Reste à définir la notion de fichier et à voir comment les manipuler en C++.
 - Examen mi semestre : sujet et solution sur la page web
 - Projet: première séance dans deux semaines; avancez d'ici là!
 - Bureau d'Intervention Pédagogique: maths, physique ET informatique
-
diff --git a/fichier-ecriture.cpp b/fichier-ecriture.cpp
index 284ab8f29560f4ad33f85f3135f47195d350481e..78be51ee6ac09987bb7fc35846a94fb20a415375 100644
--- a/fichier-ecriture.cpp
+++ b/fichier-ecriture.cpp
@@ -2,9 +2,9 @@
 using namespace std;
 
 int main() {
-    ofstream fichier;                           // Déclaration
-    fichier.open("bla.txt");                    // Ouverture
-    fichier << "Noel " << 42 << endl;           // Écriture
-    fichier.close();                            // Fermeture
+    ofstream flux;                                 // Déclaration
+    flux.open("pi.txt");                           // Ouverture
+    flux << "Pi vaut à peu près " << 3.14 << endl; // Écriture
+    flux.close();                                  // Fermeture
 }
 
diff --git a/index.md b/index.md
index 1200c6af874136d94a454e4135c831a5841760ec..55aa183f0c4b00b55ef7f6eafc333e771f209197 100644
--- a/index.md
+++ b/index.md
@@ -31,6 +31,14 @@ kernelspec:
 
 ## TP
 
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "6ff5819dcd18e689494acb0ba1af242e", "grade": false, "grade_id": "cell-49", "locked": true, "schema_version": 3, "solution": false, "task": false}}
+
+### Exercice 0 : Jupyter : l'indentation
+
+À faire chez vous!
+
+- [Jupyter : l'indentation](00-jupyter-indentation.md)
+
 +++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9dd26fe469908352fac43de3f823d14a", "grade": false, "grade_id": "cell-50", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 ### Exercice 1 : écrire dans un fichier - 20 minutes
@@ -55,7 +63,7 @@ kernelspec:
 
 ::::
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "932c2abdd5afab28b2820aa3e931555a", "grade": false, "grade_id": "cell-60", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8124382c9ab91f1d2004315ed95e82c1", "grade": false, "grade_id": "cell-60", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 1.  Consultez le fichier [fichier-ecriture.cpp](fichier-ecriture.cpp).
 
@@ -76,8 +84,8 @@ kernelspec:
 6.  Exécutez ce programme puis ouvrez le fichier `essai.txt` afin de
     vérifier son contenu.
 
-7.  Lisez et essayez à nouveau dans le cours les exemples de [lecture
-    depuis le clavier](cours-flux.md).
+7.  Lisez et essayez à nouveau dans le cours l'exemple de [lecture
+    depuis le clavier](cours-flux.md) avec `cin`.
 
 8.  En vous en inspirant, complétez le programme [cin.cpp](cin.cpp)
     pour que, à l’exécution, il demande à l’utilisateur d’entrer deux
@@ -103,16 +111,16 @@ kernelspec:
 
 ### Exercice 2 : ouvrir le smiley - 5 minutes
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "090a1e8ca046f04ddd14e2bfbf53fc87", "grade": false, "grade_id": "cell-80", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "5f1d313afad6f51ebf42d10eb2ea7a42", "grade": false, "grade_id": "cell-80", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 Le fichier [media/smiley.pbm](media/smiley.pbm) (dans le répertoire
 `media` donc!) contient l’image en noir et blanc du TD.
 
--   Ouvrez ce fichier d’abord avec un éditeur de texte. Depuis le
+1.  Ouvrez ce fichier d’abord avec un éditeur de texte. Depuis le
     navigateur de fichiers de JupyterLab: clic droit -> Ouvrir avec ->
     Éditeur.
 
--   Ouvrez ce même fichier avec un logiciel de vision d’images. Pour
+2.  Ouvrez ce même fichier avec un logiciel de vision d’images. Pour
     cela, depuis Jupyter, vous pouvez utiliser la cellule ci-dessous :
 
 ```{code-cell}
@@ -143,9 +151,9 @@ Alternativement :
 
 ### Exercice 3 : petit damier - 15 minutes
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "9abf0ebd131e32fb6dbf281385829a2c", "grade": false, "grade_id": "cell-90", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "7a193c543e70cced08244a1a71520334", "grade": false, "grade_id": "cell-90", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
--   Utilisez un éditeur de texte pour écrire à la main un **fichier
+1.  Utilisez un éditeur de texte pour écrire à la main un **fichier
     texte** `damier.pbm` contenant une image au format PBM
     ([*Portable Bit Map*](http://fr.wikipedia.org/wiki/Portable_bitmap))
     de taille 10×10 représentant un damier :
@@ -155,7 +163,7 @@ Alternativement :
     :alt: un damier
     :::
 
--   Visualisez le résultat, par exemple avec :
+2.  Visualisez le résultat, par exemple avec :
 
 ```{code-cell}
 from open_ppm import open_ppm
@@ -174,10 +182,10 @@ im.resize((256*im.width // im.height, 256))
 - Vérifiez l'entête de l'image:
     - la première ligne contient `P1` (format PBM), `P2` (format PGM)
       ou `P3` (format PPM);
-	- la deuxième ligne (sans compter les lignes de commentaires
+    - la deuxième ligne (sans compter les lignes de commentaires
       commençant par `#`) contient deux entiers: le nombre $c$ de
       colonnes et le nombre $l$ de lignes;
-	- pour les fichiers `pbm` ou `ppm`: la troisième ligne contient un
+    - pour les fichiers `pbm` ou `ppm`: la troisième ligne contient un
       entier $m$.
 - Vérifiez que le reste du fichier consiste d'entiers séparés par des
   espaces ou des sauts de ligne:
@@ -218,18 +226,28 @@ im = open_ppm("damier-automatique.pbm")
 im.resize((512*im.width // im.height, 512))
 ```
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "42c17d610a555a3332ff112e8938eea3", "grade": false, "grade_id": "cell-120", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "8b8ba5a75745c14276324532d144a1fe", "grade": false, "grade_id": "cell-120", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 :::{hint} Indications
 
 -   Vous pouvez vous inspirer de [fichier-ecriture.cpp](fichier-ecriture.cpp).
 -   Commencez par un programme pour un damier 10×10 avant de passer à
     100×100.
+-   L'exécution de votre programme devrait être instantanée ou
+    presque. Si ce n'est pas le cas, interrompez le avec
+    <kbd>Ctrl</kbd>-<kbd>C</kbd>.
+-   Vérifiez la taille du fichier produit en tapant la commande suivante dans
+    le terminal :
+    ```
+    ls -lh *.pbm
+    ```
+    Il devrait faire dans les 20 kilo octets (20K). Veillez à le
+    supprimer s'il fait nettement plus que cela.
 -   Si le fichier produit ne donne pas l’image attendue, ou si vous
-    n'arrivez pas à le visualiser: reportez vous aux [indications
-	de l'exercice précédent](#indications_images).
--	Vous pouvez aussi dans un premier temps, si cela vous aide,
-    afficher le texte produit à l’écran avec `cout`; puis l'écrire
+    n'arrivez pas à le visualiser: reportez vous aux [indications de
+    l'exercice précédent](#indications_images).
+-   Si cela vous aide, vous pouvez aussi dans un premier temps
+    afficher le texte produit à l’écran avec `cout`; puis écrivez le
     dans le fichier dans un deuxième temps.
 
 :::
@@ -276,11 +294,11 @@ Tests automatiques :
 assert im.size == (10, 10), "l'image produite n'est pas de taille 10×10"
 ```
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "56e70fa9f0f44730cf722730c5fae9ab", "grade": false, "grade_id": "cell-150", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "65f16b8b10337cf30c2a8273bd57ff79", "grade": false, "grade_id": "cell-150", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 2.  Implantez un programme [degrade.cpp](degrade.cpp) qui écrit un
-	fichier contenant une image `degrade.pgm` de taille 128x128, avec
-	un dégradé de gris comme celui-ci :
+    fichier contenant une image `degrade.pgm` de taille 128x128, avec
+    un dégradé de gris comme celui-ci :
 
     :::{image} media/degrade.png
     :width: 20%
@@ -288,7 +306,8 @@ assert im.size == (10, 10), "l'image produite n'est pas de taille 10×10"
     :::
 
 ```{code-cell}
-open_ppm("degrade.pgm").resize((256*im.width // im.height, 256))
+im = open_ppm("degrade.pgm")
+im.resize((256*im.width // im.height, 256))
 ```
 
 Tests automatiques :
@@ -330,7 +349,7 @@ réciproquement).
 
 ### Exercice 7 : dégradé circulaire de rouge ♣
 
-+++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "1aec375701d7e1a9221f311b7e4b07ec", "grade": false, "grade_id": "cell-210", "locked": true, "schema_version": 3, "solution": false, "task": false}}
++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "a4badd45d2e8d7c755437d2bcc49f9bc", "grade": false, "grade_id": "cell-210", "locked": true, "schema_version": 3, "solution": false, "task": false}}
 
 1.  Implantez un programme [degrade-circulaire.cpp](degrade-circulaire.cpp)
     qui écrit un fichier contenant une image `degrade-circulaire.ppm`
@@ -342,5 +361,5 @@ réciproquement).
     :alt: un dégradé circulaire
     :::
 
-			2.  Répétez, avec une image de taille 100×100.
+2.  Répétez, avec une image de taille 100×100.
 
diff --git a/open_ppm.py b/open_ppm.py
index 3a7e93c6cf9e9bc438dea6daab0c5314b908f32b..6fe59bcd0e0b047e240d6b5e95809dfe1b78dada 100644
--- a/open_ppm.py
+++ b/open_ppm.py
@@ -2,7 +2,10 @@ import os.path
 from PIL import Image
 def open_ppm(file):
     png = file[:-4]+".png"
-    os.system(f"convert {file} {png}")
-    image = Image.open(png)
-    os.unlink(png)
+    if os.path.isfile(png):
+        image = Image.open(png)
+    else:
+        os.system(f"convert {file} {png}")
+        image = Image.open(png)
+        os.unlink(png)
     return image