diff --git a/module4/ressources/docker_tutorial_fr.org b/module4/ressources/docker_tutorial_fr.org index b43a28df0ae712b0470be55c9b456d38430a7bf3..075f33231113fbee660e39366e20f39a2aaf922f 100644 --- a/module4/ressources/docker_tutorial_fr.org +++ b/module4/ressources/docker_tutorial_fr.org @@ -65,10 +65,10 @@ mesure. - [[#27-exemple-de-reconstruction-dun-vieil-environnement-optionnel][2.7 Exemple de reconstruction d'un "vieil" environnement (Optionnel)]] - [[#28-faire-construire-son-image-par-dockerhub-optionnel][2.8 Faire construire son image par dockerhub (Optionnel)]] - [[#séquence-3-mettre-en-place-un-test-et-utiliser-lintégration-continue-pour-sassurer-de-la-robustesse-dun-code][Séquence 3: Mettre en place un test et utiliser l'intégration continue pour s'assurer de la robustesse d'un code]] + - [[#30-mise-en-place][3.0 Mise en place]] - [[#31-exécuter-ce-notebook-dans-un-conteneur-et-mettre-en-place-un-test][3.1 Exécuter ce notebook dans un conteneur et mettre en place un test]] - [[#32-activer-lintégration-continue-pour-que-ce-test-soit-exécuté-à-chaque-commit-dans-le-conteneur-de-notre-choix][3.2 Activer l'intégration continue pour que ce test soit exécuté à chaque commit dans le conteneur de notre choix]] - - [[#33-rajouter-un-test-pour-repérer-si-des-environnements-plus-à-jour-cassent-notre-test][3.3 Rajouter un test pour repérer si des environnements plus à jour cassent notre test]] - - [[#34-limitations][3.4 Limitations]] +- [[#conclusions][Conclusions]] * TODO Séquence 1: Familiarisation avec le principe de conteneur #+BEGIN_CENTER @@ -315,11 +315,9 @@ ls -la ~/ #+RESULTS: #+begin_example -hostname; whoami ; python ; aa68f9214de3 root bash: python: command not found -ls -la ~/ total 16 drwx------ 2 root root 4096 Jul 8 03:30 . drwxr-xr-x 1 root root 4096 Aug 15 09:36 .. @@ -337,9 +335,6 @@ ls -la ~/ #+end_src #+RESULTS: -: -: ~/myfile.txt -: ls -la ~/ : total 20 : drwx------ 1 root root 4096 Aug 15 09:41 . : drwxr-xr-x 1 root root 4096 Aug 15 09:36 .. @@ -372,11 +367,9 @@ exit #+RESULTS: #+begin_example -hostname; whoami ; python ; f8705ae9aeff root bash: python: command not found -ls -la ~/ total 16 drwx------ 2 root root 4096 Jul 8 03:30 . drwxr-xr-x 1 root root 4096 Aug 15 09:44 .. @@ -452,12 +445,12 @@ test_jupyter #+end_example Ainsi, plutôt que d'aller dans le répertoire =my_work/= pour y -travailler sans bien contrôler dans quel environnement je travaille, -je vais lancer un conteneur à l'environnement logiciel contrôlé et à -qui j'aurai donné accès au répertoire =my_work/=. Je travaillerai alors -normalement à ceci près que je lancerai toutes mes commandes dans mon -conteneur docker. Le résultat de mes commandes sera disponible comme -d'habitude dans le répertoire =my_work/=. +travailler directement sans bien contrôler dans quel environnement je +travaille, je vais lancer un conteneur à l'environnement logiciel +contrôlé et à qui j'aurai donné accès au répertoire =my_work/=. Je +travaillerai alors normalement à ceci près que je lancerai toutes mes +commandes dans mon conteneur docker. Le résultat de mes commandes sera +disponible comme d'habitude dans le répertoire =my_work/=. Mettons cela en pratique avec un environnement un peu plus fourni qu'une debian minimaliste. @@ -514,8 +507,8 @@ parcourir https://hub.docker.com/jupyter et la [[https://jupyter-docker-stacks.r image]]. Préparez-vous à ce que l'exécution de la commande qui suit prenne donc -un peu de temps puisqu'elle commencera par rappatrier la dernière -image de =jupyter/scipy-notebook= avant de l'exécuter. +un peu de temps puisqu'elle commencera par rapatrier la dernière image +de =jupyter/scipy-notebook= (3.47GB!) avant de l'exécuter. #+begin_src shell :results output :exports both docker run -p 8888:8888 jupyter/scipy-notebook #+end_src @@ -549,19 +542,21 @@ qui puisse perturber votre machine. Comment ça marche ? Par défaut, le serveur jupyter s'ouvre sur le port 8888 et il vous indique donc que si vous vous connectez à l'adresse -=http://127.0.0.1:8888=, vous y trouverez le seveur jupyter que vous -venez de lancer. Mais ce serveur est dans votre docker et vous n'y -avez pas accès. le =-p 8888:8888= permet de lier le port 8888 de votre -propre machine au port 8888 du conteneur. +=http://127.0.0.1:8888=, vous y trouverez le serveur jupyter que vous +venez de lancer. Mais ce serveur et ce port sont dans votre docker et +vous n'y avez pas accès... Le =-p 8888:8888= permet de lier le port 8888 +de votre propre machine au port 8888 du conteneur et ainsi de vous +donner accès au serveur jupyter. Fermons le et relançons le en activant la nouvelle interface de -jupyter: JupyterLab. +jupyter: JupyterLab! #+begin_src shell :results output :exports both docker run -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes jupyter/scipy-notebook # from the doc #+end_src Dans cette interface, vous avez accès d'un seul coup d'oeil au -navigateur de fichiers, au notebooks, au terminaux, etc... +navigateur de fichiers, au notebooks, au terminaux, etc... C'est plus +moderne. Vous pouvez bien sûr y importer les fichiers et les données dont vous auriez besoin mais le plus simple pour travailler confortablement est @@ -634,8 +629,19 @@ paquets utilisés. Si je peux facilement accéder à d'anciennes images, il va souvent être difficile de savoir ce qu'elles contiennent exactement, comment elles ont été construites et comment en faire une variation. -** 1.2(B) Utiliser docker pour travailler au jour le jour: Rstudio -** 1.2(C) Utiliser docker pour travailler au jour le jour: Emacs +** TODO 1.2(B) Utiliser docker pour travailler au jour le jour: Rstudio +https://hub.docker.com/r/rocker/rstudio/ + +** TODO 1.2(C) Utiliser docker pour travailler au jour le jour: Emacs +https://github.com/JAremko/docker-emacs +https://hub.docker.com/r/jare/emacs + +#+begin_src shell :results output :exports both +docker run -ti -v /tmp/.X11-unix:/tmp/.X11-unix:ro -e DISPLAY="unix$DISPLAY" -e UNAME="alegrand" -e GNAME="alegrand" -e UID="1000" -e GID="1000" -v ~/Work/Documents/Enseignements/RR_MOOC/gitlab-inria/mooc-rr-ressources/module2/ressources/rr_org:/home/emacs/.emacs.d -v /tmp/:/mnt/workspace jare/emacs emacs +#+end_src + +#+RESULTS: + ** 1.3 Limitations Utiliser un conteneur est donc assez facile et très pratique car cela vous permet de travailler en isolation de votre machine et d'utiliser @@ -1602,7 +1608,7 @@ REPOSITORY TAG IMAGE ID alegrand/moocrr_debian_snapshot_jupyter 20171209T114814Z cffc98c65d75 4 minutes ago 743MB alegrand/moocrr_debian_snapshot_slim 20171003T094008Z a0a1d1dcf7ce 2 hours ago 62.9MB #+end_example - +*** Le jeu des 7 erreurs C'est Parfait. Par curiosité, j'ai relancé l'ensemble du script une heure plus tard et voilà ce qu'indiquait alors Docker: #+begin_src shell :results output :exports both @@ -1811,35 +1817,12 @@ faire en sorte que ce soit directement dockerhub qui construise vos images. L'avantage principal est une garantie de traçabilité et que l'image a bien été construite de la façon indiquée. * Séquence 3: Mettre en place un test et utiliser l'intégration continue pour s'assurer de la robustesse d'un code -Point de départ: un notebook -** 3.1 Exécuter ce notebook dans un conteneur et mettre en place un test -- Utiliser nbconvert et diff -** 3.2 Activer l'intégration continue pour que ce test soit exécuté à chaque commit dans le conteneur de notre choix -** 3.3 Rajouter un test pour repérer si des environnements plus à jour cassent notre test -** 3.4 Limitations -- Qui a "raison" ? Comment savoir ce qui a causé la différence ? -* Old notes :noexport: -** Autre progression :noexport: -1. Automatiser l'exécution d'un notebook sur sa machine -> script. Pas - de contrôle du tout de l'environnement. *Où stoquer le résultat?* - *Comment indiquer si c'est OK ?* -2. CI: debian; apt-get install ; youpi! Mais lent et pas complètement - figé... *Qui a "raison" ?* *Comment savoir ce qui a causé la différence ?* -3. Figer une image docker et automatiser sa construction en local - (possibilité de faire à distance mais demande une mise en oeuvre un - peu particulière, fragile si on ne sait pas faire à la main). -4. Intégrer son image au CI -5. Publier la recette et garantir que l'image correspond à cette - recette ? -6. Reconstruire un environnement particulier? Une vieille debian par - exemple ? -** Automatiser l'exécution d'un notebook -Commençons par un notebook tout simple, celui de challenger, et -vérifions qu'il s'exécute bien sur "ma machine". Je commence par créer -un répertoire pour ce notebook. +** 3.0 Mise en place +Dans cette séquence, nous travaillerons sur un notebook tout simple, +celui de challenger. Je commence par créer un répertoire de travail. #+begin_src shell :session *shell* :results output :exports both -mkdir -p mooc_docker -cd mooc_docker +mkdir -p moocrr_notebook +cd moocrr_notebook #+end_src #+RESULTS: @@ -1852,4020 +1835,977 @@ wget https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-modele/raw/master/modul #+RESULTS: #+begin_example ---2019-07-23 09:19:24-- https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-modele/raw/master/module2/exo5/exo5_fr.ipynb?inline=false +--2019-08-20 11:04:41-- https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-modele/raw/master/module2/exo5/exo5_fr.ipynb?inline=false Resolving gitlab.inria.fr (gitlab.inria.fr)... 128.93.193.8 Connecting to gitlab.inria.fr (gitlab.inria.fr)|128.93.193.8|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 41019 (40K) [text/plain] Saving to: 'notebook.ipynb' -[ ] 0 --.-KB/s notebook.ipynb 100%[===================>] 40.06K --.-KB/s in 0.09s +[ ] 0 --.-KB/s notebook.ipynb 100%[===================>] 40.06K --.-KB/s in 0.1s -2019-07-23 09:19:25 (448 KB/s) - 'notebook.ipynb' saved [41019/41019] ---2019-07-23 09:19:25-- https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-modele/raw/master/module2/exo5/shuttle.csv?inline=false +2019-08-20 11:04:41 (416 KB/s) - 'notebook.ipynb' saved [41019/41019] +--2019-08-20 11:04:41-- https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-modele/raw/master/module2/exo5/shuttle.csv?inline=false Resolving gitlab.inria.fr (gitlab.inria.fr)... 128.93.193.8 Connecting to gitlab.inria.fr (gitlab.inria.fr)|128.93.193.8|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 485 [text/plain] Saving to: 'shuttle.csv' -[ ] 0 --.-KB/s shuttle.csv 100%[===================>] 485 --.-KB/s in 0s +[ ] 0 --.-KB/s shuttle.csv 100%[===================>] 485 --.-KB/s in 0s -2019-07-23 09:19:25 (4.23 MB/s) - 'shuttle.csv' saved [485/485] +2019-08-20 11:04:41 (4.20 MB/s) - 'shuttle.csv' saved [485/485] #+end_example +** 3.1 Exécuter ce notebook dans un conteneur et mettre en place un test +*** Exécution du notebook avec =nbconvert= +Je peux lancer jupyter en interactif et réexecuter mon notebook. #+begin_src shell :session *shell* :results output :exports both -ls -l +docker run --volume=`pwd`:/home/jovyan/ -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes jupyter/scipy-notebook #+end_src -#+RESULTS: -: total 56 -: -rw-r--r-- 1 alegrand alegrand 41019 Jul 23 09:19 notebook.ipynb -: -rw-r--r-- 1 alegrand alegrand 485 Jul 23 09:19 shuttle.csv - -Ce notebook a déja été exécuté. Exportons le au format html pour voir -à quoi il [[file:mooc_docker/notebook.html][ressemble]]: +Mais ce n'est pas très pratique tous ces clicks et en plus je risque +d'écraser mon notebook d'origine, donc utilisons la ligne de commande +avec =nbconvert=: #+begin_src shell :session *shell* :results output :exports both -jupyter-nbconvert --to html notebook.ipynb -ls -l +docker run --volume=`pwd`:/home/jovyan/ jupyter/scipy-notebook \ + jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.nbconvert.ipynb #+end_src #+RESULTS: -: [NbConvertApp] Converting notebook notebook.ipynb to html -: [NbConvertApp] Writing 305180 bytes to notebook.html -: total 356 -: -rw-r--r-- 1 alegrand alegrand 305302 Jul 23 09:20 notebook.html -: -rw-r--r-- 1 alegrand alegrand 41019 Jul 23 09:19 notebook.ipynb -: -rw-r--r-- 1 alegrand alegrand 485 Jul 23 09:19 shuttle.csv - -Je vais maintenant le ré-exécuter sur ma machine. +: +: [NbConvertApp] Converting notebook notebook.ipynb to notebook +: [NbConvertApp] Executing notebook with kernel: python3 +: [NbConvertApp] Writing 41309 bytes to notebook.nbconvert.ipynb + +*** Utilisation de =diff= +Alors, est-ce que mon notebook est identique au précédent ? #+begin_src shell :session *shell* :results output :exports both -jupyter nbconvert --to notebook --execute notebook.ipynb --output notebook_rerun.ipynb -jupyter nbconvert --to html --execute notebook_rerun.ipynb ls -l #+end_src #+RESULTS: -#+begin_example -[NbConvertApp] Converting notebook notebook.ipynb to notebook -[NbConvertApp] Executing notebook with kernel: python3 -[NbConvertApp] Writing 41346 bytes to notebook_rerun.ipynb -[NbConvertApp] Converting notebook notebook_rerun.ipynb to html -[NbConvertApp] Executing notebook with kernel: python3 -[NbConvertApp] Writing 305683 bytes to notebook_rerun.html -total 700 --rw-r--r-- 1 alegrand alegrand 305302 Jul 23 09:20 notebook.html --rw-r--r-- 1 alegrand alegrand 41019 Jul 23 09:19 notebook.ipynb --rw-r--r-- 1 alegrand alegrand 305805 Jul 23 09:21 notebook_rerun.html --rw-r--r-- 1 alegrand alegrand 41473 Jul 23 09:21 notebook_rerun.ipynb --rw-r--r-- 1 alegrand alegrand 485 Jul 23 09:19 shuttle.csv -#+end_example +: total 100 +: -rw-r--r-- 1 alegrand alegrand 41019 Aug 20 11:04 notebook.ipynb +: -rw-r--r-- 1 alegrand users 41436 Aug 20 11:05 notebook.nbconvert.ipynb +: -rw-r--r-- 1 alegrand alegrand 485 Aug 20 11:04 shuttle.csv -Tiens, je peux alors m'appercevoir que le notebook ainsi obtenu est -différent de celui d'origine. Je peux ouvrir les deux sorties html, -mais pas facile de repérer les différences... Diff aide un peu mais il -vaut mieux ignorer les images stoquées dans le notebook au format binaire. +Ah, et bien déjà il n'a pas la même taille... D'où viennent les +différences ? Je pourrais faire un commit et utiliser gitlab pour +repérer les différences mais ça ne serait pas bien automatisable. Donc +utilisons les outils faits pour: =diff= #+begin_src shell :session *shell* :results output :exports both -diff notebook.ipynb notebook_rerun.ipynb | grep -v image/png | sed 's/^/>/' +diff -b notebook.ipynb notebook.nbconvert.ipynb | sed 's/^/>/' #+end_src #+RESULTS: #+begin_example 456c456 +< "image/png": "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\n", --- -506a507,514 +> "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEKCAYAAAAfGVI8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAVlUlEQVR4nO3de7SddX3n8fcnFyBIKhSmqZNAvTF2WIqIEbTYTqqtA3YJdVErOFMcOjZlCTPLzkwL43IstXatUWunurzEyKBiV0ureKEzcRDadbS2IiBNuWihGUQ4xIIgCgdDLuQ7f+yd6c45O8k+4Tx7k/zer7XOyn6u55svD/uT57J/O1WFJKldiyZdgCRpsgwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGdRYESS5P8kCS2/awPEnen2RTkluSnNxVLZKkPevyjODjwOl7WX4GcHz/Zy3w4Q5rkSTtQWdBUFVfBr63l1XOAq6onuuBI5M8o6t6JEnDLZng714J3DswPd2f953ZKyZZS++sgWXLlr342GOPHUuBT9bOnTtZtMjbMIPsyVz2ZDj7MteT6cmdd975YFX9s2HLJhkEGTJv6HgXVbUeWA+wevXquummm7qsa8FMTU2xZs2aSZfxlGJP5rInw9mXuZ5MT5J8e0/LJhm308DgP+1XAZsnVIskNWuSQXA1cF7/6aGXAj+oqjmXhSRJ3ers0lCSPwHWAMckmQZ+G1gKUFXrgA3Aq4FNwA+B87uqRZK0Z50FQVWdu4/lBVzY1e+XJI3GW/KS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjOg2CJKcnuSPJpiSXDFn+9CR/nuTvktye5Pwu65EkzdVZECRZDHwQOAM4ATg3yQmzVrsQ+EZVvRBYA7w3ySFd1SRJmqvLM4JTgE1VdVdVbQOuBM6atU4By5MEOAL4HrCjw5okSbMs6XDfK4F7B6angVNnrfMB4GpgM7AceH1V7Zy9oyRrgbUAK1asYGpqqot6F9zMzMwBU+u42JO57Mlw9mWurnrSZRBkyLyaNf2vgY3AK4DnANcm+auqemS3jarWA+sBVq9eXWvWrFn4ajswNTXFgVLruNiTuezJcPZlrq560uWloWng2IHpVfT+5T/ofOAz1bMJ+Bbwkx3WJEmapcsguBE4Psmz+jeAz6F3GWjQPcArAZKsAJ4H3NVhTZKkWTq7NFRVO5JcBFwDLAYur6rbk1zQX74O+F3g40lupXcp6eKqerCrmiRJc3V5j4Cq2gBsmDVv3cDrzcCruqxBkrR3frJYkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuM6DYIkpye5I8mmJJfsYZ01STYmuT3Jl7qsR5I015JRVkry/Kq6bT47TrIY+CDw88A0cGOSq6vqGwPrHAl8CDi9qu5J8mPz+R2SpCdv1DOCdUluSPLm/pv3KE4BNlXVXVW1DbgSOGvWOm8APlNV9wBU1QMj7luStEBGOiOoqpcnOR74VeCmJDcAH6uqa/ey2Urg3oHpaeDUWev8C2BpkilgOfC+qrpi9o6SrAXWAqxYsYKpqalRyp64mZmZA6bWcbEnc9mT4ezLXF31ZKQgAKiqf0jyNuAm4P3Ai5IEeGtVfWbIJhm2myG//8XAK4FlwFeTXF9Vd8763euB9QCrV6+uNWvWjFr2RE1NTXGg1Dou9mQuezKcfZmrq56Meo/gROB84BeAa4HXVNXNSf458FVgWBBMA8cOTK8CNg9Z58Gqegx4LMmXgRcCdyJJGotR7xF8ALgZeGFVXVhVNwNU1WbgbXvY5kbg+CTPSnIIcA5w9ax1Pg/8dJIlSQ6nd+nom/P9S0iS9t+ol4ZeDWypqicAkiwCDquqH1bVJ4dtUFU7klwEXAMsBi6vqtuTXNBfvq6qvpnk/wC3ADuBy+b7dJIk6ckZNQiuA34OmOlPHw58EfipvW1UVRuADbPmrZs1/R7gPSPWIUlaYKNeGjqsqnaFAP3Xh3dTkiRpnEYNgseSnLxrIsmLgS3dlCRJGqdRLw29BfhUkl1P/TwDeH03JUmSxmnUD5TdmOQngefR+3zA31fV9k4rkySNxcgfKANeAjyzv82LkjDsU8CSpAPLqB8o+yTwHGAj8ER/dgEGgSQd4EY9I1gNnFBVs4eIkCQd4EZ9aug24Me7LESSNBmjnhEcA3yjP+ro1l0zq+rMTqqSJI3NqEFwaZdFSJImZ9THR7+U5CeA46vquv4AcYu7LU2SNA4j3SNI8mvAp4GP9GetBD7XVVGSpPEZ9WbxhcBpwCPQ+5IawO8XlqSDwKhBsLX/vcMAJFnC3G8bkyQdgEYNgi8leSuwLMnPA58C/ry7siRJ4zJqEFwCfBe4Ffh1et8xsKdvJpMkHUBGfWpoJ/DR/o8k6SAy6lhD32LIPYGqevaCVyRJGqv5jDW0y2HA64AfXfhyJEnjNtI9gqp6aODnvqr6Q+AVHdcmSRqDUS8NnTwwuYjeGcLyTiqSJI3VqJeG3jvwegdwN/DLC16NJGnsRn1q6Ge7LkSSNBmjXhr6T3tbXlV/sDDlSJLGbT5PDb0EuLo//Rrgy8C9XRQlSRqf+XwxzclV9ShAkkuBT1XVm7oqTJI0HqMOMXEcsG1gehvwzAWvRpI0dqOeEXwSuCHJZ+l9wvi1wBWdVSVJGptRnxr6vSRfAH66P+v8qvrb7sqSJI3LqJeGAA4HHqmq9wHTSZ7VUU2SpDEa9asqfxu4GPiv/VlLgT/qqihJ0viMekbwWuBM4DGAqtqMQ0xI0kFh1CDYVlVFfyjqJE/rriRJ0jiNGgR/luQjwJFJfg24Dr+kRpIOCqM+NfT7/e8qfgR4HvD2qrq208okSWOxzzOCJIuTXFdV11bVb1bVfxk1BJKcnuSOJJuSXLKX9V6S5IkkvzSf4iVJT94+g6CqngB+mOTp89lxksXAB4EzgBOAc5OcsIf13gVcM5/9S5IWxqifLH4cuDXJtfSfHAKoqv+4l21OATZV1V0ASa4EzgK+MWu9/wBcRW9QO0nSmI0aBP+7/zMfK9l9dNJp4NTBFZKspPdo6ivYSxAkWQusBVixYgVTU1PzLGUyZmZmDphax8WezGVPhrMvc3XVk70GQZLjquqeqvrEfuw7Q+bVrOk/BC6uqieSYav3N6paD6wHWL16da1Zs2Y/yhm/qakpDpRax8WezGVPhrMvc3XVk33dI/jcrhdJrprnvqeBYwemVwGbZ62zGrgyyd3ALwEfSvKL8/w9kqQnYV+Xhgb/mf7see77RuD4/phE9wHnAG8YXKGq/v94RUk+DvyvqvockqSx2VcQ1B5e71NV7UhyEb2ngRYDl1fV7Uku6C9fN69KJUmd2FcQvDDJI/TODJb1X9Ofrqr6kb1tXFUbgA2z5g0NgKr6dyNVLElaUHsNgqpaPK5CJEmTMZ/vI5AkHYQMAklqnEEgSY0zCCSpcU0FwUMzW/m7e7/PQzNbJ12KJM3LQzNb2bL9iU7ev5oJgs9vvI/T3vWX/NvLvsZp7/pLrt5436RLkqSR7Hr/+tZ3H+vk/auJIHhoZisXX3ULj2/fyaNbd/D49p381lW3eGYg6Slv8P3riapO3r+aCILph7ewdNHuf9WlixYx/fCWCVUkSaMZx/tXE0Gw6qhlbN+5c7d523fuZNVRyyZUkSSNZhzvX00EwdFHHMq7zz6Rw5YuYvmhSzhs6SLeffaJHH3EoZMuTZL2avD9a3HSyfvXqF9Mc8A786SVnPbcY5h+eAurjlpmCEg6YOx6/7rhq1/hr898+YK/fzUTBNBLVgNA0oHo6CMOZdnSxZ28hzVxaUiStGcGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGtdpECQ5PckdSTYluWTI8n+T5Jb+z98keWGX9UiS5uosCJIsBj4InAGcAJyb5IRZq30L+FdVdSLwu8D6ruqRJA3X5RnBKcCmqrqrqrYBVwJnDa5QVX9TVQ/3J68HVnVYjyRpiCUd7nslcO/A9DRw6l7W//fAF4YtSLIWWAuwYsUKpqamFqjEbs3MzBwwtY6LPZnLngxnX+bqqiddBkGGzKuhKyY/Sy8IXj5seVWtp3/ZaPXq1bVmzZoFKrFbU1NTHCi1jos9mcueDGdf5uqqJ10GwTRw7MD0KmDz7JWSnAhcBpxRVQ91WI8kaYgu7xHcCByf5FlJDgHOAa4eXCHJccBngF+pqjs7rEWStAednRFU1Y4kFwHXAIuBy6vq9iQX9JevA94OHA18KAnAjqpa3VVNkqS5urw0RFVtADbMmrdu4PWbgDd1WUMrHprZyvTDW1h11DKOPuLQzrc7mNmTydt0/6M8/MPtbLr/UZ67YvmkyznodRoEGo/Pb7yPi6+6haWLFrF9507effaJnHnSys62O5jZk8l7++du5Yrr7+E/v2AHv/E/vsx5LzuOd5z1gkmXdVBziIkD3EMzW7n4qlt4fPtOHt26g8e37+S3rrqFh2a2drLdwcyeTN6m+x/liuvv2W3eFV+9h033PzqhitpgEBzgph/ewtJFu/9nXLpoEdMPb+lku4OZPZm8jfd+f17ztTAMggPcqqOWsX3nzt3mbd+5k1VHLetku4OZPZm8k449cl7ztTAMggPc0UccyrvPPpHDli5i+aFLOGzpIt599on7vMm5v9sdzOzJ5D13xXLOe9lxu80772XHecO4Y94sPgicedJKTnvuMfN+0mV/tzuY2ZPJe8dZL+C8lz6TW79+Pdf9xksNgTEwCA4SRx9x6H69ae3vdgczezJ5z12xnOnDlxoCY+KlIUlqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDWu0yBIcnqSO5JsSnLJkOVJ8v7+8luSnNxlPZKkuToLgiSLgQ8CZwAnAOcmOWHWamcAx/d/1gIf7qoeSdJwXZ4RnAJsqqq7qmobcCVw1qx1zgKuqJ7rgSOTPKPDmiRJsyzpcN8rgXsHpqeBU0dYZyXwncGVkqyld8YAMJPkjoUttTPHAA9OuoinGHsylz0Zzr7M9WR68hN7WtBlEGTIvNqPdaiq9cD6hShqnJLcVFWrJ13HU4k9mcueDGdf5uqqJ11eGpoGjh2YXgVs3o91JEkd6jIIbgSOT/KsJIcA5wBXz1rnauC8/tNDLwV+UFXfmb0jSVJ3Ors0VFU7klwEXAMsBi6vqtuTXNBfvg7YALwa2AT8EDi/q3om5IC7nDUG9mQuezKcfZmrk56kas4leUlSQ/xksSQ1ziCQpMYZBAsoyd1Jbk2yMclN/XmXJrmvP29jkldPus5xSnJkkk8n+fsk30zysiQ/muTaJP/Q//OoSdc5TnvoSbPHSZLnDfy9NyZ5JMlbWj5O9tKTTo4T7xEsoCR3A6ur6sGBeZcCM1X1+5Oqa5KSfAL4q6q6rP/02OHAW4HvVdV/749BdVRVXTzRQsdoDz15Cw0fJ7v0h6a5j96HTy+k4eNkl1k9OZ8OjhPPCNSZJD8C/AzwPwGqaltVfZ/e0CKf6K/2CeAXJ1Ph+O2lJ+p5JfB/q+rbNHyczDLYk04YBAurgC8m+Xp/WIxdLuqPrnp5S6e3wLOB7wIfS/K3SS5L8jRgxa7Pi/T//LFJFjlme+oJtHucDDoH+JP+65aPk0GDPYEOjhODYGGdVlUn0xtV9cIkP0NvRNXnACfRG0PpvROsb9yWACcDH66qFwGPAXOGI2/MnnrS8nECQP8y2ZnApyZdy1PFkJ50cpwYBAuoqjb3/3wA+CxwSlXdX1VPVNVO4KP0RmVtxTQwXVVf609/mt6b4P27Rpnt//nAhOqbhKE9afw42eUM4Oaqur8/3fJxsstuPenqODEIFkiSpyVZvus18CrgtlnDar8WuG0S9U1CVf0jcG+S5/VnvRL4Br2hRd7Yn/dG4PMTKG8i9tSTlo+TAeey+yWQZo+TAbv1pKvjxKeGFkiSZ9M7C4De6f8fV9XvJfkkvdO4Au4Gfr2l8ZSSnARcBhwC3EXvqYdFwJ8BxwH3AK+rqu9NrMgx20NP3k/bx8nh9Iakf3ZV/aA/72jaPk6G9aST9xODQJIa56UhSWqcQSBJjTMIJKlxBoEkNc4gkKTGdfnl9dJY9R83/Iv+5I8DT9AbzgF6H+7bNpHC9iLJrwIb+p8vkCbCx0d1UHoqjfqaZHFVPbGHZV8BLqqqjfPY35Kq2rFgBap5XhpSE5K8MckN/THcP5RkUZIlSb6f5D1Jbk5yTZJTk3wpyV27xnpP8qYkn+0vvyPJ20bc7zuT3ACckuR3ktyY5LYk69LzenofDvrT/vaHJJlOcmR/3y9Ncl3/9TuTfCTJtfQGrFuS5A/6v/uWJG8af1d1sDAIdNBL8nx6H8f/qao6id4l0XP6i58OfLE/WOA24FJ6wz68DnjHwG5O6W9zMvCGJCeNsN+bq+qUqvoq8L6qegnwgv6y06vqT4GNwOur6qQRLl29CHhNVf0KsBZ4oKpOAV5Cb5DD4/anP5L3CNSCn6P3ZnlTEoBl9D66D7Clqq7tv74V+EFV7UhyK/DMgX1cU1UPAyT5HPByev//7Gm/2/inIUcAXpnkN4HDgGOArwNfmOff4/NV9Xj/9auAf5lkMHiOpzcUgzQvBoFaEODyqvpvu81MltB7w95lJ7B14PXg/x+zb6bVPva7pfo34PpjxnyA3iij9yV5J71AGGYH/3SmPnudx2b9nd5cVX+B9CR5aUgtuA745STHQO/pov24jPKq9L5r+HB635z11/PY7zJ6wfJgf4TasweWPQosH5i+G3hx//XgerNdA7y5Hzq7vuN22Tz/ThLgGYEaUFW3Jvkd4Loki4DtwAXA5nns5ivAH9P7UpBP7nrKZ5T9VtVD6X1P8W3At4GvDSz+GHBZki307kNcCnw0yT8CN+ylno/QG5VzY/+y1AP0AkqaNx8flfah/0TO86vqLZOuReqCl4YkqXGeEUhS4zwjkKTGGQSS1DiDQJIaZxBIUuMMAklq3P8DAyhhWVgQaHAAAAAASUVORK5CYII=\n", +506a507,515 > "name": "stderr", > "output_type": "stream", > "text": [ -> "/usr/lib/python3/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", -> " from pandas.core import datetools\n" +> "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", +> "Use an instance of a link class instead.\n", +> " \n" > ] > }, > { -512c520 -< " Dep. Variable: Frequency No. Observations: 7 \n", ---- -> " Dep. Variable: Frequency No. Observations: 7 \n", -515c523 -< " Model: GLM Df Residuals: 5 \n", ---- -> " Model: GLM Df Residuals: 5 \n", -518c526 -< " Model Family: Binomial Df Model: 1 \n", ---- -> " Model Family: Binomial Df Model: 1 \n", -521c529 +521c530,533 < " Link Function: logit Scale: 1.0000 \n", --- -> " Link Function: logit Scale: 1.0 \n", -524c532 +> " Link Function: logit Scale: 1.0000\n", +> "\n", +> "\n", +> " Method: IRLS Log-Likelihood: -2.5250\n", +524c536 < " Method: IRLS Log-Likelihood: -2.5250 \n", --- -> " Method: IRLS Log-Likelihood: -3.6370\n", -527c535 +> " Date: Tue, 20 Aug 2019 Deviance: 0.22231\n", +527c539 < " Date: Sat, 13 Apr 2019 Deviance: 0.22231 \n", --- -> " Date: Tue, 23 Jul 2019 Deviance: 3.3763\n", -530c538 +> " Time: 09:05:05 Pearson chi2: 0.236 \n", +530c542 < " Time: 19:11:24 Pearson chi2: 0.236 \n", --- -> " Time: 09:21:16 Pearson chi2: 0.236 \n", -533c541 +> " No. Iterations: 4 \n", +533c545 < " No. Iterations: 4 Covariance Type: nonrobust\n", --- -> " No. Iterations: 5 \n", -556,560c564,568 -< "Link Function: logit Scale: 1.0000\n", -< "Method: IRLS Log-Likelihood: -2.5250\n", +> " Covariance Type: nonrobust \n", +558,560c570,573 < "Date: Sat, 13 Apr 2019 Deviance: 0.22231\n", < "Time: 19:11:24 Pearson chi2: 0.236\n", < "No. Iterations: 4 Covariance Type: nonrobust\n", --- -> "Link Function: logit Scale: 1.0\n", -> "Method: IRLS Log-Likelihood: -3.6370\n", -> "Date: Tue, 23 Jul 2019 Deviance: 3.3763\n", -> "Time: 09:21:16 Pearson chi2: 0.236\n", -> "No. Iterations: 5 \n", -613c621 +> "Date: Tue, 20 Aug 2019 Deviance: 0.22231\n", +> "Time: 09:05:05 Pearson chi2: 0.236\n", +> "No. Iterations: 4 \n", +> "Covariance Type: nonrobust \n", +613c626 +< "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGyFJREFUeJzt3X2UVPWd5/H3pxuQBhEjkhkFDWSWtHF9ABRQWZ3WqGhORLPrE2vGMRNCdmeMk83Knng2E43Rc2YHd2I26zgy6jgxiUo8iiSHCahjT2Y8PoCCILAIY4g2JEGND7Q2Snd/9497u6kuqunqpvqhfnxe5/Tpurd+de/3V7fvp27fuvUrRQRmZpaumsEuwMzM+peD3swscQ56M7PEOejNzBLnoDczS5yD3swscT0GvaR7Je2U9HI390vS/5G0VdI6SdMrX6aZmfVVOUf09wEX7Of+C4Ep+c8C4M4DL8vMzCqlx6CPiF8Av9tPk4uBH0TmWeBwSUdVqkAzMzswwyqwjAnA6wXTTfm8Xxc3lLSA7KifkSNHnnLsscdWYPVDU3t7OzU16b4FknL/Uu4buH/V7pVXXnkzIsb35jGVCHqVmFdyXIWIWAwsBqivr4/NmzdXYPVDU2NjIw0NDYNdRr9JuX8p9w3cv2on6Ve9fUwlXvaagGMKpicCOyqwXDMzq4BKBP0y4Or86pvTgHcjYp/TNmZmNjh6PHUj6QGgAThSUhNwIzAcICL+FlgOfBbYCnwAfLG/ijUzs97rMegjYl4P9wfwZxWryMyqwp49e2hqamL37t2DXUoXY8eOZdOmTYNdxgEbOXIkEydOZPjw4Qe8rEq8GWtmB6GmpibGjBnDpEmTkEpdkzE4du3axZgxYwa7jAMSEbz11ls0NTUxefLkA15eutcgmVm/2r17N+PGjRtSIZ8KSYwbN65i/y056M2szxzy/aeSz62D3swscT5Hb2ZVq7a2lhNPPLFzeunSpYwbN24QKxqaHPRmVrXq6upYu3Ztl3m7du3qvN3a2sqwYY45n7oxs6T86Ec/4rLLLuOiiy7i/PPPB2DRokXMmDGDk046iRtvvLGz7a233kp9fT3nnnsu8+bN47bbbgOgoaGB1atXA/Dmm28yadIkANra2li4cGHnsu666y5g77ALl156KccddxxXXXUV2ZXnsGrVKs444wxOPvlkZs6cya5duzjzzDO7vEDNnj2bdevW9dtz4pc6Mztg3/7pBjbueK+iyzz+6MO48aJ/v982LS0tTJ06FYDJkyfz6KOPAvDMM8+wbt06jjjiCFauXMmWLVt4/vnniQjmzp3LL37xC0aPHs2DDz7ImjVraG1tZfr06Zxyyin7Xd8999zD2LFjWbVqFR9++CGzZ8/ufDFZs2YNGzZs4Oijj2b27Nk8/fTTzJw5kyuuuIKHHnqIGTNm8N5771FXV8f8+fO57777uP3223nllVf48MMPOemkkyrwrJXmoDezqlXq1A3AeeedxxFHHAHAypUrWblyJdOmTQOgubmZLVu2sGvXLj7/+c8zatQoAObOndvj+lauXMm6det4+OGHAXj33XfZsmULI0aMYObMmUycOBGAqVOnsm3bNsaOHctRRx3FjBkzADjssMMAuOyyy/jOd77DokWLuPfee7nmmmsO7InogYPezA5YT0feA2306NGdtyOCG264ga985Std2tx+++3dXsI4bNgw2tvbAbpcyx4RfP/732fOnDld2jc2NnLIIYd0TtfW1tLa2kpElFzHqFGjOO+883jsscdYsmRJ52mi/uJz9GaWtDlz5nDvvffS3NwMwPbt29m5cydnnXUWjz76KC0tLezatYuf/vSnnY+ZNGkSL7zwAkDn0XvHsu6880727NkDwCuvvML777/f7bqPO+44duzYwapVq4DsjeLW1lYA5s+fz3XXXceMGTM6//voLz6iN7OknX/++WzatInTTz8dgEMPPZQf/vCHTJ8+nSuuuIKpU6fyiU98gjPPPLPzMddffz2XX345999/P+ecc07n/Pnz57Nt2zamT59ORDB+/HiWLl3a7bpHjBjBQw89xFe/+lVaWlqoq6vjiSee4NBDD+WUU07hsMMO44tfHIBxICNiUH4+9alPRcqeeuqpwS6hX6Xcv5T7FlG5/m3cuLEiy6m09957r0+Pu/HGG2PRokUVrqZ727dvjylTpkRbW1u3bUo9x8Dq6GXe+tSNmdkA+8EPfsCsWbO49dZbB+RrD33qxswMuOmmmwZsXVdffTVXX331gK3PR/Rm1mcRJb8e2iqgks+tg97M+mTkyJG89dZbDvt+EPl49CNHjqzI8nzqxsz6ZOLEiTQ1NfHGG28Mdild7N69u2IBOZg6vmGqEhz0ZtYnw4cP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\n", --- +> "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAay0lEQVR4nO3dfZRU9Z3n8fenGwgNIoxIMgoayBzSrhsVMYDK6PYYBc2JT7tRJM6YuMMSd2Iy2T1ho+dkVjPRc3YO7hwzGSOyhnGMGR/GVdQcJqBuOs64PqABQSQ8rCHSkAQxo9DaKN393T/u7aa6upuuLqof6ufndU6frnvrd299v1Vdn7p969YtRQRmZpaumqEuwMzMBpaD3swscQ56M7PEOejNzBLnoDczS5yD3swscX0GvaQVkvZIerWX6yXpbyRtl7RB0szKl2lmZuUqZYv+HuDCw1x/ETA9/1kM3HnkZZmZWaX0GfQR8Qzwu8MMuRS4NzLPAxMkHVepAs3M7MiMqMA6JgM7C6ab8nm/Lh4oaTHZVj+jR48+48QTT6zAzQ9P7e3t1NSk+xaI+6teKfcG6fe3devWvRExqT/LVCLo1cO8Hs+rEBHLgeUA9fX1sWXLlgrc/PDU2NhIQ0PDUJcxYNxf9Uq5N0i/P0m/6u8ylXjZawJOKJieAuyuwHrNzKwCKhH0jwPX5EffnAm8ExHddtuYmdnQ6HPXjaT7gQbgWElNwE3ASICIWAasAj4LbAfeA64dqGLNzKz/+gz6iFjYx/UBfKViFZlZVTh48CBNTU0cOHBgqEvpYvz48WzevHmoyzhio0ePZsqUKYwcOfKI11WJN2PN7EOoqamJcePGMXXqVKSejskYGvv372fcuHFDXcYRiQjeeustmpqamDZt2hGvL91jkMxsQB04cICJEycOq5BPhSQmTpxYsf+WHPRmVjaH/MCp5H3roDczS5z30ZtZ1aqtreWUU07pnF65ciUTJ04cwoqGJwe9mVWturo61q9f32Xe/v37Oy+3trYyYoRjzrtuzCwpP/rRj7jiiiu4+OKLmTdvHgBLly5l1qxZnHrqqdx0002dY2+99Vbq6+s5//zzWbhwIbfddhsADQ0NvPTSSwDs3buXqVOnAtDW1saSJUs613XXXXcBh0678PnPf56TTjqJq6++muzIc1i7di1nn302p512GrNnz2b//v2cc845XV6g5s6dy4YNGwbsPvFLnZkdsW8/sYnXdu+r6DpPPv5obrr43x52TEtLCzNmzABg2rRpPProowA899xzbNiwgWOOOYY1a9awbds2XnzxRSKCSy65hGeeeYaxY8fywAMPsG7dOlpbW5k5cyZnnHHGYW/vBz/4AePHj2ft2rW8//77zJ07t/PFZN26dWzatInjjz+euXPn8uyzzzJ79mwWLFjAgw8+yKxZs9i3bx91dXUsWrSIe+65h9tvv52tW7fy/vvvc+qpp1bgXuuZg97MqlZPu24ALrjgAo455hgA1qxZw5o1azj99NMBaG5uZtu2bezfv5/LL7+cMWPGAHDJJZf0eXtr1qxhw4YNPPzwwwC88847bNu2jVGjRjF79mymTJkCwIwZM9ixYwfjx4/nuOOOY9asWQAcffTRAFxxxRV85zvfYenSpaxYsYIvfelLR3ZH9MFBb2ZHrK8t78E2duzYzssRwY033siXv/zlLmNuv/32Xg9hHDFiBO3t7QBdjmWPCL73ve8xf/78LuMbGxv5yEc+0jldW1tLa2srEdHjbYwZM4YLLriAxx57jIceeqhzN9FA8T56M0va/PnzWbFiBc3NzQDs2rWLPXv2cO655/Loo4/S0tLC/v37eeKJJzqXmTp1Ki+//DJA59Z7x7ruvPNODh48CMDWrVt59913e73tk046id27d7N27Voge6O4tbUVgEWLFvG1r32NWbNmdf73MVC8RW9mSZs3bx6bN2/mrLPOAuCoo47ivvvuY+bMmSxYsIAZM2bw8Y9/nHPOOadzmW984xtceeWV/PCHP+S8887rnL9o0SJ27NjBzJkziQgmTZrEypUre73tUaNG8eCDD/LVr36VlpYW6urqeOqppzjqqKM444wzOProo7n22kE4D2REDMnPJz/5yUjZT3/606EuYUC5v+pVqd5ee+21iqyn0vbt21fWcjfddFMsXbq0wtX0bteuXTF9+vRoa2vrdUxP9zHwUvQzb73rxsxskN17773MmTOHW2+9dVC+9tC7bszMgJtvvnnQbuuaa67hmmuuGbTb8xa9mZUtosevh7YKqOR966A3s7KMHj2at956y2E/ACI/H/3o0aMrsj7vujGzskyZMoWmpibefPPNoS6liwMHDlQsIIdSxzdMVYKD3szKMnLkyIp8+1Gl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\n", #+end_example -Certaines différences sont insignifiantes (l'heure, la date ou le -warning sur =pandas.core.datetools= qui ne sera bientôt plus maintenu), -mais d'autres sont plus alarmantes. Le nombre d'itérations pour -calculer la régression logistique n'est pas le même (5 au lieu de 4) -et les valeurs de Log-Likelihood et de Deviance sont très -différentes. Que s'est-il passé ? A priori, ce sont des bibliothèques -python différentes qui ont été utilisées et qui expliquent ces -différences. Nous allons voir comment contrôler tout ceci. -** Identifier les dépendances -Je vais vous montrer comment créer et manipuler une image et un -conteneur docker sur ma machine pas à pas. Vous n'aurez pas forcément -à réaliser ce genre de choses par la suite sur votre machine mais il -est bon que vous voyiez comment cela se passe afin que, lorsque vous -utiliserez des outils qui font ça automatiquement pour vous dans le -cloud, il n'y ait rien de mystérieux. - -Docker va vous permettre d'exécuter des programmes dans ce que l'on -appelle des conteneurs. Un /conteneur/ est une sorte de mini-machine -virtuelle dont le système de fichier est appelé /image/ et qui va donc -exécuter un /programme/. Je peux avoir à un instant donné plusieurs -conteneurs exécutant des programmes différents issus d'images -différentes ou identiques. -- Le premier avantage de cette approche est que votre programme sera - isolé du reste de votre machine et, quoi que vous fassiez dans ce - conteneur, vous n'abimerez pas votre propre machine en installant - des bibliothèques plus anciennes ou plus modernes qui seraient - incompatibles. -- Le second avantage est que vous pourrez préparer plusieurs - conteneurs différents pour vérifier si votre programme fonctionne - toujours bien. -*** S'assurer que docker est bien installé -Je suis sur une machine linux (une debian) et j'ai donc installé -docker via le paquet =docker.io=. J'ai aussi pris soin de me mettre dans -le groupe docker pour ne pas avoir à passer root à chaque fois. Voici -comment j'ai fait. -#+begin_src shell :results output :exports both :eval never -sudo apt-get install docker.io -sudo adduser alegrand docker -#+end_src +Difficile de s'y repérer. Le tout début concerne des images qui +seraient différentes. Les premiers caractères sont identiques ainsi +que les derniers mais si on regarde au milieu, on peut repérer des +caractères différents. Bon, il y a certainement une différence au +niveau des images mais on verra ça plus tard, conçentrons nous sur le +reste pour l'instant. D'autre part, les espaces ou les tabulations +n'ont pas d'importance non plus donc demandons à =diff= de les ignorer. #+begin_src shell :session *shell* :results output :exports both -docker version +diff -w --ignore-matching-lines="image/png" notebook.ipynb notebook.nbconvert.ipynb | sed 's/^/>/' #+end_src #+RESULTS: #+begin_example -Client: - Version: 1.13.1 - API version: 1.26 - Go version: go1.9.3 - Git commit: 092cba3 - Built: Thu Feb 1 09:36:44 2018 - OS/Arch: linux/amd64 -Server: - Version: 1.13.1 - API version: 1.26 (minimum version 1.12) - Go version: go1.9.3 - Git commit: 092cba3 - Built: Thu Feb 1 09:36:44 2018 - OS/Arch: linux/amd64 - Experimental: false +506a507,515 +> "name": "stderr", +> "output_type": "stream", +> "text": [ +> "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", +> "Use an instance of a link class instead.\n", +> " \n" +> ] +> }, +> { +527c536,539 +< " Date: Sat, 13 Apr 2019 Deviance: 0.22231 \n", +--- +> " Date: Tue, 20 Aug 2019 Deviance: 0.22231\n", +> "\n", +> "\n", +> " Time: 09:05:05 Pearson chi2: 0.236 \n", +530c542 +< " Time: 19:11:24 Pearson chi2: 0.236 \n", +--- +> " No. Iterations: 4 \n", +533c545 +< " No. Iterations: 4 Covariance Type: nonrobust\n", +--- +> " Covariance Type: nonrobust \n", +558,560c570,573 +< "Date: Sat, 13 Apr 2019 Deviance: 0.22231\n", +< "Time: 19:11:24 Pearson chi2: 0.236\n", +< "No. Iterations: 4 Covariance Type: nonrobust\n", +--- +> "Date: Tue, 20 Aug 2019 Deviance: 0.22231\n", +> "Time: 09:05:05 Pearson chi2: 0.236\n", +> "No. Iterations: 4 \n", +> "Covariance Type: nonrobust \n", #+end_example -*** Récupérer une image de base -Nous pouvons commener. L'idée pour bien contrôler son environnement va -être de partir d'un environnement minimaliste et dans lequel notre -notebook aura d'ailleurs peu de chances de s'exécuter. Je partirai -d'une image debian stable. -#+begin_src shell :session *shell* :results output :exports both -docker pull debian:stable -#+end_src - -#+RESULTS: -: stable: Pulling from library/debian -: -: 5893bf6f34bb: Pulling fs layer -: 5893bf6f34bb: Downloading 507kB/50.38MB -: 5893bf6f34bb: Verifying Checksum -: 5893bf6f34bb: Download complete -: 5893bf6f34bb: Extracting 524.3kB/50.38MB -: 5893bf6f34bb: Pull complete -: Digest: sha256:4d28f191a4c9dec569867dd9af1e388c995146057a36d5b3086e599af7c2379b -: Status: Downloaded newer image for debian:stable -La commande précédent s'est connectée sur le https://hub.docker.com/ -pour y télécharger une image officielle debian stable. Je peux la -trouver listée ici: https://hub.docker.com/_/debian. Que puis-je -savoir sur cette image ? +En fait, la plupart des différences sont insignifiantes du point de +vue de notre calcul (l'heure, la date, le warning sur +=pandas.core.datetools= qui ne sera bientôt plus maintenu, ou le +="nbformat_minor"= qui concerne le format de jupyter). Je pourrais +supprimer les parties sur les dates mais on voit néanmoins que le +format de stockage n'aide pas à repérer les différentes. En effet, le +fait que les informations sur la date soient sur deux lignes et +mélangées avec les informations sur la =Deviance= et le =Pearson chi2= +n'est vraiment pas commode. Voici une façon possible de faire en sorte +que diff ignore ces différences de façon assez conservative puisque je +supprime (avec =sed=) les informations sur la date et l'heure tout en +laissant les valeurs pour =Deviance= et =Pearson chi2= de façon à ce +qu'elles restent comparées par =diff=. #+begin_src shell :session *shell* :results output :exports both -docker image ls +mkdir -p sed/ +sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" notebook.ipynb > sed/notebook.ipynb +sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" notebook.nbconvert.ipynb > sed/notebook.nbconvert.ipynb +diff -w --ignore-matching-lines="image/png" \ + --ignore-matching-lines="nbformat_minor" \ + --ignore-matching-lines="hidePrompt" \ + --ignore-matching-lines="scrolled" \ + --ignore-matching-lines="No. Iterations:" \ + --ignore-matching-lines="Covariance Type:" \ + sed/notebook.ipynb sed/notebook.nbconvert.ipynb | sed 's/^/>/' #+end_src #+RESULTS: #+begin_example -REPOSITORY TAG IMAGE ID CREATED SIZE -simgrid-website latest 0f3727380ab6 12 days ago 1.19GB -debian stable 40e13c3c9aab 12 days ago 114MB -#+end_example - -Mon image apparaît. Elle fait 114MB et a été construite il y a 12 -jours. -*** Exécuter une commande dans un conteneur -Grâce à la commande docker run, je vais pouvoir exécuter des commandes -dans le conteneur que je viens de télécharger. Par exemple, comme ceci. -#+begin_src shell :session *shell* :results output :exports both -docker run debian:stable ls -#+end_src -#+RESULTS: -#+begin_example -bin -boot -dev -etc -home -lib -lib64 -media -mnt -opt -proc -root -run -sbin -srv -sys -tmp -usr -var +506a507,515 +> "name": "stderr", +> "output_type": "stream", +> "text": [ +> "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", +> "Use an instance of a link class instead.\n", +> " \n" +> ] +> }, +> { +533c542,545 +< " No. Iterations: 4 Covariance Type: nonrobust\n", +--- +> " No. Iterations: 4 \n", +> "\n", +> "\n", +> " Covariance Type: nonrobust \n", #+end_example -Bon, ok, ce n'est pas très impressionnant. Essayons avec la commande -=hostname= qui me renverra comment s'appelle la machine. -#+begin_src shell :session *shell* :results output :exports both -docker run debian:stable hostname -#+end_src - -#+RESULTS: -: 07193bfee89f - -Ah, oui, c'est assez différent de ce que j'obtiens quand je lance -cette commande directement sur ma machine: +Bon, difficile de faire ignorer ce warning et la partie restante +concerne un export HTML sur deux lignes au lieu d'une. +*** Comparaison des images +Je suis quand même curieux de la différence au niveau des +images. D'après +https://ipython.org/ipython-doc/dev/notebook/nbformat.html, les images +sont sérialisées et encodées à l'aide de =base64=. Je vais donc tenter +de les extraire et les comparer (il y a deux images, le =tail= permet de +prendre la dernière, le sed permet d'enlever la partie avant et après +le contenu de l'image). #+begin_src shell :session *shell* :results output :exports both -hostname +grep "image/png" notebook.nbconvert.ipynb | tail -n 1 | sed -e 's/.*: "//g' -e 's/".*//g' | base64 -d > img1_nbconvert.png #+end_src #+RESULTS: -: icarus +: base64: invalid input -Continuons de comparer. Est-ce que l'on trouve python dans cet -environnement ? +Malgré le message d'erreur, l'image est correctement transformée. Je +tente la même chose pour le notebook d'origine. #+begin_src shell :session *shell* :results output :exports both -ls /usr/bin/X11//python3 # chez moi oui -docker run debian:stable ls -l /usr/bin/X11//python3 # mais pas dans cet environnement -#+end_src - -#+RESULTS: -: /usr/bin/X11//python3 -: ls: cannot access '/usr/bin/X11//python3': No such file or directory - -En fait, à chaque fois que je lance cette commande docker, c'est un -peu comme si un mini-système d'exploitation démarrait, exécutait cette -commande et s'éteignait... C'est un peu pénible d'avoir à toujours -préfixer par =docker run=, donc une solution simple consiste à lancer -docker en mode interactif. -*** Docker en interactif -À partir de maintenant, il vous faudra bien faire attention à -distinguer les commandes qui sont lancées sur mon système de base de -celles qui sont lancées dans notre conteneur docker. -#+begin_src shell :session *docker* :results output :exports both -docker run --name debian -t -i debian:stable -#+end_src - -#+RESULTS: -: -: echo 'org_babel_sh_eoe' - -Je peux alors exécuter plusieurs séries de commandes facilement dans -mon environnement: -#+begin_src shell :session *docker* :results output :exports both -hostname -python +grep "image/png" notebook.ipynb | tail -n 1 | sed -e 's/.*: "//g' -e 's/".*//g' | base64 -d > img1.png #+end_src #+RESULTS: -: hostname -: dca997abf7cc -: python -: bash: python: command not found +: base64: invalid input -Mmh, et bien installons python du coup. -#+begin_src shell :session *docker* :results output :exports both -whoami -apt-get update -apt-get install -y python3 -#+end_src +[[file:moocrr_notebook/img1.png][file:moocrr_notebook/img1.png]] [[file:moocrr_notebook/img1_nbconvert.png][file:moocrr_notebook/img1_nbconvert.png]] +Si j'ouvre les deux images, elles semblent identiques mais si on +utilise un logiciel pour mettre en évidence les différences: +# Les images ont-elles bien la même tailles et peuvent-elles être comparées ? +# #+begin_src shell :session *shell* :results output :exports both +# identify img1* +# #+end_src -#+RESULTS: -: whoami -: root -: apt-get update -: Get:1 http://cdn-fastly.deb.debian.org/debian stable InRelease [118 kB] -: Get:2 http://security-cdn.debian.org/debian-security stable/updates InRelease [39.1 kB] -: Get:3 http://cdn-fastly.deb.debian.org/debian stable-updates InRelease [46.8 kB] -: Get:4 http://security-cdn.debian.org/debian-security stable/updates/main amd64 Packages [49.4 kB] -: Get:5 http://cdn-fastly.deb.debian.org/debian stable/main amd64 Packages [7897 kB] -: Fetched 8150 kB in 12s (682 kB/s) -: Reading package lists... Done -: apt-get install python3 -: apt-get install python3 -: Reading package lists... Done -: Building dependency tree -: Reading state information... Done -: The following additional packages will be installed: -: bzip2 file libexpat1 libmagic-mgc libmagic1 libmpdec2 libpython3-stdlib -: libpython3.7-minimal libpython3.7-stdlib libreadline7 libsqlite3-0 libssl1.1 -: mime-support python3-minimal python3.7 python3.7-minimal readline-common xz-utils -: Suggested packages: -: bzip2-doc python3-doc python3-tk python3-venv python3.7-venv python3.7-doc binutils -: binfmt-support readline-doc -: The following NEW packages will be installed: -: bzip2 file libexpat1 libmagic-mgc libmagic1 libmpdec2 libpython3-stdlib -: libpython3.7-minimal libpython3.7-stdlib libreadline7 libsqlite3-0 libssl1.1 -: mime-support python3 python3-minimal python3.7 python3.7-minimal readline-common -: xz-utils -: 0 upgraded, 19 newly installed, 0 to remove and 0 not upgraded. -: Need to get 7789 kB of archives. -: After this operation, 36.3 MB of additional disk space will be used. -: Get:1 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libssl1.1 amd64 1.1.1c-1 [1535 kB] -: Get:2 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7-minimal amd64 3.7.3-2 [588 kB] -: Get:3 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libexpat1 amd64 2.2.6-2 [106 kB] -: Get:4 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3.7-minimal amd64 3.7.3-2 [1736 kB] -: Get:5 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-minimal amd64 3.7.3-1 [36.6 kB] -: Get:6 http://cdn-fastly.deb.debian.org/debian stable/main amd64 mime-support all 3.62 [37.2 kB] -: Get:7 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmpdec2 amd64 2.4.2-2 [87.2 kB] -: Get:8 http://cdn-fastly.deb.debian.org/debian stable/main amd64 readline-common all 7.0-5 [70.6 kB] -: Get:9 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libreadline7 amd64 7.0-5 [151 kB] -: Get:10 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsqlite3-0 amd64 3.27.2-3 [641 kB] -: Get:11 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7-stdlib amd64 3.7.3-2 [1732 kB] -: Get:12 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3.7 amd64 3.7.3-2 [330 kB] -: Get:13 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3-stdlib amd64 3.7.3-1 [20.0 kB] -: Get:14 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3 amd64 3.7.3-1 [61.5 kB] -: Get:15 http://cdn-fastly.deb.debian.org/debian stable/main amd64 bzip2 amd64 1.0.6-9.1 [48.3 kB] -: Get:16 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmagic-mgc amd64 1:5.35-4 [242 kB] -: Get:17 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmagic1 amd64 1:5.35-4 [117 kB] -: Get:18 http://cdn-fastly.deb.debian.org/debian stable/main amd64 file amd64 1:5.35-4 [66.3 kB] -: Get:19 http://cdn-fastly.deb.debian.org/debian stable/main amd64 xz-utils amd64 5.2.4-1 [183 kB] -: Fetched 7789 kB in 12s (635 kB/s) -: debconf: delaying package configuration, since apt-utils is not installed -: Selecting previously unselected package libssl1.1:amd64. -: (Reading database ... 6674 files and directories currently installed.) -: Preparing to unpack .../libssl1.1_1.1.1c-1_amd64.deb ... -: Unpacking libssl1.1:amd64 (1.1.1c-1) ... -: Selecting previously unselected package libpython3.7-minimal:amd64. -: Preparing to unpack .../libpython3.7-minimal_3.7.3-2_amd64.deb ... -: Unpacking libpython3.7-minimal:amd64 (3.7.3-2) ... -: Selecting previously unselected package libexpat1:amd64. -: Preparing to unpack .../libexpat1_2.2.6-2_amd64.deb ... -: Unpacking libexpat1:amd64 (2.2.6-2) ... -: Selecting previously unselected package python3.7-minimal. -: Preparing to unpack .../python3.7-minimal_3.7.3-2_amd64.deb ... -: Unpacking python3.7-minimal (3.7.3-2) ... -: Setting up libssl1.1:amd64 (1.1.1c-1) ... -: debconf: unable to initialize frontend: Dialog -: debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.) -: debconf: falling back to frontend: Readline -: debconf: unable to initialize frontend: Readline -: debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/x86_64-linux-gnu/perl5/5.28 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.) -: debconf: falling back to frontend: Teletype -: Setting up libpython3.7-minimal:amd64 (3.7.3-2) ... -: Setting up libexpat1:amd64 (2.2.6-2) ... -: Setting up python3.7-minimal (3.7.3-2) ... -: Selecting previously unselected package python3-minimal. -: (Reading database ... 6935 files and directories currently installed.) -: Preparing to unpack .../0-python3-minimal_3.7.3-1_amd64.deb ... -: Unpacking python3-minimal (3.7.3-1) ... -: Selecting previously unselected package mime-support. -: Preparing to unpack .../1-mime-support_3.62_all.deb ... -: Unpacking mime-support (3.62) ... -: Selecting previously unselected package libmpdec2:amd64. -: Preparing to unpack .../2-libmpdec2_2.4.2-2_amd64.deb ... -: Unpacking libmpdec2:amd64 (2.4.2-2) ... -: Selecting previously unselected package readline-common. -: Preparing to unpack .../3-readline-common_7.0-5_all.deb ... -: Unpacking readline-common (7.0-5) ... -: Selecting previously unselected package libreadline7:amd64. -: Preparing to unpack .../4-libreadline7_7.0-5_amd64.deb ... -: Unpacking libreadline7:amd64 (7.0-5) ... -: Selecting previously unselected package libsqlite3-0:amd64. -: Preparing to unpack .../5-libsqlite3-0_3.27.2-3_amd64.deb ... -: Unpacking libsqlite3-0:amd64 (3.27.2-3) ... -: Selecting previously unselected package libpython3.7-stdlib:amd64. -: Preparing to unpack .../6-libpython3.7-stdlib_3.7.3-2_amd64.deb ... -: Unpacking libpython3.7-stdlib:amd64 (3.7.3-2) ... -: Selecting previously unselected package python3.7. -: Preparing to unpack .../7-python3.7_3.7.3-2_amd64.deb ... -: Unpacking python3.7 (3.7.3-2) ... -: Selecting previously unselected package libpython3-stdlib:amd64. -: Preparing to unpack .../8-libpython3-stdlib_3.7.3-1_amd64.deb ... -: Unpacking libpython3-stdlib:amd64 (3.7.3-1) ... -: Setting up python3-minimal (3.7.3-1) ... -: Selecting previously unselected package python3. -: (Reading database ... 7404 files and directories currently installed.) -: Preparing to unpack .../0-python3_3.7.3-1_amd64.deb ... -: Unpacking python3 (3.7.3-1) ... -: Selecting previously unselected package bzip2. -: Preparing to unpack .../1-bzip2_1.0.6-9.1_amd64.deb ... -: Unpacking bzip2 (1.0.6-9.1) ... -: Selecting previously unselected package libmagic-mgc. -: Preparing to unpack .../2-libmagic-mgc_1%3a5.35-4_amd64.deb ... -: Unpacking libmagic-mgc (1:5.35-4) ... -: Selecting previously unselected package libmagic1:amd64. -: Preparing to unpack .../3-libmagic1_1%3a5.35-4_amd64.deb ... -: Unpacking libmagic1:amd64 (1:5.35-4) ... -: Selecting previously unselected package file. -: Preparing to unpack .../4-file_1%3a5.35-4_amd64.deb ... -: Unpacking file (1:5.35-4) ... -: Selecting previously unselected package xz-utils. -: Preparing to unpack .../5-xz-utils_5.2.4-1_amd64.deb ... -: Unpacking xz-utils (5.2.4-1) ... -: Setting up mime-support (3.62) ... -: Setting up libmagic-mgc (1:5.35-4) ... -: Setting up libsqlite3-0:amd64 (3.27.2-3) ... -: Setting up libmagic1:amd64 (1:5.35-4) ... -: Setting up file (1:5.35-4) ... -: Setting up bzip2 (1.0.6-9.1) ... -: Setting up xz-utils (5.2.4-1) ... -: update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode -: Setting up libmpdec2:amd64 (2.4.2-2) ... -: Setting up readline-common (7.0-5) ... -: Setting up libreadline7:amd64 (7.0-5) ... -: Setting up libpython3.7-stdlib:amd64 (3.7.3-2) ... -: Setting up libpython3-stdlib:amd64 (3.7.3-1) ... -: Setting up python3.7 (3.7.3-2) ... -: Setting up python3 (3.7.3-1) ... -: running python rtupdate hooks for python3.7... -: running python post-rtupdate hooks for python3.7... -: Processing triggers for libc-bin (2.28-10) ... - -Je peux donc enfin exécuter du code python dans mon environnement -docker. +# #+RESULTS: +# : img1.png PNG 378x266 378x266+0+0 8-bit sRGB 7.02KB 0.000u 0:00.000 +# : img1_orig.png PNG 378x266 378x266+0+0 8-bit sRGB 7.11KB 0.000u 0:00.000 -#+begin_src shell :session *docker* :results output :exports both -ls -l /usr/bin/X11//python3 -python3 --version -#+end_src +# Argh, ça commence mal Et bien, dans le doute, -#+RESULTS: -: ls -l /usr/bin/X11//python3 -: python3.7 -: python3 --version -: Python 3.7.3 +# #+begin_src shell :session *shell* :results output :exports both +# convert img1.png -crop 386x266+0+0 img1.png +# convert img1_orig.png -crop 386x266+0+0 img1_orig.png +# #+end_src -Au passage, on peut vérifier que ce n'est pas le même que celui qui est -sur ma machine: +# #+RESULTS: +# Et maintenant, comparons: #+begin_src shell :session *shell* :results output :exports both -python3 --version -#+end_src - -#+RESULTS: -: Python 3.7.2rc1 -*** Installer tous les paquets dont on a besoin -Bien, j'ai python3 mais ça ne suffira pas pour exécuter mon notebook. Il me -faudra aussi bien sûr =jupyter= et différents paquets comme =matplotlib=, -=pandas=, =numpy=, =statsmodels=... Courage, allons-y! - -#+begin_src shell :session *docker* :results output :exports both -apt-get install -y jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels +compare img1.png img1_nbconvert.png diff.png #+end_src #+RESULTS: -#+BEGIN_EXAMPLE -apt-get install -y jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels -0 upgraded, 247 newly installed, 0 to remove and 0 not upgraded. -Need to get 204 MB of archives. -After this operation, 742 MB of additional disk space will be used. -#+END_EXAMPLE - -Misère. Donc, 800Mb plus tard... :) - -Je peux alors lancer python qui importe matplotlib. -#+begin_src shell :session *docker* :results output :exports both -python3 -c "import matplotlib" -#+end_src -#+RESULTS: +[[file:moocrr_notebook/diff.png][file:moocrr_notebook/diff.png]] -Alors que la même chose avec un paquet non existant me renvoie un -message d'erreur: +L'image d'origine est en gris pale et les différences sont indiquées +en rouge. Il y a bien une légère différence entre ces deux images même +si c'est à peine perceptible. Les points et un des axes ne sont pas +exactement au même endroit. Il y a donc des différences mais elles ne +sont pas significatives et il est assez difficile de mettre en place +un test pour les ignorer. Je vais donc abandonner cette piste pour +l'instant. +*** Automatisation de la comparaison +Le plus simple, dans ce cas présent, me semble donc être de conserver +plusieurs sorties "acceptables" et de s'y comparer. #+begin_src shell :session *shell* :results output :exports both -python3 -c "import gnuplot365" -#+end_src - -#+RESULTS: -: Traceback (most recent call last): -: ", line 1, in -: ModuleNotFoundError: No module named 'gnuplot365' - -Bon, tout a l'air de très bien marcher. Tiens à tout hasard, si je -cherche python via =docker run=, qu'est-ce que j'obtiens ? - +mkdir -p correct_output/ +cp notebook.ipynb correct_output/notebook_orig.ipynb +cp notebook.nbconvert.ipynb correct_output/notebook_844815ed865e.ipynb +chmod a-w correct_output/*.ipynb +ls -l correct_output/ +#+end_src + +#+RESULTS: +: total 88 +: -r--r--r-- 1 alegrand alegrand 41436 Aug 20 11:12 notebook_844815ed865e.ipynb +: -r--r--r-- 1 alegrand alegrand 41019 Aug 20 11:12 notebook_orig.ipynb + +Dans le répertoire =correct_output/=, j'ai donc déposé deux notebooks +exécutés, l'un qui est celui d'origine et dont je ne connais pas +l'environnement d'exécution, et l'autre qui a été exécuté dans un +conteneur =jupyter/scipy-notebook= dont l'identifiant est +=844815ed865e=. Pour éviter de les altérer accidentellement, j'ai enlevé +les droits d'écriture à quiconque mais il faudra bien évidemment les +mettre dans un git. + +Je rassemble les commandes précédentes dans [[file:moocrr_notebook/notebook_test.sh][ce script]] que je +structure avec une petite fonction: +#+begin_src shell :results output :exports both :tangle moocrr_notebook/notebook_test.sh +jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.nbconvert.ipynb + +compare_notebooks() { + OLD=$1 + NEW=$2 + mkdir -p `dirname sed/$1` + mkdir -p `dirname sed/$2` + echo "======= Comparing to $OLD =======" + sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" $1 > sed/$1 + sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" $2 > sed/$2 + # Test #1 (--ignore-matching-lines="image/png" ) + diff -w --ignore-matching-lines="nbformat_minor" \ + --ignore-matching-lines="hidePrompt" \ + --ignore-matching-lines="scrolled" \ + --ignore-matching-lines="No. Iterations:" \ + --ignore-matching-lines="Covariance Type:" \ + sed/$1 sed/$2 # | sed 's/^/>/' + CMP_RES=$? + echo "======= End of Comparison =======" + rm sed/$1 sed/$2 + return $CMP_RES +} + +compare_notebooks correct_output/notebook_orig.ipynb notebook.nbconvert.ipynb +CMP1=$? +compare_notebooks correct_output/notebook_844815ed865e.ipynb notebook.nbconvert.ipynb +CMP2=$? + +if [ $CMP1 -eq "0" -o $CMP2 -eq "0" ] ; then + echo "Test succeeded"; + return 0; +else + echo "Test failed"; + return 1; +fi +#+end_src + +#+RESULTS: +*** Utilisation du test dans différents environnements +**** =scipy-notebook= +Je peux alors utiliser ce script pour exécuter mon notebook (dans un +conteneur) et comparer le résultat aux deux sorties considérées comme +correctes. Normalement, je devrais obtenir un succès. #+begin_src shell :session *shell* :results output :exports both -docker run debian:stable ls -l /usr/bin/X11//python3 +docker run --volume=`pwd`:/home/jovyan/ jupyter/scipy-notebook \ + sh notebook_test.sh #+end_src #+RESULTS: -: ls: cannot access '/usr/bin/X11//python3': No such file or directory - -Gloups. À ce stade j'ai donc un environnement docker qui est toujours -en train de s'exécuter et dans lequel python3 est bien installé mais -ça n'est pas accessible en dehors. En fait, dès que je fermerai le -terminal où se trouve mon docker interactif, je risque de perdre tout -ce que je viens d'installer. -*** Gérer ses conteneurs et figer un environnement -Il est temps que je vous montre comment manipuler ces conteneur. Tout -d'abord, la commande =docker ps= me permet de savoir quels sont les -conteneurs en cours d'exécution (il n'y en a qu'un pour l'instant mais -je pourrais en avoir plusieurs): -#+begin_src shell :session *shell* :results output :exports both -docker ps -#+end_src +#+begin_example -#+RESULTS: -: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -: dca997abf7cc debian:stable "bash" 35 minutes ago Up 35 minutes debian +[NbConvertApp] Converting notebook notebook.ipynb to notebook +[NbConvertApp] Executing notebook with kernel: python3 +[NbConvertApp] Writing 41309 bytes to notebook.nbconvert.ipynb +======= Comparing to correct_output/notebook_orig.ipynb ======= +456c456 +< "image/png": "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\n", +--- +> "image/png": "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\n", +506a507,515 +> "name": "stderr", +> "output_type": "stream", +> "text": [ +> "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", +> "Use an instance of a link class instead.\n", +> " \n" +> ] +> }, +> { +533c542,545 +< " No. Iterations: 4 Covariance Type: nonrobust\n", +--- +> " No. Iterations: 4 \n", +> "\n", +> "\n", +> " Covariance Type: nonrobust \n", +613c626 +< "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGyFJREFUeJzt3X2UVPWd5/H3pxuQBhEjkhkFDWSWtHF9ABRQWZ3WqGhORLPrE2vGMRNCdmeMk83Knng2E43Rc2YHd2I26zgy6jgxiUo8iiSHCahjT2Y8PoCCILAIY4g2JEGND7Q2Snd/9497u6kuqunqpvqhfnxe5/Tpurd+de/3V7fvp27fuvUrRQRmZpaumsEuwMzM+peD3swscQ56M7PEOejNzBLnoDczS5yD3swscT0GvaR7Je2U9HI390vS/5G0VdI6SdMrX6aZmfVVOUf09wEX7Of+C4Ep+c8C4M4DL8vMzCqlx6CPiF8Av9tPk4uBH0TmWeBwSUdVqkAzMzswwyqwjAnA6wXTTfm8Xxc3lLSA7KifkSNHnnLsscdWYPVDU3t7OzU16b4FknL/Uu4buH/V7pVXXnkzIsb35jGVCHqVmFdyXIWIWAwsBqivr4/NmzdXYPVDU2NjIw0NDYNdRr9JuX8p9w3cv2on6Ve9fUwlXvaagGMKpicCOyqwXDMzq4BKBP0y4Or86pvTgHcjYp/TNmZmNjh6PHUj6QGgAThSUhNwIzAcICL+FlgOfBbYCnwAfLG/ijUzs97rMegjYl4P9wfwZxWryMyqwp49e2hqamL37t2DXUoXY8eOZdOmTYNdxgEbOXIkEydOZPjw4Qe8rEq8GWtmB6GmpibGjBnDpEmTkEpdkzE4du3axZgxYwa7jAMSEbz11ls0NTUxefLkA15eutcgmVm/2r17N+PGjRtSIZ8KSYwbN65i/y056M2szxzy/aeSz62D3swscT5Hb2ZVq7a2lhNPPLFzeunSpYwbN24QKxqaHPRmVrXq6upYu3Ztl3m7du3qvN3a2sqwYY45n7oxs6T86Ec/4rLLLuOiiy7i/PPPB2DRokXMmDGDk046iRtvvLGz7a233kp9fT3nnnsu8+bN47bbbgOgoaGB1atXA/Dmm28yadIkANra2li4cGHnsu666y5g77ALl156KccddxxXXXUV2ZXnsGrVKs444wxOPvlkZs6cya5duzjzzDO7vEDNnj2bdevW9dtz4pc6Mztg3/7pBjbueK+iyzz+6MO48aJ/v982LS0tTJ06FYDJkyfz6KOPAvDMM8+wbt06jjjiCFauXMmWLVt4/vnniQjmzp3LL37xC0aPHs2DDz7ImjVraG1tZfr06Zxyyin7Xd8999zD2LFjWbVqFR9++CGzZ8/ufDFZs2YNGzZs4Oijj2b27Nk8/fTTzJw5kyuuuIKHHnqIGTNm8N5771FXV8f8+fO57777uP3223nllVf48MMPOemkkyrwrJXmoDezqlXq1A3AeeedxxFHHAHAypUrWblyJdOmTQOgubmZLVu2sGvXLj7/+c8zatQoAObOndvj+lauXMm6det4+OGHAXj33XfZsmULI0aMYObMmUycOBGAqVOnsm3bNsaOHctRRx3FjBkzADjssMMAuOyyy/jOd77DokWLuPfee7nmmmsO7InogYPezA5YT0feA2306NGdtyOCG264ga985Std2tx+++3dXsI4bNgw2tvbAbpcyx4RfP/732fOnDld2jc2NnLIIYd0TtfW1tLa2kpElFzHqFGjOO+883jsscdYsmRJ52mi/uJz9GaWtDlz5nDvvffS3NwMwPbt29m5cydnnXUWjz76KC0tLezatYuf/vSnnY+ZNGkSL7zwAkDn0XvHsu6880727NkDwCuvvML777/f7bqPO+44duzYwapVq4DsjeLW1lYA5s+fz3XXXceMGTM6//voLz6iN7OknX/++WzatInTTz8dgEMPPZQf/vCHTJ8+nSuuuIKpU6fyiU98gjPPPLPzMddffz2XX345999/P+ecc07n/Pnz57Nt2zamT59ORDB+/HiWLl3a7bpHjBjBQw89xFe/+lVaWlqoq6vjiSee4NBDD+WUU07hsMMO44tfHIBxICNiUH4+9alPRcqeeuqpwS6hX6Xcv5T7FlG5/m3cuLEiy6m09957r0+Pu/HGG2PRokUVrqZ727dvjylTpkRbW1u3bUo9x8Dq6GXe+tSNmdkA+8EPfsCsWbO49dZbB+RrD33qxswMuOmmmwZsXVdffTVXX331gK3PR/Rm1mcRJb8e2iqgks+tg97M+mTkyJG89dZbDvt+EPl49CNHjqzI8nzqxsz6ZOLEiTQ1NfHGG28Mdild7N69u2IBOZg6vmGqEhz0ZtYnw4cP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\n", +--- +> "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAay0lEQVR4nO3dfZRU9Z3n8fenGwgNIoxIMgoayBzSrhsVMYDK6PYYBc2JT7tRJM6YuMMSd2Iy2T1ho+dkVjPRc3YO7hwzGSOyhnGMGR/GVdQcJqBuOs64PqABQSQ8rCHSkAQxo9DaKN393T/u7aa6upuuLqof6ufndU6frnvrd299v1Vdn7p969YtRQRmZpaumqEuwMzMBpaD3swscQ56M7PEOejNzBLnoDczS5yD3swscX0GvaQVkvZIerWX6yXpbyRtl7RB0szKl2lmZuUqZYv+HuDCw1x/ETA9/1kM3HnkZZmZWaX0GfQR8Qzwu8MMuRS4NzLPAxMkHVepAs3M7MiMqMA6JgM7C6ab8nm/Lh4oaTHZVj+jR48+48QTT6zAzQ9P7e3t1NSk+xaI+6teKfcG6fe3devWvRExqT/LVCLo1cO8Hs+rEBHLgeUA9fX1sWXLlgrc/PDU2NhIQ0PDUJcxYNxf9Uq5N0i/P0m/6u8ylXjZawJOKJieAuyuwHrNzKwCKhH0jwPX5EffnAm8ExHddtuYmdnQ6HPXjaT7gQbgWElNwE3ASICIWAasAj4LbAfeA64dqGLNzKz/+gz6iFjYx/UBfKViFZlZVTh48CBNTU0cOHBgqEvpYvz48WzevHmoyzhio0ePZsqUKYwcOfKI11WJN2PN7EOoqamJcePGMXXqVKSejskYGvv372fcuHFDXcYRiQjeeustmpqamDZt2hGvL91jkMxsQB04cICJEycOq5BPhSQmTpxYsf+WHPRmVjaH/MCp5H3roDczS5z30ZtZ1aqtreWUU07pnF65ciUTJ04cwoqGJwe9mVWturo61q9f32Xe/v37Oy+3trYyYoRjzrtuzCwpP/rRj7jiiiu4+OKLmTdvHgBLly5l1qxZnHrqqdx0002dY2+99Vbq6+s5//zzWbhwIbfddhsADQ0NvPTSSwDs3buXqVOnAtDW1saSJUs613XXXXcBh0678PnPf56TTjqJq6++muzIc1i7di1nn302p512GrNnz2b//v2cc845XV6g5s6dy4YNGwbsPvFLnZkdsW8/sYnXdu+r6DpPPv5obrr43x52TEtLCzNmzABg2rRpPProowA899xzbNiwgWOOOYY1a9awbds2XnzxRSKCSy65hGeeeYaxY8fywAMPsG7dOlpbW5k5cyZnnHHGYW/vBz/4AePHj2ft2rW8//77zJ07t/PFZN26dWzatInjjz+euXPn8uyzzzJ79mwWLFjAgw8+yKxZs9i3bx91dXUsWrSIe+65h9tvv52tW7fy/vvvc+qpp1bgXuuZg97MqlZPu24ALrjgAo455hgA1qxZw5o1azj99NMBaG5uZtu2bezfv5/LL7+cMWPGAHDJJZf0eXtr1qxhw4YNPPzwwwC88847bNu2jVGjRjF79mymTJkCwIwZM9ixYwfjx4/nuOOOY9asWQAcffTRAFxxxRV85zvfYenSpaxYsYIvfelLR3ZH9MFBb2ZHrK8t78E2duzYzssRwY033siXv/zlLmNuv/32Xg9hHDFiBO3t7QBdjmWPCL73ve8xf/78LuMbGxv5yEc+0jldW1tLa2srEdHjbYwZM4YLLriAxx57jIceeqhzN9FA8T56M0va/PnzWbFiBc3NzQDs2rWLPXv2cO655/Loo4/S0tLC/v37eeKJJzqXmTp1Ki+//DJA59Z7x7ruvPNODh48CMDWrVt59913e73tk046id27d7N27Voge6O4tbUVgEWLFvG1r32NWbNmdf73MVC8RW9mSZs3bx6bN2/mrLPOAuCoo47ivvvuY+bMmSxYsIAZM2bw8Y9/nHPOOadzmW984xtceeWV/PCHP+S8887rnL9o0SJ27NjBzJkziQgmTZrEypUre73tUaNG8eCDD/LVr36VlpYW6urqeOqppzjqqKM444wzOProo7n22kE4D2REDMnPJz/5yUjZT3/606EuYUC5v+pVqd5ee+21iqyn0vbt21fWcjfddFMsXbq0wtX0bteuXTF9+vRoa2vrdUxP9zHwUvQzb73rxsxskN17773MmTOHW2+9dVC+9tC7bszMgJtvvnnQbuuaa67hmmuuGbTb8xa9mZUtosevh7YKqOR966A3s7KMHj2at956y2E/ACI/H/3o0aMrsj7vujGzskyZMoWmpibefPPNoS6liwMHDlQsIIdSxzdMVYKD3szKMnLkyIp8+1Gl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\n", +======= End of Comparison ======= +======= Comparing to correct_output/notebook_844815ed865e.ipynb ======= +======= End of Comparison ======= +Test succeeded +#+end_example + +Parfait! +**** =alegrand38/moocrr_debian_stable_jupyter:1.0= +Et maintenant, à tout hasard, je vais essayer ce script avec +un des environnements que j'ai construit précédemment à partir d'une +=debian/stable=. -Mon conteneur est donc identifié par ce =CONTAINER_ID= et il -s'exécute depuis une demi-heure. Il a été modifié depuis qu'il a -commencé et je peux demander à docker ce qui a changé (attention, -c'est long alors je coupe pour ne montrer que le début): #+begin_src shell :session *shell* :results output :exports both -docker diff dca997abf7cc | head -n 60 -#+end_src - -#+RESULTS: -#+begin_example -C /bin -A /bin/bunzip2 -A /bin/bzcat -A /bin/bzcmp -A /bin/bzdiff -A /bin/bzegrep -A /bin/bzexe -A /bin/bzfgrep -A /bin/bzgrep -A /bin/bzip2 -A /bin/bzip2recover -A /bin/bzless -A /bin/bzmore -A /bin/fuser -A /bin/kill -A /bin/ps -C /etc -C /etc/.pwd.lock -D /etc/X11 -A /etc/X11/Xreset -A /etc/X11/Xreset.d -A /etc/X11/Xreset.d/README -A /etc/X11/Xresources -A /etc/X11/Xresources/x11-common -A /etc/X11/Xsession -A /etc/X11/Xsession.d -A /etc/X11/Xsession.d/20x11-common_process-args -A /etc/X11/Xsession.d/30x11-common_xresources -A /etc/X11/Xsession.d/35x11-common_xhost-local -A /etc/X11/Xsession.d/40x11-common_xsessionrc -A /etc/X11/Xsession.d/50x11-common_determine-startup -A /etc/X11/Xsession.d/90gpg-agent -A /etc/X11/Xsession.d/90x11-common_ssh-agent -A /etc/X11/Xsession.d/99x11-common_start -A /etc/X11/Xsession.options -A /etc/X11/rgb.txt -C /etc/alternatives -A /etc/alternatives/c++ -A /etc/alternatives/c89 -A /etc/alternatives/c89.1.gz -A /etc/alternatives/c99 -A /etc/alternatives/c99.1.gz -A /etc/alternatives/cc -A /etc/alternatives/cpp -A /etc/alternatives/faked.1.gz -A /etc/alternatives/faked.es.1.gz -A /etc/alternatives/faked.fr.1.gz -A /etc/alternatives/faked.sv.1.gz -A /etc/alternatives/fakeroot -A /etc/alternatives/fakeroot.1.gz -A /etc/alternatives/fakeroot.es.1.gz -A /etc/alternatives/fakeroot.fr.1.gz -A /etc/alternatives/fakeroot.sv.1.gz -A /etc/alternatives/jsonschema -A /etc/alternatives/libblas.so.3-x86_64-linux-gnu -A /etc/alternatives/liblapack.so.3-x86_64-linux-gnu -A /etc/alternatives/lzcat -A /etc/alternatives/lzcat.1.gz -A /etc/alternatives/lzcmp -A /etc/alternatives/lzcmp.1.gz -#+end_example - -Je vais sauvegarder cet environnement avec la commande =docker commit=. -#+begin_src shell :session *shell* :results output :exports both -docker commit debian debian_stable_jupyter -#+end_src - -#+RESULTS: -: sha256:2b001b2c02a66a7bf2ab2e7e3d234f3611bc7e6228e2f423ceb7d294cb6bd442 - -Et voilà! Mon nouvel environnement est maintenant figé et visible sur -ma machine: -#+begin_src shell :session *shell* :results output :exports both -docker image ls -#+end_src - -#+RESULTS: -#+begin_example -REPOSITORY TAG IMAGE ID CREATED SIZE -debian_stable_jupyter latest 2b001b2c02a6 About a minute ago 962MB -simgrid-website latest 0f3727380ab6 13 days ago 1.19GB -debian stable 40e13c3c9aab 13 days ago 114MB -#+end_example - -#+begin_src shell :session *shell* :results output :exports both -docker run debian_stable_jupyter ls -l /usr/bin/X11//python3 -#+end_src - -#+RESULTS: -: -: python3.7 - -Je peux donc maintenant arrêter mon conteneur: -#+begin_src shell :session *shell* :results output :exports both -docker stop debian -#+end_src - -#+RESULTS: -: exit -: debian - -Je peux alors vérifier que mon conteneur est arrêté. -#+begin_src shell :results output :exports both -docker ps -#+end_src - -#+RESULTS: -: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - -*** Exécuter notre notebook dans ce nouvel environnemnt -Le conteneur ayant son propre système de fichier, il va falloir -trouver un moyen d'y importer notre notebook. Le plus simple consiste -à monter notre répertoire courant dans le =/tmp= du conteneur. - -#+begin_src shell :session *shell* :results output :exports both -echo "-- Sans partage" -docker run debian_stable_jupyter ls /tmp -echo "-- Avec partage" -docker run --volume=`pwd`:/tmp debian_stable_jupyter ls /tmp -#+end_src - -#+RESULTS: -: -- Sans partage -: ]0;alegrand@icarus: /home/alegrand/Work/Documents/Enseignements/RR_MOOC/gitlab-inria/mooc-rr-ressources/module4/ressources/mooc_dockericarus:~/Work/Documents/Enseignements/RR_MOOC/gitlab-inria/mooc-rr-ressources/module4/ressources/mooc_docker$ -- Avec partage -: notebook.html -: notebook.ipynb -: notebook_rerun.html -: notebook_rerun.ipynb -: shuttle.csv - -#+begin_src shell :session *shell* :results output :exports both -cp notebook.ipynb notebook_docker.ipynb -docker run --volume=`pwd`:/tmp debian_stable_jupyter jupyter-nbconvert --to notebook --execute /tmp/notebook_docker.ipynb --output /tmp/notebook_docker.ipynb -docker run --volume=`pwd`:/tmp debian_stable_jupyter jupyter-nbconvert --to html /tmp/notebook_docker.ipynb -#+end_src - -#+RESULTS: -: -: [NbConvertApp] Converting notebook /tmp/notebook_docker.ipynb to notebook -: [NbConvertApp] Executing notebook with kernel: python3 -: [NbConvertApp] Writing 41346 bytes to /tmp/notebook_docker.ipynb -: [NbConvertApp] Converting notebook /tmp/notebook_docker.ipynb to html -: [NbConvertApp] Writing 317710 bytes to /tmp/notebook_docker.html - -#+begin_src shell :session *shell* :results output :exports both -ls -l -#+end_src - -#+RESULTS: -: total 1056 -: -rw-r--r-- 1 alegrand alegrand 305302 Jul 23 09:20 notebook.html -: -rw-r--r-- 1 alegrand alegrand 41019 Jul 23 09:19 notebook.ipynb -: -rw-r--r-- 1 root root 317832 Jul 23 10:10 notebook_docker.html -: -rw-r--r-- 1 alegrand alegrand 41473 Jul 23 10:10 notebook_docker.ipynb -: -rw-r--r-- 1 alegrand alegrand 305805 Jul 23 09:21 notebook_rerun.html -: -rw-r--r-- 1 alegrand alegrand 41473 Jul 23 09:21 notebook_rerun.ipynb -: -rw-r--r-- 1 alegrand alegrand 485 Jul 23 09:19 shuttle.csv - -Une fois de plus le résultat semble différent (pas la même -taille). Regardons les différences entre ce qui a été exécuté dans mon -environnement de base et dans mon conteneur. -#+begin_src shell :session *shell* :results output :exports both -diff notebook_rerun.ipynb notebook_docker.ipynb # | sed 's/^/>/' +docker run --volume=`pwd`:/root/ alegrand38/moocrr_debian_stable_jupyter:1.0 \ + sh -c "cd /root; sh notebook_test.sh" #+end_src #+RESULTS: #+begin_example +[NbConvertApp] Converting notebook notebook.ipynb to notebook +[NbConvertApp] Executing notebook with kernel: python3 +[NbConvertApp] Writing 41346 bytes to notebook.nbconvert.ipynb +======= Comparing to correct_output/notebook_orig.ipynb ======= 456c456 -< "image/png": "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\n", +< "image/png": "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\n", --- > "image/png": "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\n", -538c538 -< " Time: 09:21:16 Pearson chi2: 0.236 \n", +506a507,514 +> "name": "stderr", +> "output_type": "stream", +> "text": [ +> "/usr/lib/python3/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", +> " from pandas.core import datetools\n" +> ] +> }, +> { +521c529 +< " Link Function: logit Scale: 1.0000 \n", --- -> " Time: 08:10:00 Pearson chi2: 0.236 \n", -567c567 -< "Time: 09:21:16 Pearson chi2: 0.236\n", +> " Link Function: logit Scale: 1.0 \n", +524c532 +< " Method: IRLS Log-Likelihood: -2.5250 \n", --- -> "Time: 08:10:00 Pearson chi2: 0.236\n", -621c621 -< "image/png": "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\n", +> " Method: IRLS Log-Likelihood: -3.6370\n", +527c535 +< " Deviance 0.22231 \n", +--- +> " Deviance 3.3763\n", +556,558c564,566 +< "Link Function: logit Scale: 1.0000\n", +< "Method: IRLS Log-Likelihood: -2.5250\n", +< "Deviance 0.22231\n", +--- +> "Link Function: logit Scale: 1.0\n", +> "Method: IRLS Log-Likelihood: -3.6370\n", +> "Deviance 3.3763\n", +613c621 +< "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGyFJREFUeJzt3X2UVPWd5/H3pxuQBhEjkhkFDWSWtHF9ABRQWZ3WqGhORLPrE2vGMRNCdmeMk83Knng2E43Rc2YHd2I26zgy6jgxiUo8iiSHCahjT2Y8PoCCILAIY4g2JEGND7Q2Snd/9497u6kuqunqpvqhfnxe5/Tpurd+de/3V7fvp27fuvUrRQRmZpaumsEuwMzM+peD3swscQ56M7PEOejNzBLnoDczS5yD3swscT0GvaR7Je2U9HI390vS/5G0VdI6SdMrX6aZmfVVOUf09wEX7Of+C4Ep+c8C4M4DL8vMzCqlx6CPiF8Av9tPk4uBH0TmWeBwSUdVqkAzMzswwyqwjAnA6wXTTfm8Xxc3lLSA7KifkSNHnnLsscdWYPVDU3t7OzU16b4FknL/Uu4buH/V7pVXXnkzIsb35jGVCHqVmFdyXIWIWAwsBqivr4/NmzdXYPVDU2NjIw0NDYNdRr9JuX8p9w3cv2on6Ve9fUwlXvaagGMKpicCOyqwXDMzq4BKBP0y4Or86pvTgHcjYp/TNmZmNjh6PHUj6QGgAThSUhNwIzAcICL+FlgOfBbYCnwAfLG/ijUzs97rMegjYl4P9wfwZxWryMyqwp49e2hqamL37t2DXUoXY8eOZdOmTYNdxgEbOXIkEydOZPjw4Qe8rEq8GWtmB6GmpibGjBnDpEmTkEpdkzE4du3axZgxYwa7jAMSEbz11ls0NTUxefLkA15eutcgmVm/2r17N+PGjRtSIZ8KSYwbN65i/y056M2szxzy/aeSz62D3swscT5Hb2ZVq7a2lhNPPLFzeunSpYwbN24QKxqaHPRmVrXq6upYu3Ztl3m7du3qvN3a2sqwYY45n7oxs6T86Ec/4rLLLuOiiy7i/PPPB2DRokXMmDGDk046iRtvvLGz7a233kp9fT3nnnsu8+bN47bbbgOgoaGB1atXA/Dmm28yadIkANra2li4cGHnsu666y5g77ALl156KccddxxXXXUV2ZXnsGrVKs444wxOPvlkZs6cya5duzjzzDO7vEDNnj2bdevW9dtz4pc6Mztg3/7pBjbueK+iyzz+6MO48aJ/v982LS0tTJ06FYDJkyfz6KOPAvDMM8+wbt06jjjiCFauXMmWLVt4/vnniQjmzp3LL37xC0aPHs2DDz7ImjVraG1tZfr06Zxyyin7Xd8999zD2LFjWbVqFR9++CGzZ8/ufDFZs2YNGzZs4Oijj2b27Nk8/fTTzJw5kyuuuIKHHnqIGTNm8N5771FXV8f8+fO57777uP3223nllVf48MMPOemkkyrwrJXmoDezqlXq1A3AeeedxxFHHAHAypUrWblyJdOmTQOgubmZLVu2sGvXLj7/+c8zatQoAObOndvj+lauXMm6det4+OGHAXj33XfZsmULI0aMYObMmUycOBGAqVOnsm3bNsaOHctRRx3FjBkzADjssMMAuOyyy/jOd77DokWLuPfee7nmmmsO7InogYPezA5YT0feA2306NGdtyOCG264ga985Std2tx+++3dXsI4bNgw2tvbAbpcyx4RfP/732fOnDld2jc2NnLIIYd0TtfW1tLa2kpElFzHqFGjOO+883jsscdYsmRJ52mi/uJz9GaWtDlz5nDvvffS3NwMwPbt29m5cydnnXUWjz76KC0tLezatYuf/vSnnY+ZNGkSL7zwAkDn0XvHsu6880727NkDwCuvvML777/f7bqPO+44duzYwapVq4DsjeLW1lYA5s+fz3XXXceMGTM6//voLz6iN7OknX/++WzatInTTz8dgEMPPZQf/vCHTJ8+nSuuuIKpU6fyiU98gjPPPLPzMddffz2XX345999/P+ecc07n/Pnz57Nt2zamT59ORDB+/HiWLl3a7bpHjBjBQw89xFe/+lVaWlqoq6vjiSee4NBDD+WUU07hsMMO44tfHIBxICNiUH4+9alPRcqeeuqpwS6hX6Xcv5T7FlG5/m3cuLEiy6m09957r0+Pu/HGG2PRokUVrqZ727dvjylTpkRbW1u3bUo9x8Dq6GXe+tSNmdkA+8EPfsCsWbO49dZbB+RrD33qxswMuOmmmwZsXVdffTVXX331gK3PR/Rm1mcRJb8e2iqgks+tg97M+mTkyJG89dZbDvt+EPl49CNHjqzI8nzqxsz6ZOLEiTQ1NfHGG28Mdild7N69u2IBOZg6vmGqEhz0ZtYnw4cP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\n", --- > "image/png": "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\n", +======= End of Comparison ======= +======= Comparing to correct_output/notebook_844815ed865e.ipynb ======= +456c456 +< "image/png": "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\n", +--- +> "image/png": "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\n", +510,512c510,511 +< "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", +< "Use an instance of a link class instead.\n", +< " \n" +--- +> "/usr/lib/python3/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", +> " from pandas.core import datetools\n" +530c529 +< " Link Function: logit Scale: 1.0000\n", +--- +> " Link Function: logit Scale: 1.0 \n", +533c532 +< " Method: IRLS Log-Likelihood: -2.5250\n", +--- +> " Method: IRLS Log-Likelihood: -3.6370\n", +536c535 +< " Deviance 0.22231\n", +--- +> " Deviance 3.3763\n", +542,545c541 +< " No. Iterations: 4 \n", +< "\n", +< "\n", +< " Covariance Type: nonrobust \n", +--- +> " No. Iterations: 5 \n", +568,570c564,566 +< "Link Function: logit Scale: 1.0000\n", +< "Method: IRLS Log-Likelihood: -2.5250\n", +< "Deviance 0.22231\n", +--- +> "Link Function: logit Scale: 1.0\n", +> "Method: IRLS Log-Likelihood: -3.6370\n", +> "Deviance 3.3763\n", +626c621 +< "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAay0lEQVR4nO3dfZRU9Z3n8fenGwgNIoxIMgoayBzSrhsVMYDK6PYYBc2JT7tRJM6YuMMSd2Iy2T1ho+dkVjPRc3YO7hwzGSOyhnGMGR/GVdQcJqBuOs64PqABQSQ8rCHSkAQxo9DaKN393T/u7aa6upuuLqof6ufndU6frnvrd299v1Vdn7p969YtRQRmZpaumqEuwMzMBpaD3swscQ56M7PEOejNzBLnoDczS5yD3swscX0GvaQVkvZIerWX6yXpbyRtl7RB0szKl2lmZuUqZYv+HuDCw1x/ETA9/1kM3HnkZZmZWaX0GfQR8Qzwu8MMuRS4NzLPAxMkHVepAs3M7MiMqMA6JgM7C6ab8nm/Lh4oaTHZVj+jR48+48QTT6zAzQ9P7e3t1NSk+xaI+6teKfcG6fe3devWvRExqT/LVCLo1cO8Hs+rEBHLgeUA9fX1sWXLlgrc/PDU2NhIQ0PDUJcxYNxf9Uq5N0i/P0m/6u8ylXjZawJOKJieAuyuwHrNzKwCKhH0jwPX5EffnAm8ExHddtuYmdnQ6HPXjaT7gQbgWElNwE3ASICIWAasAj4LbAfeA64dqGLNzKz/+gz6iFjYx/UBfKViFZlZVTh48CBNTU0cOHBgqEvpYvz48WzevHmoyzhio0ePZsqUKYwcOfKI11WJN2PN7EOoqamJcePGMXXqVKSejskYGvv372fcuHFDXcYRiQjeeustmpqamDZt2hGvL91jkMxsQB04cICJEycOq5BPhSQmTpxYsf+WHPRmVjaH/MCp5H3roDczS5z30ZtZ1aqtreWUU07pnF65ciUTJ04cwoqGJwe9mVWturo61q9f32Xe/v37Oy+3trYyYoRjzrtuzCwpP/rRj7jiiiu4+OKLmTdvHgBLly5l1qxZnHrqqdx0002dY2+99Vbq6+s5//zzWbhwIbfddhsADQ0NvPTSSwDs3buXqVOnAtDW1saSJUs613XXXXcBh0678PnPf56TTjqJq6++muzIc1i7di1nn302p512GrNnz2b//v2cc845XV6g5s6dy4YNGwbsPvFLnZkdsW8/sYnXdu+r6DpPPv5obrr43x52TEtLCzNmzABg2rRpPProowA899xzbNiwgWOOOYY1a9awbds2XnzxRSKCSy65hGeeeYaxY8fywAMPsG7dOlpbW5k5cyZnnHHGYW/vBz/4AePHj2ft2rW8//77zJ07t/PFZN26dWzatInjjz+euXPn8uyzzzJ79mwWLFjAgw8+yKxZs9i3bx91dXUsWrSIe+65h9tvv52tW7fy/vvvc+qpp1bgXuuZg97MqlZPu24ALrjgAo455hgA1qxZw5o1azj99NMBaG5uZtu2bezfv5/LL7+cMWPGAHDJJZf0eXtr1qxhw4YNPPzwwwC88847bNu2jVGjRjF79mymTJkCwIwZM9ixYwfjx4/nuOOOY9asWQAcffTRAFxxxRV85zvfYenSpaxYsYIvfelLR3ZH9MFBb2ZHrK8t78E2duzYzssRwY033siXv/zlLmNuv/32Xg9hHDFiBO3t7QBdjmWPCL73ve8xf/78LuMbGxv5yEc+0jldW1tLa2srEdHjbYwZM4YLLriAxx57jIceeqhzN9FA8T56M0va/PnzWbFiBc3NzQDs2rWLPXv2cO655/Loo4/S0tLC/v37eeKJJzqXmTp1Ki+//DJA59Z7x7ruvPNODh48CMDWrVt59913e73tk046id27d7N27Voge6O4tbUVgEWLFvG1r32NWbNmdf73MVC8RW9mSZs3bx6bN2/mrLPOAuCoo47ivvvuY+bMmSxYsIAZM2bw8Y9/nHPOOadzmW984xtceeWV/PCHP+S8887rnL9o0SJ27NjBzJkziQgmTZrEypUre73tUaNG8eCDD/LVr36VlpYW6urqeOqppzjqqKM444wzOProo7n22kE4D2REDMnPJz/5yUjZT3/606EuYUC5v+pVqd5ee+21iqyn0vbt21fWcjfddFMsXbq0wtX0bteuXTF9+vRoa2vrdUxP9zHwUvQzb73rxsxskN17773MmTOHW2+9dVC+9tC7bszMgJtvvnnQbuuaa67hmmuuGbTb8xa9mZUtosevh7YKqOR966A3s7KMHj2at956y2E/ACI/H/3o0aMrsj7vujGzskyZMoWmpibefPPNoS6liwMHDlQsIIdSxzdMVYKD3szKMnLkyIp8+1Gl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\n", +--- +> "image/png": "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\n", +======= End of Comparison ======= +Test failed #+end_example -Aaah, cette fois-ci, forcément, la date a changé mais ça a l'air moins -grave que tout à l'heure. Et si on regarde très attentivement on fini -par remarquer que quelques lettres ont changé dans l'encodage des -images. Elles sont donc a différentes mais pas sûr que ça soit visible -à l'oeil nu. - -*** Conclusion -Nous avons donc vu comment construire un environnement -manuellement. Ce n'est pas très compliqué mais il faut être -soigneux. Ici tout s'est passé sans encombre mais la première fois, -j'avais oublié d'installer le noyau jupyter python3 -(=python3-ipykernel=) au moment de la réexécution de -=notebook_docker.ipynb=, j'ai eu droit à un joli message d'erreur. Il -faut alors relancer le conteneur en interactif, réinstaller ce qui -manque, le figer de l'extérieur, etc. - -Mais pourquoi ne pas avoir téléchargé le notebook et les dans -l'environnement? Et bien parce que ce n'est pas propre et qu'ils y -seraient restés... Ce que je souhaite obtenir ici, c'est figer un -environnemnet logiciel avec les bonnes dépendances pour pouvoir -refaire mes calculs éventuellement sur de nouvelles données. C'est -pour cela que je partage le répertoire contenant mon notebook et mon -fichier csv. -*** Update :noexport: - -Renaming the image to =debian_stable_jupyter_alpha=. -#+begin_src shell :results output :exports both -docker tag debian_stable_jupyter debian_stable_jupyter_alpha -docker rmi debian_stable_jupyter -#+end_src - -#+begin_src shell :session *shell* :results output :exports both -docker run --volume=`pwd`:/tmp --name debian_mooc -t -i debian_stable_jupyter_alpha -#+end_src - -#+RESULTS: - -#+begin_src shell :session *shell* :results output :exports both -apt-get install -y python3-ipykernel -#+end_src - -#+begin_src shell :results output :exports both -docker ps -#+end_src - -#+RESULTS: -: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -: a2d6b6cd921c debian_stable_jupyter_alpha "bash" 4 minutes ago Up 4 minutes debian_mooc - -#+begin_src shell :results output :exports both -docker diff a2d6b6cd921c | head -n 60 -#+end_src - -#+RESULTS: -#+begin_example -C /root -D /root/.cache -A /root/.cache/matplotlib -A /root/.cache/matplotlib/fontlist-v300.json -A /root/.cache/matplotlib/tex.cache -D /root/.ipython -A /root/.ipython/extensions -A /root/.ipython/nbextensions -A /root/.ipython/profile_default -A /root/.ipython/profile_default/db -A /root/.ipython/profile_default/history.sqlite -A /root/.ipython/profile_default/log -A /root/.ipython/profile_default/pid -A /root/.ipython/profile_default/security -A /root/.ipython/profile_default/startup -A /root/.ipython/profile_default/startup/README -C /usr/lib/python3/dist-packages -C /usr/lib/python3/dist-packages/__pycache__ -A /usr/lib/python3/dist-packages/__pycache__/ipykernel_launcher.cpython-37.pyc -D /usr/lib/python3/dist-packages/ipykernel -A /usr/lib/python3/dist-packages/ipykernel/__init__.py -A /usr/lib/python3/dist-packages/ipykernel/__main__.py -A /usr/lib/python3/dist-packages/ipykernel/__pycache__ -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/__init__.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/__main__.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/_eventloop_macos.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/_version.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/codeutil.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/connect.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/datapub.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/displayhook.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/embed.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/eventloops.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/heartbeat.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/iostream.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/ipkernel.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/jsonutil.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/kernelapp.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/kernelbase.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/kernelspec.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/log.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/parentpoller.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/pickleutil.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/serialize.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/__pycache__/zmqshell.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/_eventloop_macos.py -A /usr/lib/python3/dist-packages/ipykernel/_version.py -A /usr/lib/python3/dist-packages/ipykernel/codeutil.py -A /usr/lib/python3/dist-packages/ipykernel/comm -A /usr/lib/python3/dist-packages/ipykernel/comm/__init__.py -A /usr/lib/python3/dist-packages/ipykernel/comm/__pycache__ -A /usr/lib/python3/dist-packages/ipykernel/comm/__pycache__/__init__.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/comm/__pycache__/comm.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/comm/__pycache__/manager.cpython-37.pyc -A /usr/lib/python3/dist-packages/ipykernel/comm/comm.py -A /usr/lib/python3/dist-packages/ipykernel/comm/manager.py -A /usr/lib/python3/dist-packages/ipykernel/connect.py -A /usr/lib/python3/dist-packages/ipykernel/datapub.py -A /usr/lib/python3/dist-packages/ipykernel/displayhook.py -A /usr/lib/python3/dist-packages/ipykernel/embed.py -#+end_example - -#+begin_src shell :results output :exports both -docker commit debian_mooc debian_stable_jupyter -#+end_src - -#+RESULTS: -: sha256:2b001b2c02a66a7bf2ab2e7e3d234f3611bc7e6228e2f423ceb7d294cb6bd442 - -** Automatiser la construction d'un environnement et le partager. -Vous remarquerez que dans tout ce qui a précédé, j'ai noté dans mon -journal de ce que j'ai effectué mais vous n'avez aucune garantie que -je n'ai rien oublié. De plus, si vous voulez refaire cet environnement -vous même, il vous faudra suivre ces instructions scrupuleusement en -espérant que rien n'aille de travers. - -Je vais donc maintenant introduire alors la notion de dockerfile qui -va réaliser la préparation de l'environnement automatiquement à l'aide -de la commande =docker build= puis je montrerais comment le rendre -public à l'aide de la commande =docker push=. Vous allez voir que c'est -bien plus simple que tout ce que je vous ai montré précedémment -puisque tout est caché! - -*** Automatiser la construction de son environnement -Je commence par créer un répertoire dans lequel sera stoqué un -=[[file:mooc_docker_image/Dockerfile][Dockerfile]]=. - -#+begin_src shell :results output :exports both -mkdir -p mooc_docker_image -#+end_src - -#+RESULTS: - -Et dont voici le contenu. Vous voyez qu'il part d'une image -=debian:stable=, la met à jour et installe les différents -#+begin_src shell :results output :exports both :tangle mooc_docker_image/Dockerfile -FROM debian:stable - -LABEL maintainer="Arnaud Legrand " - -RUN apt-get update \ - && apt-get install -y python3 \ - jupyter-nbconvert python3-ipykernel \ - python3-matplotlib python3-pandas python3-numpy python3-statsmodels -#+end_src - -#+begin_src shell :results output :exports both -docker build mooc_docker_image -#+end_src - -#+RESULTS: -#+begin_example -Sending build context to Docker daemon 2.048kB -Step 1/3 : FROM debian:stable - ---> 40e13c3c9aab -Step 2/3 : LABEL maintainer "Arnaud Legrand " - ---> Running in 8a9a34c45d09 - ---> 0ab85d4f10f5 -Removing intermediate container 8a9a34c45d09 -Step 3/3 : RUN apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels - ---> Running in e2a4b2e6b46b -Get:1 http://cdn-fastly.deb.debian.org/debian stable InRelease [118 kB] -Get:2 http://security-cdn.debian.org/debian-security stable/updates InRelease [39.1 kB] -Get:3 http://cdn-fastly.deb.debian.org/debian stable-updates InRelease [46.8 kB] -Get:4 http://security-cdn.debian.org/debian-security stable/updates/main amd64 Packages [49.4 kB] -Get:5 http://cdn-fastly.deb.debian.org/debian stable/main amd64 Packages [7897 kB] -Fetched 8150 kB in 9s (870 kB/s) -Reading package lists... -Reading package lists... -Building dependency tree... -Reading state information... -The following additional packages will be installed: - binutils binutils-common binutils-x86-64-linux-gnu blt build-essential bzip2 - ca-certificates cpp cpp-8 dbus dh-python dirmngr dpkg-dev fakeroot file - fontconfig-config fonts-lyx g++ g++-8 gcc gcc-8 gir1.2-glib-2.0 gnupg - gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf - gpgsm javascript-common krb5-locales libaec0 libalgorithm-diff-perl - libalgorithm-diff-xs-perl libalgorithm-merge-perl libamd2 libapparmor1 - libasan5 libassuan0 libatomic1 libbinutils libblas3 libblosc1 libbsd0 - libc-dev-bin libc6-dev libcamd2 libcc1-0 libccolamd2 libcholmod3 libcolamd2 - libdbus-1-3 libdpkg-perl libdsdp-5.8gf libexpat1 libexpat1-dev libfakeroot - libfftw3-double3 libfile-fcntllock-perl libfontconfig1 libfreetype6 - libgcc-8-dev libgdbm-compat4 libgdbm6 libgfortran5 libgirepository-1.0-1 - libglib2.0-0 libglib2.0-data libglpk40 libgomp1 libgpm2 libgsl23 - libgslcblas0 libgssapi-krb5-2 libhdf5-103 libicu63 libimagequant0 libisl19 - libitm1 libjbig0 libjpeg62-turbo libjs-jquery libjs-jquery-ui libk5crypto3 - libkeyutils1 libkrb5-3 libkrb5support0 libksba8 liblapack3 liblcms2-2 - libldap-2.4-2 libldap-common liblocale-gettext-perl liblsan0 libltdl7 - liblua5.1-0 liblzo2-2 libmagic-mgc libmagic1 libmetis5 libmpc3 libmpdec2 - libmpfr6 libmpx2 libncurses6 libnorm1 libnpth0 libperl5.28 libpgm-5.2-0 - libpng16-16 libprocps7 libpython3-dev libpython3-stdlib libpython3.7 - libpython3.7-dev libpython3.7-minimal libpython3.7-stdlib libquadmath0 - libreadline7 libsasl2-2 libsasl2-modules libsasl2-modules-db libsnappy1v5 - libsodium23 libsqlite3-0 libssl1.1 libstdc++-8-dev libsuitesparseconfig5 - libsz2 libtcl8.6 libtiff5 libtk8.6 libtsan0 libubsan1 libumfpack5 libwebp6 - libwebpdemux2 libwebpmux3 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 - libxext6 libxft2 libxml2 libxrender1 libxslt1.1 libxss1 libyaml-0-2 libzmq5 - linux-libc-dev lsb-base make manpages manpages-dev mime-support netbase - openssl pandoc pandoc-data patch perl perl-modules-5.28 pinentry-curses - procps psmisc python-matplotlib-data python-pip-whl python-tables-data - python3-asn1crypto python3-atomicwrites python3-attr python3-bleach - python3-bs4 python3-cffi-backend python3-chardet python3-crypto - python3-cryptography python3-cvxopt python3-cycler python3-dateutil - python3-dbus python3-decorator python3-defusedxml python3-dev - python3-distutils python3-entrypoints python3-gi python3-html5lib - python3-ipython python3-ipython-genutils python3-jinja2 python3-joblib - python3-jsonschema python3-jupyter-client python3-jupyter-core - python3-keyring python3-keyrings.alt python3-kiwisolver python3-lib2to3 - python3-lxml python3-markupsafe python3-minimal python3-mistune - python3-more-itertools python3-nbconvert python3-nbformat python3-numexpr - python3-olefile python3-pandas-lib python3-pandocfilters python3-patsy - python3-pexpect python3-pickleshare python3-pil python3-pip - python3-pkg-resources python3-pluggy python3-prompt-toolkit python3-psutil - python3-ptyprocess python3-py python3-pygments python3-pyparsing - python3-pytest python3-scipy python3-secretstorage python3-setuptools - python3-simplegeneric python3-simplejson python3-six python3-soupsieve - python3-statsmodels-lib python3-tables python3-tables-lib python3-testpath - python3-tk python3-tornado python3-traitlets python3-tz python3-wcwidth - python3-webencodings python3-wheel python3-xdg python3-zmq python3.7 - python3.7-dev python3.7-minimal readline-common sensible-utils - shared-mime-info tk8.6-blt2.5 ttf-bitstream-vera ucf x11-common - xdg-user-dirs xz-utils -Suggested packages: - binutils-doc blt-demo bzip2-doc cpp-doc gcc-8-locales - default-dbus-session-bus | dbus-session-bus dbus-user-session libpam-systemd - pinentry-gnome3 tor debian-keyring g++-multilib g++-8-multilib gcc-8-doc - libstdc++6-8-dbg gcc-multilib autoconf automake libtool flex bison gdb - gcc-doc gcc-8-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg - libasan5-dbg liblsan0-dbg libtsan0-dbg libubsan1-dbg libmpx2-dbg - libquadmath0-dbg parcimonie xloadimage scdaemon apache2 | lighttpd | httpd - glibc-doc git bzr libfftw3-bin libfftw3-dev gdbm-l10n libiodbc2-dev - default-libmysqlclient-dev gpm gsl-ref-psdoc | gsl-doc-pdf | gsl-doc-info - | gsl-ref-html krb5-doc krb5-user libjs-jquery-ui-docs liblcms2-utils - libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal - libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql - libstdc++-8-doc tcl8.6 tk8.6 make-doc man-browser texlive-latex-recommended - texlive-xetex texlive-luatex pandoc-citeproc texlive-latex-extra context - wkhtmltopdf librsvg2-bin groff ghc nodejs php python ruby r-base-core - libjs-mathjax node-katex ed diffutils-doc perl-doc libterm-readline-gnu-perl - | libterm-readline-perl-perl libb-debug-perl liblocale-codes-perl - pinentry-doc python3-doc python3-venv python-attr-doc python-bleach-doc - python-crypto-doc python-cryptography-doc python3-cryptography-vectors - python-cvxopt-doc python-cycler-doc python-dbus-doc python3-dbus-dbg - python3-genshi python-jinja2-doc python-jsonschema-doc gnome-keyring - libkf5wallet-bin gir1.2-gnomekeyring-1.0 python3-lxml-dbg python-lxml-doc - dvipng ffmpeg gir1.2-gtk-3.0 ghostscript inkscape ipython3 librsvg2-common - python-matplotlib-doc python3-cairocffi python3-gi-cairo python3-gobject - python3-nose python3-pyqt4 python3-sip texlive-extra-utils ttf-staypuft - python-nbconvert-doc gfortran python-numpy-doc python3-numpy-dbg - python-pandas-doc python-patsy-doc python-pexpect-doc python-pil-doc - python3-pil-dbg python-psutil-doc subversion python-pygments-doc - python-pyparsing-doc python-scipy-doc python-secretstorage-doc - python-setuptools-doc python-statsmodels-doc python-tables-doc - python3-netcdf4 vitables tix python3-tk-dbg python3-pycurl - python-tornado-doc python3-twisted python3.7-venv python3.7-doc - binfmt-support readline-doc -The following NEW packages will be installed: - binutils binutils-common binutils-x86-64-linux-gnu blt build-essential bzip2 - ca-certificates cpp cpp-8 dbus dh-python dirmngr dpkg-dev fakeroot file - fontconfig-config fonts-lyx g++ g++-8 gcc gcc-8 gir1.2-glib-2.0 gnupg - gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf - gpgsm javascript-common jupyter-nbconvert krb5-locales libaec0 - libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl - libamd2 libapparmor1 libasan5 libassuan0 libatomic1 libbinutils libblas3 - libblosc1 libbsd0 libc-dev-bin libc6-dev libcamd2 libcc1-0 libccolamd2 - libcholmod3 libcolamd2 libdbus-1-3 libdpkg-perl libdsdp-5.8gf libexpat1 - libexpat1-dev libfakeroot libfftw3-double3 libfile-fcntllock-perl - libfontconfig1 libfreetype6 libgcc-8-dev libgdbm-compat4 libgdbm6 - libgfortran5 libgirepository-1.0-1 libglib2.0-0 libglib2.0-data libglpk40 - libgomp1 libgpm2 libgsl23 libgslcblas0 libgssapi-krb5-2 libhdf5-103 libicu63 - libimagequant0 libisl19 libitm1 libjbig0 libjpeg62-turbo libjs-jquery - libjs-jquery-ui libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libksba8 - liblapack3 liblcms2-2 libldap-2.4-2 libldap-common liblocale-gettext-perl - liblsan0 libltdl7 liblua5.1-0 liblzo2-2 libmagic-mgc libmagic1 libmetis5 - libmpc3 libmpdec2 libmpfr6 libmpx2 libncurses6 libnorm1 libnpth0 libperl5.28 - libpgm-5.2-0 libpng16-16 libprocps7 libpython3-dev libpython3-stdlib - libpython3.7 libpython3.7-dev libpython3.7-minimal libpython3.7-stdlib - libquadmath0 libreadline7 libsasl2-2 libsasl2-modules libsasl2-modules-db - libsnappy1v5 libsodium23 libsqlite3-0 libssl1.1 libstdc++-8-dev - libsuitesparseconfig5 libsz2 libtcl8.6 libtiff5 libtk8.6 libtsan0 libubsan1 - libumfpack5 libwebp6 libwebpdemux2 libwebpmux3 libx11-6 libx11-data libxau6 - libxcb1 libxdmcp6 libxext6 libxft2 libxml2 libxrender1 libxslt1.1 libxss1 - libyaml-0-2 libzmq5 linux-libc-dev lsb-base make manpages manpages-dev - mime-support netbase openssl pandoc pandoc-data patch perl perl-modules-5.28 - pinentry-curses procps psmisc python-matplotlib-data python-pip-whl - python-tables-data python3 python3-asn1crypto python3-atomicwrites - python3-attr python3-bleach python3-bs4 python3-cffi-backend python3-chardet - python3-crypto python3-cryptography python3-cvxopt python3-cycler - python3-dateutil python3-dbus python3-decorator python3-defusedxml - python3-dev python3-distutils python3-entrypoints python3-gi - python3-html5lib python3-ipykernel python3-ipython python3-ipython-genutils - python3-jinja2 python3-joblib python3-jsonschema python3-jupyter-client - python3-jupyter-core python3-keyring python3-keyrings.alt python3-kiwisolver - python3-lib2to3 python3-lxml python3-markupsafe python3-matplotlib - python3-minimal python3-mistune python3-more-itertools python3-nbconvert - python3-nbformat python3-numexpr python3-numpy python3-olefile - python3-pandas python3-pandas-lib python3-pandocfilters python3-patsy - python3-pexpect python3-pickleshare python3-pil python3-pip - python3-pkg-resources python3-pluggy python3-prompt-toolkit python3-psutil - python3-ptyprocess python3-py python3-pygments python3-pyparsing - python3-pytest python3-scipy python3-secretstorage python3-setuptools - python3-simplegeneric python3-simplejson python3-six python3-soupsieve - python3-statsmodels python3-statsmodels-lib python3-tables - python3-tables-lib python3-testpath python3-tk python3-tornado - python3-traitlets python3-tz python3-wcwidth python3-webencodings - python3-wheel python3-xdg python3-zmq python3.7 python3.7-dev - python3.7-minimal readline-common sensible-utils shared-mime-info - tk8.6-blt2.5 ttf-bitstream-vera ucf x11-common xdg-user-dirs xz-utils -0 upgraded, 267 newly installed, 0 to remove and 0 not upgraded. -Need to get 212 MB of archives. -After this operation, 779 MB of additional disk space will be used. -Get:1 http://cdn-fastly.deb.debian.org/debian stable/main amd64 perl-modules-5.28 all 5.28.1-6 [2873 kB] -Get:2 http://security-cdn.debian.org/debian-security stable/updates/main amd64 linux-libc-dev amd64 4.19.37-5+deb10u1 [1185 kB] -Get:12 http://security-cdn.debian.org/debian-security stable/updates/main amd64 libzmq5 amd64 4.3.1-4+deb10u1 [246 kB] -Get:3 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgdbm6 amd64 1.18.1-4 [64.7 kB] -Get:4 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgdbm-compat4 amd64 1.18.1-4 [44.1 kB] -Get:5 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libperl5.28 amd64 5.28.1-6 [3883 kB] -Get:6 http://cdn-fastly.deb.debian.org/debian stable/main amd64 perl amd64 5.28.1-6 [204 kB] -Get:7 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblocale-gettext-perl amd64 1.07-3+b4 [18.9 kB] -Get:8 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libssl1.1 amd64 1.1.1c-1 [1535 kB] -Get:9 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7-minimal amd64 3.7.3-2 [588 kB] -Get:10 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libexpat1 amd64 2.2.6-2 [106 kB] -Get:11 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3.7-minimal amd64 3.7.3-2 [1736 kB] -Get:13 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-minimal amd64 3.7.3-1 [36.6 kB] -Get:14 http://cdn-fastly.deb.debian.org/debian stable/main amd64 mime-support all 3.62 [37.2 kB] -Get:15 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmpdec2 amd64 2.4.2-2 [87.2 kB] -Get:16 http://cdn-fastly.deb.debian.org/debian stable/main amd64 readline-common all 7.0-5 [70.6 kB] -Get:17 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libreadline7 amd64 7.0-5 [151 kB] -Get:18 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsqlite3-0 amd64 3.27.2-3 [641 kB] -Get:19 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7-stdlib amd64 3.7.3-2 [1732 kB] -Get:20 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3.7 amd64 3.7.3-2 [330 kB] -Get:21 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3-stdlib amd64 3.7.3-1 [20.0 kB] -Get:22 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3 amd64 3.7.3-1 [61.5 kB] -Get:23 http://cdn-fastly.deb.debian.org/debian stable/main amd64 netbase all 5.6 [19.4 kB] -Get:24 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libncurses6 amd64 6.1+20181013-2 [102 kB] -Get:25 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libprocps7 amd64 2:3.3.15-2 [61.7 kB] -Get:26 http://cdn-fastly.deb.debian.org/debian stable/main amd64 lsb-base all 10.2019051400 [28.4 kB] -Get:27 http://cdn-fastly.deb.debian.org/debian stable/main amd64 procps amd64 2:3.3.15-2 [259 kB] -Get:28 http://cdn-fastly.deb.debian.org/debian stable/main amd64 sensible-utils all 0.0.12 [15.8 kB] -Get:29 http://cdn-fastly.deb.debian.org/debian stable/main amd64 bzip2 amd64 1.0.6-9.1 [48.3 kB] -Get:30 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libapparmor1 amd64 2.13.2-10 [94.7 kB] -Get:31 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libdbus-1-3 amd64 1.12.16-1 [214 kB] -Get:32 http://cdn-fastly.deb.debian.org/debian stable/main amd64 dbus amd64 1.12.16-1 [235 kB] -Get:33 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmagic-mgc amd64 1:5.35-4 [242 kB] -Get:34 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmagic1 amd64 1:5.35-4 [117 kB] -Get:35 http://cdn-fastly.deb.debian.org/debian stable/main amd64 file amd64 1:5.35-4 [66.3 kB] -Get:36 http://cdn-fastly.deb.debian.org/debian stable/main amd64 krb5-locales all 1.17-3 [95.4 kB] -Get:37 http://cdn-fastly.deb.debian.org/debian stable/main amd64 manpages all 4.16-2 [1295 kB] -Get:38 http://cdn-fastly.deb.debian.org/debian stable/main amd64 ucf all 3.0038+nmu1 [69.0 kB] -Get:39 http://cdn-fastly.deb.debian.org/debian stable/main amd64 xz-utils amd64 5.2.4-1 [183 kB] -Get:40 http://cdn-fastly.deb.debian.org/debian stable/main amd64 binutils-common amd64 2.31.1-16 [2073 kB] -Get:41 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libbinutils amd64 2.31.1-16 [478 kB] -Get:42 http://cdn-fastly.deb.debian.org/debian stable/main amd64 binutils-x86-64-linux-gnu amd64 2.31.1-16 [1823 kB] -Get:43 http://cdn-fastly.deb.debian.org/debian stable/main amd64 binutils amd64 2.31.1-16 [56.8 kB] -Get:44 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libtcl8.6 amd64 8.6.9+dfsg-2 [1005 kB] -Get:45 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpng16-16 amd64 1.6.36-6 [292 kB] -Get:46 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libfreetype6 amd64 2.9.1-3 [379 kB] -Get:47 http://cdn-fastly.deb.debian.org/debian stable/main amd64 ttf-bitstream-vera all 1.10-8 [352 kB] -Get:48 http://cdn-fastly.deb.debian.org/debian stable/main amd64 fontconfig-config all 2.13.1-2 [280 kB] -Get:49 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libfontconfig1 amd64 2.13.1-2 [346 kB] -Get:50 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxau6 amd64 1:1.0.8-1+b2 [19.9 kB] -Get:51 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libbsd0 amd64 0.9.1-2 [99.5 kB] -Get:52 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxdmcp6 amd64 1:1.1.2-3 [26.3 kB] -Get:53 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxcb1 amd64 1.13.1-2 [137 kB] -Get:54 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libx11-data all 2:1.6.7-1 [298 kB] -Get:55 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libx11-6 amd64 2:1.6.7-1 [754 kB] -Get:56 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxext6 amd64 2:1.3.3-1+b2 [52.5 kB] -Get:57 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxrender1 amd64 1:0.9.10-1 [33.0 kB] -Get:58 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxft2 amd64 2.3.2-2 [57.2 kB] -Get:59 http://cdn-fastly.deb.debian.org/debian stable/main amd64 x11-common all 1:7.7+19 [251 kB] -Get:60 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxss1 amd64 1:1.2.3-1 [17.8 kB] -Get:61 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libtk8.6 amd64 8.6.9-2 [768 kB] -Get:62 http://cdn-fastly.deb.debian.org/debian stable/main amd64 tk8.6-blt2.5 amd64 2.5.3+dfsg-4 [587 kB] -Get:63 http://cdn-fastly.deb.debian.org/debian stable/main amd64 blt amd64 2.5.3+dfsg-4 [14.8 kB] -Get:64 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libc-dev-bin amd64 2.28-10 [275 kB] -Get:65 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libc6-dev amd64 2.28-10 [2691 kB] -Get:66 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libisl19 amd64 0.20-2 [587 kB] -Get:67 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmpfr6 amd64 4.0.2-1 [775 kB] -Get:68 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmpc3 amd64 1.1.0-1 [41.3 kB] -Get:69 http://cdn-fastly.deb.debian.org/debian stable/main amd64 cpp-8 amd64 8.3.0-6 [8914 kB] -Get:70 http://cdn-fastly.deb.debian.org/debian stable/main amd64 cpp amd64 4:8.3.0-1 [19.4 kB] -Get:71 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libcc1-0 amd64 8.3.0-6 [46.6 kB] -Get:72 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgomp1 amd64 8.3.0-6 [75.8 kB] -Get:73 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libitm1 amd64 8.3.0-6 [27.7 kB] -Get:74 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libatomic1 amd64 8.3.0-6 [9032 B] -Get:75 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libasan5 amd64 8.3.0-6 [362 kB] -Get:76 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblsan0 amd64 8.3.0-6 [131 kB] -Get:77 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libtsan0 amd64 8.3.0-6 [283 kB] -Get:78 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libubsan1 amd64 8.3.0-6 [120 kB] -Get:79 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmpx2 amd64 8.3.0-6 [11.4 kB] -Get:80 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libquadmath0 amd64 8.3.0-6 [133 kB] -Get:81 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgcc-8-dev amd64 8.3.0-6 [2298 kB] -Get:82 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gcc-8 amd64 8.3.0-6 [9452 kB] -Get:83 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gcc amd64 4:8.3.0-1 [5196 B] -Get:84 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libstdc++-8-dev amd64 8.3.0-6 [1532 kB] -Get:85 http://cdn-fastly.deb.debian.org/debian stable/main amd64 g++-8 amd64 8.3.0-6 [9752 kB] -Get:86 http://cdn-fastly.deb.debian.org/debian stable/main amd64 g++ amd64 4:8.3.0-1 [1644 B] -Get:87 http://cdn-fastly.deb.debian.org/debian stable/main amd64 make amd64 4.2.1-1.2 [341 kB] -Get:88 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libdpkg-perl all 1.19.7 [1414 kB] -Get:89 http://cdn-fastly.deb.debian.org/debian stable/main amd64 patch amd64 2.7.6-3 [126 kB] -Get:90 http://cdn-fastly.deb.debian.org/debian stable/main amd64 dpkg-dev all 1.19.7 [1773 kB] -Get:91 http://cdn-fastly.deb.debian.org/debian stable/main amd64 build-essential amd64 12.6 [7576 B] -Get:92 http://cdn-fastly.deb.debian.org/debian stable/main amd64 openssl amd64 1.1.1c-1 [842 kB] -Get:93 http://cdn-fastly.deb.debian.org/debian stable/main amd64 ca-certificates all 20190110 [157 kB] -Get:94 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-lib2to3 all 3.7.3-1 [76.7 kB] -Get:95 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-distutils all 3.7.3-1 [142 kB] -Get:96 http://cdn-fastly.deb.debian.org/debian stable/main amd64 dh-python all 3.20190308 [99.3 kB] -Get:97 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libassuan0 amd64 2.5.2-1 [49.4 kB] -Get:98 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpgconf amd64 2.2.12-1 [509 kB] -Get:99 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libksba8 amd64 1.3.5-2 [99.7 kB] -Get:100 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsasl2-modules-db amd64 2.1.27+dfsg-1 [69.0 kB] -Get:101 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsasl2-2 amd64 2.1.27+dfsg-1 [106 kB] -Get:102 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libldap-common all 2.4.47+dfsg-3 [89.4 kB] -Get:103 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libldap-2.4-2 amd64 2.4.47+dfsg-3 [224 kB] -Get:104 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libnpth0 amd64 1.6-1 [18.4 kB] -Get:105 http://cdn-fastly.deb.debian.org/debian stable/main amd64 dirmngr amd64 2.2.12-1 [711 kB] -Get:106 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libfakeroot amd64 1.23-1 [45.9 kB] -Get:107 http://cdn-fastly.deb.debian.org/debian stable/main amd64 fakeroot amd64 1.23-1 [85.8 kB] -Get:108 http://cdn-fastly.deb.debian.org/debian stable/main amd64 fonts-lyx all 2.3.2-1 [199 kB] -Get:109 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libglib2.0-0 amd64 2.58.3-2 [1259 kB] -Get:110 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgirepository-1.0-1 amd64 1.58.3-2 [92.8 kB] -Get:111 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gir1.2-glib-2.0 amd64 1.58.3-2 [143 kB] -Get:112 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gnupg-l10n all 2.2.12-1 [1008 kB] -Get:113 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gnupg-utils amd64 2.2.12-1 [857 kB] -Get:114 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpg amd64 2.2.12-1 [862 kB] -Get:115 http://cdn-fastly.deb.debian.org/debian stable/main amd64 pinentry-curses amd64 1.1.0-2 [64.5 kB] -Get:116 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpg-agent amd64 2.2.12-1 [617 kB] -Get:117 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpg-wks-client amd64 2.2.12-1 [484 kB] -Get:118 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpg-wks-server amd64 2.2.12-1 [477 kB] -Get:119 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gpgsm amd64 2.2.12-1 [602 kB] -Get:120 http://cdn-fastly.deb.debian.org/debian stable/main amd64 gnupg all 2.2.12-1 [715 kB] -Get:121 http://cdn-fastly.deb.debian.org/debian stable/main amd64 javascript-common all 11 [6120 B] -Get:122 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-entrypoints all 0.3-1 [5508 B] -Get:123 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-decorator all 4.3.0-1.1 [14.5 kB] -Get:124 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-ptyprocess all 0.6.0-1 [13.2 kB] -Get:125 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pexpect all 4.6.0-1 [52.4 kB] -Get:126 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pickleshare all 0.7.5-1 [7348 B] -Get:127 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pkg-resources all 40.8.0-1 [153 kB] -Get:128 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-six all 1.12.0-1 [15.7 kB] -Get:129 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-wcwidth all 0.1.7+dfsg1-3 [15.0 kB] -Get:130 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-prompt-toolkit all 1.0.15-1 [179 kB] -Get:131 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pygments all 2.3.1+dfsg-1 [594 kB] -Get:132 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-simplegeneric all 0.8.1-2 [11.1 kB] -Get:133 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-ipython-genutils all 0.2.0-1 [20.9 kB] -Get:134 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-traitlets all 4.3.2-1 [60.7 kB] -Get:135 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-ipython all 5.8.0-1 [390 kB] -Get:136 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-dateutil all 2.7.3-3 [64.5 kB] -Get:137 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-jupyter-core all 4.4.0-2 [38.5 kB] -Get:138 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-tornado amd64 5.1.1-4 [354 kB] -Get:139 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libkeyutils1 amd64 1.6-6 [15.0 kB] -Get:140 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libkrb5support0 amd64 1.17-3 [65.6 kB] -Get:141 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libk5crypto3 amd64 1.17-3 [121 kB] -Get:142 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libkrb5-3 amd64 1.17-3 [370 kB] -Get:143 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgssapi-krb5-2 amd64 1.17-3 [158 kB] -Get:144 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libnorm1 amd64 1.5.8+dfsg2-1 [287 kB] -Get:145 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpgm-5.2-0 amd64 5.2.122~dfsg-3 [158 kB] -Get:146 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsodium23 amd64 1.0.17-1 [158 kB] -Get:147 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-zmq amd64 17.1.2-2 [268 kB] -Get:148 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-jupyter-client all 5.2.3-1 [63.7 kB] -Get:149 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-testpath all 0.4.2+dfsg-1 [8796 B] -Get:150 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-webencodings all 0.5.1-1 [10.9 kB] -Get:151 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-html5lib all 1.0.1-1 [89.5 kB] -Get:152 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-bleach all 3.1.0-1 [113 kB] -Get:153 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-defusedxml all 0.5.0-2 [20.1 kB] -Get:154 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-markupsafe amd64 1.1.0-1 [14.8 kB] -Get:155 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-jinja2 all 2.10-2 [106 kB] -Get:156 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-mistune all 0.8.4-1 [16.1 kB] -Get:157 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-jsonschema all 2.6.0-4 [33.5 kB] -Get:158 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-nbformat all 4.4.0-1 [30.1 kB] -Get:159 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pandocfilters all 1.4.2-1 [18.7 kB] -Get:160 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-nbconvert all 5.4-2 [103 kB] -Get:161 http://cdn-fastly.deb.debian.org/debian stable/main amd64 jupyter-nbconvert all 5.4-2 [12.6 kB] -Get:162 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libaec0 amd64 1.0.2-1 [20.1 kB] -Get:163 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libalgorithm-diff-perl all 1.19.03-2 [47.9 kB] -Get:164 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libalgorithm-diff-xs-perl amd64 0.04-5+b1 [11.8 kB] -Get:165 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libalgorithm-merge-perl all 0.08-3 [12.7 kB] -Get:166 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsuitesparseconfig5 amd64 1:5.4.0+dfsg-1 [20.9 kB] -Get:167 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libamd2 amd64 1:5.4.0+dfsg-1 [33.4 kB] -Get:168 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgfortran5 amd64 8.3.0-6 [581 kB] -Get:169 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libblas3 amd64 3.8.0-2 [148 kB] -Get:170 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsnappy1v5 amd64 1.1.7-1 [17.0 kB] -Get:171 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libblosc1 amd64 1.15.1+ds1-1 [44.9 kB] -Get:172 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libcamd2 amd64 1:5.4.0+dfsg-1 [35.0 kB] -Get:173 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libccolamd2 amd64 1:5.4.0+dfsg-1 [36.4 kB] -Get:174 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libcolamd2 amd64 1:5.4.0+dfsg-1 [30.3 kB] -Get:175 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblapack3 amd64 3.8.0-2 [2110 kB] -Get:176 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libmetis5 amd64 5.1.0.dfsg-5+b2 [175 kB] -Get:177 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libcholmod3 amd64 1:5.4.0+dfsg-1 [324 kB] -Get:178 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libdsdp-5.8gf amd64 5.8-9.4 [189 kB] -Get:179 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libexpat1-dev amd64 2.2.6-2 [152 kB] -Get:180 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libfftw3-double3 amd64 3.3.8-2 [733 kB] -Get:181 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libfile-fcntllock-perl amd64 0.22-3+b5 [35.4 kB] -Get:182 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libglib2.0-data all 2.58.3-2 [1109 kB] -Get:183 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libltdl7 amd64 2.4.6-9 [390 kB] -Get:184 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libglpk40 amd64 4.65-2 [418 kB] -Get:185 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgpm2 amd64 1.20.7-5 [35.1 kB] -Get:186 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgslcblas0 amd64 2.5+dfsg-6 [101 kB] -Get:187 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libgsl23 amd64 2.5+dfsg-6 [880 kB] -Get:188 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsz2 amd64 1.0.2-1 [6676 B] -Get:189 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libhdf5-103 amd64 1.10.4+repack-10 [1325 kB] -Get:190 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libicu63 amd64 63.1-6 [8292 kB] -Get:191 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libimagequant0 amd64 2.12.2-1.1 [32.5 kB] -Get:192 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libjbig0 amd64 2.1-3.1+b2 [31.0 kB] -Get:193 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libjpeg62-turbo amd64 1:1.5.2-2+b1 [134 kB] -Get:194 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libjs-jquery all 3.3.1~dfsg-3 [332 kB] -Get:195 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libjs-jquery-ui all 1.12.1+dfsg-5 [232 kB] -Get:196 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblcms2-2 amd64 2.9-3 [145 kB] -Get:197 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblua5.1-0 amd64 5.1.5-8.1+b2 [111 kB] -Get:198 http://cdn-fastly.deb.debian.org/debian stable/main amd64 liblzo2-2 amd64 2.10-0.1 [56.1 kB] -Get:199 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7 amd64 3.7.3-2 [1498 kB] -Get:200 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3.7-dev amd64 3.7.3-2 [48.4 MB] -Get:201 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libpython3-dev amd64 3.7.3-1 [20.1 kB] -Get:202 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libsasl2-modules amd64 2.1.27+dfsg-1 [104 kB] -Get:203 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libwebp6 amd64 0.6.1-2 [263 kB] -Get:204 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libtiff5 amd64 4.0.10-4 [257 kB] -Get:205 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libumfpack5 amd64 1:5.4.0+dfsg-1 [243 kB] -Get:206 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libwebpdemux2 amd64 0.6.1-2 [87.5 kB] -Get:207 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libwebpmux3 amd64 0.6.1-2 [97.7 kB] -Get:208 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxml2 amd64 2.9.4+dfsg1-7+b3 [687 kB] -Get:209 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libxslt1.1 amd64 1.1.32-2 [236 kB] -Get:210 http://cdn-fastly.deb.debian.org/debian stable/main amd64 libyaml-0-2 amd64 0.2.1-1 [47.2 kB] -Get:211 http://cdn-fastly.deb.debian.org/debian stable/main amd64 manpages-dev all 4.16-2 [2232 kB] -Get:212 http://cdn-fastly.deb.debian.org/debian stable/main amd64 pandoc-data all 2.2.1-3 [329 kB] -Get:213 http://cdn-fastly.deb.debian.org/debian stable/main amd64 pandoc amd64 2.2.1-3+b2 [14.7 MB] -Get:214 http://cdn-fastly.deb.debian.org/debian stable/main amd64 psmisc amd64 23.2-1 [126 kB] -Get:215 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python-matplotlib-data all 3.0.2-2 [4138 kB] -Get:216 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python-pip-whl all 18.1-5 [1591 kB] -Get:217 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python-tables-data all 3.4.4-2 [53.1 kB] -Get:218 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-asn1crypto all 0.24.0-1 [78.2 kB] -Get:219 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-atomicwrites all 1.1.5-2 [6892 B] -Get:220 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-attr all 18.2.0-1 [37.3 kB] -Get:221 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-soupsieve all 1.8+dfsg-1 [27.6 kB] -Get:222 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-bs4 all 4.7.1-1 [94.1 kB] -Get:223 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-cffi-backend amd64 1.12.2-1 [79.7 kB] -Get:224 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-chardet all 3.0.4-3 [80.5 kB] -Get:225 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-crypto amd64 2.6.1-9+b1 [263 kB] -Get:226 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-cryptography amd64 2.6.1-3 [218 kB] -Get:227 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-cvxopt amd64 1.1.9+dfsg-3+b1 [269 kB] -Get:228 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-cycler all 0.10.0-1 [7556 B] -Get:229 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-dbus amd64 1.2.8-3 [103 kB] -Get:230 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3.7-dev amd64 3.7.3-2 [509 kB] -Get:231 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-dev amd64 3.7.3-1 [1264 B] -Get:232 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-gi amd64 3.30.4-1 [180 kB] -Get:233 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-ipykernel all 4.9.0-1 [75.7 kB] -Get:234 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-joblib all 0.13.0-2 [187 kB] -Get:235 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-secretstorage all 2.3.1-2 [14.2 kB] -Get:236 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-keyring all 17.1.1-1 [43.1 kB] -Get:237 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-keyrings.alt all 3.1.1-1 [18.2 kB] -Get:238 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-kiwisolver amd64 1.0.1-2+b1 [65.4 kB] -Get:239 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-lxml amd64 4.3.2-1 [1161 kB] -Get:240 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pyparsing all 2.2.0+dfsg1-2 [89.6 kB] -Get:241 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-numpy amd64 1:1.16.2-1 [2119 kB] -Get:242 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-matplotlib amd64 3.0.2-2 [5353 kB] -Get:243 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-more-itertools all 4.2.0-1 [42.2 kB] -Get:244 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-numexpr amd64 2.6.9-1 [140 kB] -Get:245 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-olefile all 0.46-1 [35.9 kB] -Get:246 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-tz all 2019.1-1 [27.1 kB] -Get:247 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pandas-lib amd64 0.23.3+dfsg-3 [3475 kB] -Get:248 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pandas all 0.23.3+dfsg-3 [1750 kB] -Get:249 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-patsy all 0.5.0+git13-g54dcf7b-1 [172 kB] -Get:250 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pil amd64 5.4.1-2 [395 kB] -Get:251 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pip all 18.1-5 [171 kB] -Get:252 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pluggy all 0.8.0-1 [20.6 kB] -Get:253 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-psutil amd64 5.5.1-1 [166 kB] -Get:254 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-py all 1.7.0-2 [86.6 kB] -Get:255 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-pytest all 3.10.1-2 [243 kB] -Get:256 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-scipy amd64 1.1.0-7 [10.0 MB] -Get:257 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-setuptools all 40.8.0-1 [306 kB] -Get:258 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-simplejson amd64 3.16.0-1 [60.7 kB] -Get:259 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-statsmodels-lib amd64 0.8.0-9 [365 kB] -Get:260 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-statsmodels all 0.8.0-9 [3004 kB] -Get:261 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-tables-lib amd64 3.4.4-2 [438 kB] -Get:262 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-tables all 3.4.4-2 [342 kB] -Get:263 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-tk amd64 3.7.3-1 [97.4 kB] -Get:264 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-wheel all 0.32.3-2 [19.4 kB] -Get:265 http://cdn-fastly.deb.debian.org/debian stable/main amd64 python3-xdg all 0.25-5 [35.9 kB] -Get:266 http://cdn-fastly.deb.debian.org/debian stable/main amd64 shared-mime-info amd64 1.10-1 [766 kB] -Get:267 http://cdn-fastly.deb.debian.org/debian stable/main amd64 xdg-user-dirs amd64 0.17-2 [53.8 kB] -debconf: delaying package configuration, since apt-utils is not installed -Fetched 212 MB in 2min 56s (1204 kB/s) -Selecting previously unselected package perl-modules-5.28. -(Reading database ... (Reading database ... 5%(Reading database ... 10%(Reading database ... 15%(Reading database ... 20%(Reading database ... 25%(Reading database ... 30%(Reading database ... 35%(Reading database ... 40%(Reading database ... 45%(Reading database ... 50%(Reading database ... 55%(Reading database ... 60%(Reading database ... 65%(Reading database ... 70%(Reading database ... 75%(Reading database ... 80%(Reading database ... 85%(Reading database ... 90%(Reading database ... 95%(Reading database ... 100%(Reading database ... 6674 files and directories currently installed.) -Preparing to unpack .../0-perl-modules-5.28_5.28.1-6_all.deb ... -Unpacking perl-modules-5.28 (5.28.1-6) ... -Selecting previously unselected package libgdbm6:amd64. -Preparing to unpack .../1-libgdbm6_1.18.1-4_amd64.deb ... -Unpacking libgdbm6:amd64 (1.18.1-4) ... -Selecting previously unselected package libgdbm-compat4:amd64. -Preparing to unpack .../2-libgdbm-compat4_1.18.1-4_amd64.deb ... -Unpacking libgdbm-compat4:amd64 (1.18.1-4) ... -Selecting previously unselected package libperl5.28:amd64. -Preparing to unpack .../3-libperl5.28_5.28.1-6_amd64.deb ... -Unpacking libperl5.28:amd64 (5.28.1-6) ... -Selecting previously unselected package perl. -Preparing to unpack .../4-perl_5.28.1-6_amd64.deb ... -Unpacking perl (5.28.1-6) ... -Selecting previously unselected package liblocale-gettext-perl. -Preparing to unpack .../5-liblocale-gettext-perl_1.07-3+b4_amd64.deb ... -Unpacking liblocale-gettext-perl (1.07-3+b4) ... -Selecting previously unselected package libssl1.1:amd64. -Preparing to unpack .../6-libssl1.1_1.1.1c-1_amd64.deb ... -Unpacking libssl1.1:amd64 (1.1.1c-1) ... -Selecting previously unselected package libpython3.7-minimal:amd64. -Preparing to unpack .../7-libpython3.7-minimal_3.7.3-2_amd64.deb ... -Unpacking libpython3.7-minimal:amd64 (3.7.3-2) ... -Selecting previously unselected package libexpat1:amd64. -Preparing to unpack .../8-libexpat1_2.2.6-2_amd64.deb ... -Unpacking libexpat1:amd64 (2.2.6-2) ... -Selecting previously unselected package python3.7-minimal. -Preparing to unpack .../9-python3.7-minimal_3.7.3-2_amd64.deb ... -Unpacking python3.7-minimal (3.7.3-2) ... -Setting up libssl1.1:amd64 (1.1.1c-1) ... -debconf: unable to initialize frontend: Dialog -debconf: (TERM is not set, so the dialog frontend is not usable.) -debconf: falling back to frontend: Readline -Setting up libpython3.7-minimal:amd64 (3.7.3-2) ... -Setting up libexpat1:amd64 (2.2.6-2) ... -Setting up python3.7-minimal (3.7.3-2) ... -Selecting previously unselected package python3-minimal. -(Reading database ... (Reading database ... 5%(Reading database ... 10%(Reading database ... 15%(Reading database ... 20%(Reading database ... 25%(Reading database ... 30%(Reading database ... 35%(Reading database ... 40%(Reading database ... 45%(Reading database ... 50%(Reading database ... 55%(Reading database ... 60%(Reading database ... 65%(Reading database ... 70%(Reading database ... 75%(Reading database ... 80%(Reading database ... 85%(Reading database ... 90%(Reading database ... 95%(Reading database ... 100%(Reading database ... 8896 files and directories currently installed.) -Preparing to unpack .../0-python3-minimal_3.7.3-1_amd64.deb ... -Unpacking python3-minimal (3.7.3-1) ... -Selecting previously unselected package mime-support. -Preparing to unpack .../1-mime-support_3.62_all.deb ... -Unpacking mime-support (3.62) ... -Selecting previously unselected package libmpdec2:amd64. -Preparing to unpack .../2-libmpdec2_2.4.2-2_amd64.deb ... -Unpacking libmpdec2:amd64 (2.4.2-2) ... -Selecting previously unselected package readline-common. -Preparing to unpack .../3-readline-common_7.0-5_all.deb ... -Unpacking readline-common (7.0-5) ... -Selecting previously unselected package libreadline7:amd64. -Preparing to unpack .../4-libreadline7_7.0-5_amd64.deb ... -Unpacking libreadline7:amd64 (7.0-5) ... -Selecting previously unselected package libsqlite3-0:amd64. -Preparing to unpack .../5-libsqlite3-0_3.27.2-3_amd64.deb ... -Unpacking libsqlite3-0:amd64 (3.27.2-3) ... -Selecting previously unselected package libpython3.7-stdlib:amd64. -Preparing to unpack .../6-libpython3.7-stdlib_3.7.3-2_amd64.deb ... -Unpacking libpython3.7-stdlib:amd64 (3.7.3-2) ... -Selecting previously unselected package python3.7. -Preparing to unpack .../7-python3.7_3.7.3-2_amd64.deb ... -Unpacking python3.7 (3.7.3-2) ... -Selecting previously unselected package libpython3-stdlib:amd64. -Preparing to unpack .../8-libpython3-stdlib_3.7.3-1_amd64.deb ... -Unpacking libpython3-stdlib:amd64 (3.7.3-1) ... -Setting up python3-minimal (3.7.3-1) ... -Selecting previously unselected package python3. -(Reading database ... (Reading database ... 5%(Reading database ... 10%(Reading database ... 15%(Reading database ... 20%(Reading database ... 25%(Reading database ... 30%(Reading database ... 35%(Reading database ... 40%(Reading database ... 45%(Reading database ... 50%(Reading database ... 55%(Reading database ... 60%(Reading database ... 65%(Reading database ... 70%(Reading database ... 75%(Reading database ... 80%(Reading database ... 85%(Reading database ... 90%(Reading database ... 95%(Reading database ... 100%(Reading database ... 9365 files and directories currently installed.) -Preparing to unpack .../000-python3_3.7.3-1_amd64.deb ... -Unpacking python3 (3.7.3-1) ... -Selecting previously unselected package netbase. -Preparing to unpack .../001-netbase_5.6_all.deb ... -Unpacking netbase (5.6) ... -Selecting previously unselected package libncurses6:amd64. -Preparing to unpack .../002-libncurses6_6.1+20181013-2_amd64.deb ... -Unpacking libncurses6:amd64 (6.1+20181013-2) ... -Selecting previously unselected package libprocps7:amd64. -Preparing to unpack .../003-libprocps7_2%3a3.3.15-2_amd64.deb ... -Unpacking libprocps7:amd64 (2:3.3.15-2) ... -Selecting previously unselected package lsb-base. -Preparing to unpack .../004-lsb-base_10.2019051400_all.deb ... -Unpacking lsb-base (10.2019051400) ... -Selecting previously unselected package procps. -Preparing to unpack .../005-procps_2%3a3.3.15-2_amd64.deb ... -Unpacking procps (2:3.3.15-2) ... -Selecting previously unselected package sensible-utils. -Preparing to unpack .../006-sensible-utils_0.0.12_all.deb ... -Unpacking sensible-utils (0.0.12) ... -Selecting previously unselected package bzip2. -Preparing to unpack .../007-bzip2_1.0.6-9.1_amd64.deb ... -Unpacking bzip2 (1.0.6-9.1) ... -Selecting previously unselected package libapparmor1:amd64. -Preparing to unpack .../008-libapparmor1_2.13.2-10_amd64.deb ... -Unpacking libapparmor1:amd64 (2.13.2-10) ... -Selecting previously unselected package libdbus-1-3:amd64. -Preparing to unpack .../009-libdbus-1-3_1.12.16-1_amd64.deb ... -Unpacking libdbus-1-3:amd64 (1.12.16-1) ... -Selecting previously unselected package dbus. -Preparing to unpack .../010-dbus_1.12.16-1_amd64.deb ... -Unpacking dbus (1.12.16-1) ... -Selecting previously unselected package libmagic-mgc. -Preparing to unpack .../011-libmagic-mgc_1%3a5.35-4_amd64.deb ... -Unpacking libmagic-mgc (1:5.35-4) ... -Selecting previously unselected package libmagic1:amd64. -Preparing to unpack .../012-libmagic1_1%3a5.35-4_amd64.deb ... -Unpacking libmagic1:amd64 (1:5.35-4) ... -Selecting previously unselected package file. -Preparing to unpack .../013-file_1%3a5.35-4_amd64.deb ... -Unpacking file (1:5.35-4) ... -Selecting previously unselected package krb5-locales. -Preparing to unpack .../014-krb5-locales_1.17-3_all.deb ... -Unpacking krb5-locales (1.17-3) ... -Selecting previously unselected package manpages. -Preparing to unpack .../015-manpages_4.16-2_all.deb ... -Unpacking manpages (4.16-2) ... -Selecting previously unselected package ucf. -Preparing to unpack .../016-ucf_3.0038+nmu1_all.deb ... -Moving old data out of the way -Unpacking ucf (3.0038+nmu1) ... -Selecting previously unselected package xz-utils. -Preparing to unpack .../017-xz-utils_5.2.4-1_amd64.deb ... -Unpacking xz-utils (5.2.4-1) ... -Selecting previously unselected package binutils-common:amd64. -Preparing to unpack .../018-binutils-common_2.31.1-16_amd64.deb ... -Unpacking binutils-common:amd64 (2.31.1-16) ... -Selecting previously unselected package libbinutils:amd64. -Preparing to unpack .../019-libbinutils_2.31.1-16_amd64.deb ... -Unpacking libbinutils:amd64 (2.31.1-16) ... -Selecting previously unselected package binutils-x86-64-linux-gnu. -Preparing to unpack .../020-binutils-x86-64-linux-gnu_2.31.1-16_amd64.deb ... -Unpacking binutils-x86-64-linux-gnu (2.31.1-16) ... -Selecting previously unselected package binutils. -Preparing to unpack .../021-binutils_2.31.1-16_amd64.deb ... -Unpacking binutils (2.31.1-16) ... -Selecting previously unselected package libtcl8.6:amd64. -Preparing to unpack .../022-libtcl8.6_8.6.9+dfsg-2_amd64.deb ... -Unpacking libtcl8.6:amd64 (8.6.9+dfsg-2) ... -Selecting previously unselected package libpng16-16:amd64. -Preparing to unpack .../023-libpng16-16_1.6.36-6_amd64.deb ... -Unpacking libpng16-16:amd64 (1.6.36-6) ... -Selecting previously unselected package libfreetype6:amd64. -Preparing to unpack .../024-libfreetype6_2.9.1-3_amd64.deb ... -Unpacking libfreetype6:amd64 (2.9.1-3) ... -Selecting previously unselected package ttf-bitstream-vera. -Preparing to unpack .../025-ttf-bitstream-vera_1.10-8_all.deb ... -Unpacking ttf-bitstream-vera (1.10-8) ... -Selecting previously unselected package fontconfig-config. -Preparing to unpack .../026-fontconfig-config_2.13.1-2_all.deb ... -Unpacking fontconfig-config (2.13.1-2) ... -Selecting previously unselected package libfontconfig1:amd64. -Preparing to unpack .../027-libfontconfig1_2.13.1-2_amd64.deb ... -Unpacking libfontconfig1:amd64 (2.13.1-2) ... -Selecting previously unselected package libxau6:amd64. -Preparing to unpack .../028-libxau6_1%3a1.0.8-1+b2_amd64.deb ... -Unpacking libxau6:amd64 (1:1.0.8-1+b2) ... -Selecting previously unselected package libbsd0:amd64. -Preparing to unpack .../029-libbsd0_0.9.1-2_amd64.deb ... -Unpacking libbsd0:amd64 (0.9.1-2) ... -Selecting previously unselected package libxdmcp6:amd64. -Preparing to unpack .../030-libxdmcp6_1%3a1.1.2-3_amd64.deb ... -Unpacking libxdmcp6:amd64 (1:1.1.2-3) ... -Selecting previously unselected package libxcb1:amd64. -Preparing to unpack .../031-libxcb1_1.13.1-2_amd64.deb ... -Unpacking libxcb1:amd64 (1.13.1-2) ... -Selecting previously unselected package libx11-data. -Preparing to unpack .../032-libx11-data_2%3a1.6.7-1_all.deb ... -Unpacking libx11-data (2:1.6.7-1) ... -Selecting previously unselected package libx11-6:amd64. -Preparing to unpack .../033-libx11-6_2%3a1.6.7-1_amd64.deb ... -Unpacking libx11-6:amd64 (2:1.6.7-1) ... -Selecting previously unselected package libxext6:amd64. -Preparing to unpack .../034-libxext6_2%3a1.3.3-1+b2_amd64.deb ... -Unpacking libxext6:amd64 (2:1.3.3-1+b2) ... -Selecting previously unselected package libxrender1:amd64. -Preparing to unpack .../035-libxrender1_1%3a0.9.10-1_amd64.deb ... -Unpacking libxrender1:amd64 (1:0.9.10-1) ... -Selecting previously unselected package libxft2:amd64. -Preparing to unpack .../036-libxft2_2.3.2-2_amd64.deb ... -Unpacking libxft2:amd64 (2.3.2-2) ... -Selecting previously unselected package x11-common. -Preparing to unpack .../037-x11-common_1%3a7.7+19_all.deb ... -Unpacking x11-common (1:7.7+19) ... -Selecting previously unselected package libxss1:amd64. -Preparing to unpack .../038-libxss1_1%3a1.2.3-1_amd64.deb ... -Unpacking libxss1:amd64 (1:1.2.3-1) ... -Selecting previously unselected package libtk8.6:amd64. -Preparing to unpack .../039-libtk8.6_8.6.9-2_amd64.deb ... -Unpacking libtk8.6:amd64 (8.6.9-2) ... -Selecting previously unselected package tk8.6-blt2.5. -Preparing to unpack .../040-tk8.6-blt2.5_2.5.3+dfsg-4_amd64.deb ... -Unpacking tk8.6-blt2.5 (2.5.3+dfsg-4) ... -Selecting previously unselected package blt. -Preparing to unpack .../041-blt_2.5.3+dfsg-4_amd64.deb ... -Unpacking blt (2.5.3+dfsg-4) ... -Selecting previously unselected package libc-dev-bin. -Preparing to unpack .../042-libc-dev-bin_2.28-10_amd64.deb ... -Unpacking libc-dev-bin (2.28-10) ... -Selecting previously unselected package linux-libc-dev:amd64. -Preparing to unpack .../043-linux-libc-dev_4.19.37-5+deb10u1_amd64.deb ... -Unpacking linux-libc-dev:amd64 (4.19.37-5+deb10u1) ... -Selecting previously unselected package libc6-dev:amd64. -Preparing to unpack .../044-libc6-dev_2.28-10_amd64.deb ... -Unpacking libc6-dev:amd64 (2.28-10) ... -Selecting previously unselected package libisl19:amd64. -Preparing to unpack .../045-libisl19_0.20-2_amd64.deb ... -Unpacking libisl19:amd64 (0.20-2) ... -Selecting previously unselected package libmpfr6:amd64. -Preparing to unpack .../046-libmpfr6_4.0.2-1_amd64.deb ... -Unpacking libmpfr6:amd64 (4.0.2-1) ... -Selecting previously unselected package libmpc3:amd64. -Preparing to unpack .../047-libmpc3_1.1.0-1_amd64.deb ... -Unpacking libmpc3:amd64 (1.1.0-1) ... -Selecting previously unselected package cpp-8. -Preparing to unpack .../048-cpp-8_8.3.0-6_amd64.deb ... -Unpacking cpp-8 (8.3.0-6) ... -Selecting previously unselected package cpp. -Preparing to unpack .../049-cpp_4%3a8.3.0-1_amd64.deb ... -Unpacking cpp (4:8.3.0-1) ... -Selecting previously unselected package libcc1-0:amd64. -Preparing to unpack .../050-libcc1-0_8.3.0-6_amd64.deb ... -Unpacking libcc1-0:amd64 (8.3.0-6) ... -Selecting previously unselected package libgomp1:amd64. -Preparing to unpack .../051-libgomp1_8.3.0-6_amd64.deb ... -Unpacking libgomp1:amd64 (8.3.0-6) ... -Selecting previously unselected package libitm1:amd64. -Preparing to unpack .../052-libitm1_8.3.0-6_amd64.deb ... -Unpacking libitm1:amd64 (8.3.0-6) ... -Selecting previously unselected package libatomic1:amd64. -Preparing to unpack .../053-libatomic1_8.3.0-6_amd64.deb ... -Unpacking libatomic1:amd64 (8.3.0-6) ... -Selecting previously unselected package libasan5:amd64. -Preparing to unpack .../054-libasan5_8.3.0-6_amd64.deb ... -Unpacking libasan5:amd64 (8.3.0-6) ... -Selecting previously unselected package liblsan0:amd64. -Preparing to unpack .../055-liblsan0_8.3.0-6_amd64.deb ... -Unpacking liblsan0:amd64 (8.3.0-6) ... -Selecting previously unselected package libtsan0:amd64. -Preparing to unpack .../056-libtsan0_8.3.0-6_amd64.deb ... -Unpacking libtsan0:amd64 (8.3.0-6) ... -Selecting previously unselected package libubsan1:amd64. -Preparing to unpack .../057-libubsan1_8.3.0-6_amd64.deb ... -Unpacking libubsan1:amd64 (8.3.0-6) ... -Selecting previously unselected package libmpx2:amd64. -Preparing to unpack .../058-libmpx2_8.3.0-6_amd64.deb ... -Unpacking libmpx2:amd64 (8.3.0-6) ... -Selecting previously unselected package libquadmath0:amd64. -Preparing to unpack .../059-libquadmath0_8.3.0-6_amd64.deb ... -Unpacking libquadmath0:amd64 (8.3.0-6) ... -Selecting previously unselected package libgcc-8-dev:amd64. -Preparing to unpack .../060-libgcc-8-dev_8.3.0-6_amd64.deb ... -Unpacking libgcc-8-dev:amd64 (8.3.0-6) ... -Selecting previously unselected package gcc-8. -Preparing to unpack .../061-gcc-8_8.3.0-6_amd64.deb ... -Unpacking gcc-8 (8.3.0-6) ... -Selecting previously unselected package gcc. -Preparing to unpack .../062-gcc_4%3a8.3.0-1_amd64.deb ... -Unpacking gcc (4:8.3.0-1) ... -Selecting previously unselected package libstdc++-8-dev:amd64. -Preparing to unpack .../063-libstdc++-8-dev_8.3.0-6_amd64.deb ... -Unpacking libstdc++-8-dev:amd64 (8.3.0-6) ... -Selecting previously unselected package g++-8. -Preparing to unpack .../064-g++-8_8.3.0-6_amd64.deb ... -Unpacking g++-8 (8.3.0-6) ... -Selecting previously unselected package g++. -Preparing to unpack .../065-g++_4%3a8.3.0-1_amd64.deb ... -Unpacking g++ (4:8.3.0-1) ... -Selecting previously unselected package make. -Preparing to unpack .../066-make_4.2.1-1.2_amd64.deb ... -Unpacking make (4.2.1-1.2) ... -Selecting previously unselected package libdpkg-perl. -Preparing to unpack .../067-libdpkg-perl_1.19.7_all.deb ... -Unpacking libdpkg-perl (1.19.7) ... -Selecting previously unselected package patch. -Preparing to unpack .../068-patch_2.7.6-3_amd64.deb ... -Unpacking patch (2.7.6-3) ... -Selecting previously unselected package dpkg-dev. -Preparing to unpack .../069-dpkg-dev_1.19.7_all.deb ... -Unpacking dpkg-dev (1.19.7) ... -Selecting previously unselected package build-essential. -Preparing to unpack .../070-build-essential_12.6_amd64.deb ... -Unpacking build-essential (12.6) ... -Selecting previously unselected package openssl. -Preparing to unpack .../071-openssl_1.1.1c-1_amd64.deb ... -Unpacking openssl (1.1.1c-1) ... -Selecting previously unselected package ca-certificates. -Preparing to unpack .../072-ca-certificates_20190110_all.deb ... -Unpacking ca-certificates (20190110) ... -Selecting previously unselected package python3-lib2to3. -Preparing to unpack .../073-python3-lib2to3_3.7.3-1_all.deb ... -Unpacking python3-lib2to3 (3.7.3-1) ... -Selecting previously unselected package python3-distutils. -Preparing to unpack .../074-python3-distutils_3.7.3-1_all.deb ... -Unpacking python3-distutils (3.7.3-1) ... -Selecting previously unselected package dh-python. -Preparing to unpack .../075-dh-python_3.20190308_all.deb ... -Unpacking dh-python (3.20190308) ... -Selecting previously unselected package libassuan0:amd64. -Preparing to unpack .../076-libassuan0_2.5.2-1_amd64.deb ... -Unpacking libassuan0:amd64 (2.5.2-1) ... -Selecting previously unselected package gpgconf. -Preparing to unpack .../077-gpgconf_2.2.12-1_amd64.deb ... -Unpacking gpgconf (2.2.12-1) ... -Selecting previously unselected package libksba8:amd64. -Preparing to unpack .../078-libksba8_1.3.5-2_amd64.deb ... -Unpacking libksba8:amd64 (1.3.5-2) ... -Selecting previously unselected package libsasl2-modules-db:amd64. -Preparing to unpack .../079-libsasl2-modules-db_2.1.27+dfsg-1_amd64.deb ... -Unpacking libsasl2-modules-db:amd64 (2.1.27+dfsg-1) ... -Selecting previously unselected package libsasl2-2:amd64. -Preparing to unpack .../080-libsasl2-2_2.1.27+dfsg-1_amd64.deb ... -Unpacking libsasl2-2:amd64 (2.1.27+dfsg-1) ... -Selecting previously unselected package libldap-common. -Preparing to unpack .../081-libldap-common_2.4.47+dfsg-3_all.deb ... -Unpacking libldap-common (2.4.47+dfsg-3) ... -Selecting previously unselected package libldap-2.4-2:amd64. -Preparing to unpack .../082-libldap-2.4-2_2.4.47+dfsg-3_amd64.deb ... -Unpacking libldap-2.4-2:amd64 (2.4.47+dfsg-3) ... -Selecting previously unselected package libnpth0:amd64. -Preparing to unpack .../083-libnpth0_1.6-1_amd64.deb ... -Unpacking libnpth0:amd64 (1.6-1) ... -Selecting previously unselected package dirmngr. -Preparing to unpack .../084-dirmngr_2.2.12-1_amd64.deb ... -Unpacking dirmngr (2.2.12-1) ... -Selecting previously unselected package libfakeroot:amd64. -Preparing to unpack .../085-libfakeroot_1.23-1_amd64.deb ... -Unpacking libfakeroot:amd64 (1.23-1) ... -Selecting previously unselected package fakeroot. -Preparing to unpack .../086-fakeroot_1.23-1_amd64.deb ... -Unpacking fakeroot (1.23-1) ... -Selecting previously unselected package fonts-lyx. -Preparing to unpack .../087-fonts-lyx_2.3.2-1_all.deb ... -Unpacking fonts-lyx (2.3.2-1) ... -Selecting previously unselected package libglib2.0-0:amd64. -Preparing to unpack .../088-libglib2.0-0_2.58.3-2_amd64.deb ... -Unpacking libglib2.0-0:amd64 (2.58.3-2) ... -Selecting previously unselected package libgirepository-1.0-1:amd64. -Preparing to unpack .../089-libgirepository-1.0-1_1.58.3-2_amd64.deb ... -Unpacking libgirepository-1.0-1:amd64 (1.58.3-2) ... -Selecting previously unselected package gir1.2-glib-2.0:amd64. -Preparing to unpack .../090-gir1.2-glib-2.0_1.58.3-2_amd64.deb ... -Unpacking gir1.2-glib-2.0:amd64 (1.58.3-2) ... -Selecting previously unselected package gnupg-l10n. -Preparing to unpack .../091-gnupg-l10n_2.2.12-1_all.deb ... -Unpacking gnupg-l10n (2.2.12-1) ... -Selecting previously unselected package gnupg-utils. -Preparing to unpack .../092-gnupg-utils_2.2.12-1_amd64.deb ... -Unpacking gnupg-utils (2.2.12-1) ... -Selecting previously unselected package gpg. -Preparing to unpack .../093-gpg_2.2.12-1_amd64.deb ... -Unpacking gpg (2.2.12-1) ... -Selecting previously unselected package pinentry-curses. -Preparing to unpack .../094-pinentry-curses_1.1.0-2_amd64.deb ... -Unpacking pinentry-curses (1.1.0-2) ... -Selecting previously unselected package gpg-agent. -Preparing to unpack .../095-gpg-agent_2.2.12-1_amd64.deb ... -Unpacking gpg-agent (2.2.12-1) ... -Selecting previously unselected package gpg-wks-client. -Preparing to unpack .../096-gpg-wks-client_2.2.12-1_amd64.deb ... -Unpacking gpg-wks-client (2.2.12-1) ... -Selecting previously unselected package gpg-wks-server. -Preparing to unpack .../097-gpg-wks-server_2.2.12-1_amd64.deb ... -Unpacking gpg-wks-server (2.2.12-1) ... -Selecting previously unselected package gpgsm. -Preparing to unpack .../098-gpgsm_2.2.12-1_amd64.deb ... -Unpacking gpgsm (2.2.12-1) ... -Selecting previously unselected package gnupg. -Preparing to unpack .../099-gnupg_2.2.12-1_all.deb ... -Unpacking gnupg (2.2.12-1) ... -Selecting previously unselected package javascript-common. -Preparing to unpack .../100-javascript-common_11_all.deb ... -Unpacking javascript-common (11) ... -Selecting previously unselected package python3-entrypoints. -Preparing to unpack .../101-python3-entrypoints_0.3-1_all.deb ... -Unpacking python3-entrypoints (0.3-1) ... -Selecting previously unselected package python3-decorator. -Preparing to unpack .../102-python3-decorator_4.3.0-1.1_all.deb ... -Unpacking python3-decorator (4.3.0-1.1) ... -Selecting previously unselected package python3-ptyprocess. -Preparing to unpack .../103-python3-ptyprocess_0.6.0-1_all.deb ... -Unpacking python3-ptyprocess (0.6.0-1) ... -Selecting previously unselected package python3-pexpect. -Preparing to unpack .../104-python3-pexpect_4.6.0-1_all.deb ... -Unpacking python3-pexpect (4.6.0-1) ... -Selecting previously unselected package python3-pickleshare. -Preparing to unpack .../105-python3-pickleshare_0.7.5-1_all.deb ... -Unpacking python3-pickleshare (0.7.5-1) ... -Selecting previously unselected package python3-pkg-resources. -Preparing to unpack .../106-python3-pkg-resources_40.8.0-1_all.deb ... -Unpacking python3-pkg-resources (40.8.0-1) ... -Selecting previously unselected package python3-six. -Preparing to unpack .../107-python3-six_1.12.0-1_all.deb ... -Unpacking python3-six (1.12.0-1) ... -Selecting previously unselected package python3-wcwidth. -Preparing to unpack .../108-python3-wcwidth_0.1.7+dfsg1-3_all.deb ... -Unpacking python3-wcwidth (0.1.7+dfsg1-3) ... -Selecting previously unselected package python3-prompt-toolkit. -Preparing to unpack .../109-python3-prompt-toolkit_1.0.15-1_all.deb ... -Unpacking python3-prompt-toolkit (1.0.15-1) ... -Selecting previously unselected package python3-pygments. -Preparing to unpack .../110-python3-pygments_2.3.1+dfsg-1_all.deb ... -Unpacking python3-pygments (2.3.1+dfsg-1) ... -Selecting previously unselected package python3-simplegeneric. -Preparing to unpack .../111-python3-simplegeneric_0.8.1-2_all.deb ... -Unpacking python3-simplegeneric (0.8.1-2) ... -Selecting previously unselected package python3-ipython-genutils. -Preparing to unpack .../112-python3-ipython-genutils_0.2.0-1_all.deb ... -Unpacking python3-ipython-genutils (0.2.0-1) ... -Selecting previously unselected package python3-traitlets. -Preparing to unpack .../113-python3-traitlets_4.3.2-1_all.deb ... -Unpacking python3-traitlets (4.3.2-1) ... -Selecting previously unselected package python3-ipython. -Preparing to unpack .../114-python3-ipython_5.8.0-1_all.deb ... -Unpacking python3-ipython (5.8.0-1) ... -Selecting previously unselected package python3-dateutil. -Preparing to unpack .../115-python3-dateutil_2.7.3-3_all.deb ... -Unpacking python3-dateutil (2.7.3-3) ... -Selecting previously unselected package python3-jupyter-core. -Preparing to unpack .../116-python3-jupyter-core_4.4.0-2_all.deb ... -Unpacking python3-jupyter-core (4.4.0-2) ... -Selecting previously unselected package python3-tornado. -Preparing to unpack .../117-python3-tornado_5.1.1-4_amd64.deb ... -Unpacking python3-tornado (5.1.1-4) ... -Selecting previously unselected package libkeyutils1:amd64. -Preparing to unpack .../118-libkeyutils1_1.6-6_amd64.deb ... -Unpacking libkeyutils1:amd64 (1.6-6) ... -Selecting previously unselected package libkrb5support0:amd64. -Preparing to unpack .../119-libkrb5support0_1.17-3_amd64.deb ... -Unpacking libkrb5support0:amd64 (1.17-3) ... -Selecting previously unselected package libk5crypto3:amd64. -Preparing to unpack .../120-libk5crypto3_1.17-3_amd64.deb ... -Unpacking libk5crypto3:amd64 (1.17-3) ... -Selecting previously unselected package libkrb5-3:amd64. -Preparing to unpack .../121-libkrb5-3_1.17-3_amd64.deb ... -Unpacking libkrb5-3:amd64 (1.17-3) ... -Selecting previously unselected package libgssapi-krb5-2:amd64. -Preparing to unpack .../122-libgssapi-krb5-2_1.17-3_amd64.deb ... -Unpacking libgssapi-krb5-2:amd64 (1.17-3) ... -Selecting previously unselected package libnorm1:amd64. -Preparing to unpack .../123-libnorm1_1.5.8+dfsg2-1_amd64.deb ... -Unpacking libnorm1:amd64 (1.5.8+dfsg2-1) ... -Selecting previously unselected package libpgm-5.2-0:amd64. -Preparing to unpack .../124-libpgm-5.2-0_5.2.122~dfsg-3_amd64.deb ... -Unpacking libpgm-5.2-0:amd64 (5.2.122~dfsg-3) ... -Selecting previously unselected package libsodium23:amd64. -Preparing to unpack .../125-libsodium23_1.0.17-1_amd64.deb ... -Unpacking libsodium23:amd64 (1.0.17-1) ... -Selecting previously unselected package libzmq5:amd64. -Preparing to unpack .../126-libzmq5_4.3.1-4+deb10u1_amd64.deb ... -Unpacking libzmq5:amd64 (4.3.1-4+deb10u1) ... -Selecting previously unselected package python3-zmq. -Preparing to unpack .../127-python3-zmq_17.1.2-2_amd64.deb ... -Unpacking python3-zmq (17.1.2-2) ... -Selecting previously unselected package python3-jupyter-client. -Preparing to unpack .../128-python3-jupyter-client_5.2.3-1_all.deb ... -Unpacking python3-jupyter-client (5.2.3-1) ... -Selecting previously unselected package python3-testpath. -Preparing to unpack .../129-python3-testpath_0.4.2+dfsg-1_all.deb ... -Unpacking python3-testpath (0.4.2+dfsg-1) ... -Selecting previously unselected package python3-webencodings. -Preparing to unpack .../130-python3-webencodings_0.5.1-1_all.deb ... -Unpacking python3-webencodings (0.5.1-1) ... -Selecting previously unselected package python3-html5lib. -Preparing to unpack .../131-python3-html5lib_1.0.1-1_all.deb ... -Unpacking python3-html5lib (1.0.1-1) ... -Selecting previously unselected package python3-bleach. -Preparing to unpack .../132-python3-bleach_3.1.0-1_all.deb ... -Unpacking python3-bleach (3.1.0-1) ... -Selecting previously unselected package python3-defusedxml. -Preparing to unpack .../133-python3-defusedxml_0.5.0-2_all.deb ... -Unpacking python3-defusedxml (0.5.0-2) ... -Selecting previously unselected package python3-markupsafe. -Preparing to unpack .../134-python3-markupsafe_1.1.0-1_amd64.deb ... -Unpacking python3-markupsafe (1.1.0-1) ... -Selecting previously unselected package python3-jinja2. -Preparing to unpack .../135-python3-jinja2_2.10-2_all.deb ... -Unpacking python3-jinja2 (2.10-2) ... -Selecting previously unselected package python3-mistune. -Preparing to unpack .../136-python3-mistune_0.8.4-1_all.deb ... -Unpacking python3-mistune (0.8.4-1) ... -Selecting previously unselected package python3-jsonschema. -Preparing to unpack .../137-python3-jsonschema_2.6.0-4_all.deb ... -Unpacking python3-jsonschema (2.6.0-4) ... -Selecting previously unselected package python3-nbformat. -Preparing to unpack .../138-python3-nbformat_4.4.0-1_all.deb ... -Unpacking python3-nbformat (4.4.0-1) ... -Selecting previously unselected package python3-pandocfilters. -Preparing to unpack .../139-python3-pandocfilters_1.4.2-1_all.deb ... -Unpacking python3-pandocfilters (1.4.2-1) ... -Selecting previously unselected package python3-nbconvert. -Preparing to unpack .../140-python3-nbconvert_5.4-2_all.deb ... -Unpacking python3-nbconvert (5.4-2) ... -Selecting previously unselected package jupyter-nbconvert. -Preparing to unpack .../141-jupyter-nbconvert_5.4-2_all.deb ... -Unpacking jupyter-nbconvert (5.4-2) ... -Selecting previously unselected package libaec0:amd64. -Preparing to unpack .../142-libaec0_1.0.2-1_amd64.deb ... -Unpacking libaec0:amd64 (1.0.2-1) ... -Selecting previously unselected package libalgorithm-diff-perl. -Preparing to unpack .../143-libalgorithm-diff-perl_1.19.03-2_all.deb ... -Unpacking libalgorithm-diff-perl (1.19.03-2) ... -Selecting previously unselected package libalgorithm-diff-xs-perl. -Preparing to unpack .../144-libalgorithm-diff-xs-perl_0.04-5+b1_amd64.deb ... -Unpacking libalgorithm-diff-xs-perl (0.04-5+b1) ... -Selecting previously unselected package libalgorithm-merge-perl. -Preparing to unpack .../145-libalgorithm-merge-perl_0.08-3_all.deb ... -Unpacking libalgorithm-merge-perl (0.08-3) ... -Selecting previously unselected package libsuitesparseconfig5:amd64. -Preparing to unpack .../146-libsuitesparseconfig5_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libsuitesparseconfig5:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libamd2:amd64. -Preparing to unpack .../147-libamd2_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libamd2:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libgfortran5:amd64. -Preparing to unpack .../148-libgfortran5_8.3.0-6_amd64.deb ... -Unpacking libgfortran5:amd64 (8.3.0-6) ... -Selecting previously unselected package libblas3:amd64. -Preparing to unpack .../149-libblas3_3.8.0-2_amd64.deb ... -Unpacking libblas3:amd64 (3.8.0-2) ... -Selecting previously unselected package libsnappy1v5:amd64. -Preparing to unpack .../150-libsnappy1v5_1.1.7-1_amd64.deb ... -Unpacking libsnappy1v5:amd64 (1.1.7-1) ... -Selecting previously unselected package libblosc1. -Preparing to unpack .../151-libblosc1_1.15.1+ds1-1_amd64.deb ... -Unpacking libblosc1 (1.15.1+ds1-1) ... -Selecting previously unselected package libcamd2:amd64. -Preparing to unpack .../152-libcamd2_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libcamd2:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libccolamd2:amd64. -Preparing to unpack .../153-libccolamd2_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libccolamd2:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libcolamd2:amd64. -Preparing to unpack .../154-libcolamd2_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libcolamd2:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package liblapack3:amd64. -Preparing to unpack .../155-liblapack3_3.8.0-2_amd64.deb ... -Unpacking liblapack3:amd64 (3.8.0-2) ... -Selecting previously unselected package libmetis5:amd64. -Preparing to unpack .../156-libmetis5_5.1.0.dfsg-5+b2_amd64.deb ... -Unpacking libmetis5:amd64 (5.1.0.dfsg-5+b2) ... -Selecting previously unselected package libcholmod3:amd64. -Preparing to unpack .../157-libcholmod3_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libcholmod3:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libdsdp-5.8gf. -Preparing to unpack .../158-libdsdp-5.8gf_5.8-9.4_amd64.deb ... -Unpacking libdsdp-5.8gf (5.8-9.4) ... -Selecting previously unselected package libexpat1-dev:amd64. -Preparing to unpack .../159-libexpat1-dev_2.2.6-2_amd64.deb ... -Unpacking libexpat1-dev:amd64 (2.2.6-2) ... -Selecting previously unselected package libfftw3-double3:amd64. -Preparing to unpack .../160-libfftw3-double3_3.3.8-2_amd64.deb ... -Unpacking libfftw3-double3:amd64 (3.3.8-2) ... -Selecting previously unselected package libfile-fcntllock-perl. -Preparing to unpack .../161-libfile-fcntllock-perl_0.22-3+b5_amd64.deb ... -Unpacking libfile-fcntllock-perl (0.22-3+b5) ... -Selecting previously unselected package libglib2.0-data. -Preparing to unpack .../162-libglib2.0-data_2.58.3-2_all.deb ... -Unpacking libglib2.0-data (2.58.3-2) ... -Selecting previously unselected package libltdl7:amd64. -Preparing to unpack .../163-libltdl7_2.4.6-9_amd64.deb ... -Unpacking libltdl7:amd64 (2.4.6-9) ... -Selecting previously unselected package libglpk40:amd64. -Preparing to unpack .../164-libglpk40_4.65-2_amd64.deb ... -Unpacking libglpk40:amd64 (4.65-2) ... -Selecting previously unselected package libgpm2:amd64. -Preparing to unpack .../165-libgpm2_1.20.7-5_amd64.deb ... -Unpacking libgpm2:amd64 (1.20.7-5) ... -Selecting previously unselected package libgslcblas0:amd64. -Preparing to unpack .../166-libgslcblas0_2.5+dfsg-6_amd64.deb ... -Unpacking libgslcblas0:amd64 (2.5+dfsg-6) ... -Selecting previously unselected package libgsl23:amd64. -Preparing to unpack .../167-libgsl23_2.5+dfsg-6_amd64.deb ... -Unpacking libgsl23:amd64 (2.5+dfsg-6) ... -Selecting previously unselected package libsz2:amd64. -Preparing to unpack .../168-libsz2_1.0.2-1_amd64.deb ... -Unpacking libsz2:amd64 (1.0.2-1) ... -Selecting previously unselected package libhdf5-103:amd64. -Preparing to unpack .../169-libhdf5-103_1.10.4+repack-10_amd64.deb ... -Unpacking libhdf5-103:amd64 (1.10.4+repack-10) ... -Selecting previously unselected package libicu63:amd64. -Preparing to unpack .../170-libicu63_63.1-6_amd64.deb ... -Unpacking libicu63:amd64 (63.1-6) ... -Selecting previously unselected package libimagequant0:amd64. -Preparing to unpack .../171-libimagequant0_2.12.2-1.1_amd64.deb ... -Unpacking libimagequant0:amd64 (2.12.2-1.1) ... -Selecting previously unselected package libjbig0:amd64. -Preparing to unpack .../172-libjbig0_2.1-3.1+b2_amd64.deb ... -Unpacking libjbig0:amd64 (2.1-3.1+b2) ... -Selecting previously unselected package libjpeg62-turbo:amd64. -Preparing to unpack .../173-libjpeg62-turbo_1%3a1.5.2-2+b1_amd64.deb ... -Unpacking libjpeg62-turbo:amd64 (1:1.5.2-2+b1) ... -Selecting previously unselected package libjs-jquery. -Preparing to unpack .../174-libjs-jquery_3.3.1~dfsg-3_all.deb ... -Unpacking libjs-jquery (3.3.1~dfsg-3) ... -Selecting previously unselected package libjs-jquery-ui. -Preparing to unpack .../175-libjs-jquery-ui_1.12.1+dfsg-5_all.deb ... -Unpacking libjs-jquery-ui (1.12.1+dfsg-5) ... -Selecting previously unselected package liblcms2-2:amd64. -Preparing to unpack .../176-liblcms2-2_2.9-3_amd64.deb ... -Unpacking liblcms2-2:amd64 (2.9-3) ... -Selecting previously unselected package liblua5.1-0:amd64. -Preparing to unpack .../177-liblua5.1-0_5.1.5-8.1+b2_amd64.deb ... -Unpacking liblua5.1-0:amd64 (5.1.5-8.1+b2) ... -Selecting previously unselected package liblzo2-2:amd64. -Preparing to unpack .../178-liblzo2-2_2.10-0.1_amd64.deb ... -Unpacking liblzo2-2:amd64 (2.10-0.1) ... -Selecting previously unselected package libpython3.7:amd64. -Preparing to unpack .../179-libpython3.7_3.7.3-2_amd64.deb ... -Unpacking libpython3.7:amd64 (3.7.3-2) ... -Selecting previously unselected package libpython3.7-dev:amd64. -Preparing to unpack .../180-libpython3.7-dev_3.7.3-2_amd64.deb ... -Unpacking libpython3.7-dev:amd64 (3.7.3-2) ... -Selecting previously unselected package libpython3-dev:amd64. -Preparing to unpack .../181-libpython3-dev_3.7.3-1_amd64.deb ... -Unpacking libpython3-dev:amd64 (3.7.3-1) ... -Selecting previously unselected package libsasl2-modules:amd64. -Preparing to unpack .../182-libsasl2-modules_2.1.27+dfsg-1_amd64.deb ... -Unpacking libsasl2-modules:amd64 (2.1.27+dfsg-1) ... -Selecting previously unselected package libwebp6:amd64. -Preparing to unpack .../183-libwebp6_0.6.1-2_amd64.deb ... -Unpacking libwebp6:amd64 (0.6.1-2) ... -Selecting previously unselected package libtiff5:amd64. -Preparing to unpack .../184-libtiff5_4.0.10-4_amd64.deb ... -Unpacking libtiff5:amd64 (4.0.10-4) ... -Selecting previously unselected package libumfpack5:amd64. -Preparing to unpack .../185-libumfpack5_1%3a5.4.0+dfsg-1_amd64.deb ... -Unpacking libumfpack5:amd64 (1:5.4.0+dfsg-1) ... -Selecting previously unselected package libwebpdemux2:amd64. -Preparing to unpack .../186-libwebpdemux2_0.6.1-2_amd64.deb ... -Unpacking libwebpdemux2:amd64 (0.6.1-2) ... -Selecting previously unselected package libwebpmux3:amd64. -Preparing to unpack .../187-libwebpmux3_0.6.1-2_amd64.deb ... -Unpacking libwebpmux3:amd64 (0.6.1-2) ... -Selecting previously unselected package libxml2:amd64. -Preparing to unpack .../188-libxml2_2.9.4+dfsg1-7+b3_amd64.deb ... -Unpacking libxml2:amd64 (2.9.4+dfsg1-7+b3) ... -Selecting previously unselected package libxslt1.1:amd64. -Preparing to unpack .../189-libxslt1.1_1.1.32-2_amd64.deb ... -Unpacking libxslt1.1:amd64 (1.1.32-2) ... -Selecting previously unselected package libyaml-0-2:amd64. -Preparing to unpack .../190-libyaml-0-2_0.2.1-1_amd64.deb ... -Unpacking libyaml-0-2:amd64 (0.2.1-1) ... -Selecting previously unselected package manpages-dev. -Preparing to unpack .../191-manpages-dev_4.16-2_all.deb ... -Unpacking manpages-dev (4.16-2) ... -Selecting previously unselected package pandoc-data. -Preparing to unpack .../192-pandoc-data_2.2.1-3_all.deb ... -Unpacking pandoc-data (2.2.1-3) ... -Selecting previously unselected package pandoc. -Preparing to unpack .../193-pandoc_2.2.1-3+b2_amd64.deb ... -Unpacking pandoc (2.2.1-3+b2) ... -Selecting previously unselected package psmisc. -Preparing to unpack .../194-psmisc_23.2-1_amd64.deb ... -Unpacking psmisc (23.2-1) ... -Selecting previously unselected package python-matplotlib-data. -Preparing to unpack .../195-python-matplotlib-data_3.0.2-2_all.deb ... -Unpacking python-matplotlib-data (3.0.2-2) ... -Selecting previously unselected package python-pip-whl. -Preparing to unpack .../196-python-pip-whl_18.1-5_all.deb ... -Unpacking python-pip-whl (18.1-5) ... -Selecting previously unselected package python-tables-data. -Preparing to unpack .../197-python-tables-data_3.4.4-2_all.deb ... -Unpacking python-tables-data (3.4.4-2) ... -Selecting previously unselected package python3-asn1crypto. -Preparing to unpack .../198-python3-asn1crypto_0.24.0-1_all.deb ... -Unpacking python3-asn1crypto (0.24.0-1) ... -Selecting previously unselected package python3-atomicwrites. -Preparing to unpack .../199-python3-atomicwrites_1.1.5-2_all.deb ... -Unpacking python3-atomicwrites (1.1.5-2) ... -Selecting previously unselected package python3-attr. -Preparing to unpack .../200-python3-attr_18.2.0-1_all.deb ... -Unpacking python3-attr (18.2.0-1) ... -Selecting previously unselected package python3-soupsieve. -Preparing to unpack .../201-python3-soupsieve_1.8+dfsg-1_all.deb ... -Unpacking python3-soupsieve (1.8+dfsg-1) ... -Selecting previously unselected package python3-bs4. -Preparing to unpack .../202-python3-bs4_4.7.1-1_all.deb ... -Unpacking python3-bs4 (4.7.1-1) ... -Selecting previously unselected package python3-cffi-backend. -Preparing to unpack .../203-python3-cffi-backend_1.12.2-1_amd64.deb ... -Unpacking python3-cffi-backend (1.12.2-1) ... -Selecting previously unselected package python3-chardet. -Preparing to unpack .../204-python3-chardet_3.0.4-3_all.deb ... -Unpacking python3-chardet (3.0.4-3) ... -Selecting previously unselected package python3-crypto. -Preparing to unpack .../205-python3-crypto_2.6.1-9+b1_amd64.deb ... -Unpacking python3-crypto (2.6.1-9+b1) ... -Selecting previously unselected package python3-cryptography. -Preparing to unpack .../206-python3-cryptography_2.6.1-3_amd64.deb ... -Unpacking python3-cryptography (2.6.1-3) ... -Selecting previously unselected package python3-cvxopt. -Preparing to unpack .../207-python3-cvxopt_1.1.9+dfsg-3+b1_amd64.deb ... -Unpacking python3-cvxopt (1.1.9+dfsg-3+b1) ... -Selecting previously unselected package python3-cycler. -Preparing to unpack .../208-python3-cycler_0.10.0-1_all.deb ... -Unpacking python3-cycler (0.10.0-1) ... -Selecting previously unselected package python3-dbus. -Preparing to unpack .../209-python3-dbus_1.2.8-3_amd64.deb ... -Unpacking python3-dbus (1.2.8-3) ... -Selecting previously unselected package python3.7-dev. -Preparing to unpack .../210-python3.7-dev_3.7.3-2_amd64.deb ... -Unpacking python3.7-dev (3.7.3-2) ... -Selecting previously unselected package python3-dev. -Preparing to unpack .../211-python3-dev_3.7.3-1_amd64.deb ... -Unpacking python3-dev (3.7.3-1) ... -Selecting previously unselected package python3-gi. -Preparing to unpack .../212-python3-gi_3.30.4-1_amd64.deb ... -Unpacking python3-gi (3.30.4-1) ... -Selecting previously unselected package python3-ipykernel. -Preparing to unpack .../213-python3-ipykernel_4.9.0-1_all.deb ... -Unpacking python3-ipykernel (4.9.0-1) ... -Selecting previously unselected package python3-joblib. -Preparing to unpack .../214-python3-joblib_0.13.0-2_all.deb ... -Unpacking python3-joblib (0.13.0-2) ... -Selecting previously unselected package python3-secretstorage. -Preparing to unpack .../215-python3-secretstorage_2.3.1-2_all.deb ... -Unpacking python3-secretstorage (2.3.1-2) ... -Selecting previously unselected package python3-keyring. -Preparing to unpack .../216-python3-keyring_17.1.1-1_all.deb ... -Unpacking python3-keyring (17.1.1-1) ... -Selecting previously unselected package python3-keyrings.alt. -Preparing to unpack .../217-python3-keyrings.alt_3.1.1-1_all.deb ... -Unpacking python3-keyrings.alt (3.1.1-1) ... -Selecting previously unselected package python3-kiwisolver. -Preparing to unpack .../218-python3-kiwisolver_1.0.1-2+b1_amd64.deb ... -Unpacking python3-kiwisolver (1.0.1-2+b1) ... -Selecting previously unselected package python3-lxml:amd64. -Preparing to unpack .../219-python3-lxml_4.3.2-1_amd64.deb ... -Unpacking python3-lxml:amd64 (4.3.2-1) ... -Selecting previously unselected package python3-pyparsing. -Preparing to unpack .../220-python3-pyparsing_2.2.0+dfsg1-2_all.deb ... -Unpacking python3-pyparsing (2.2.0+dfsg1-2) ... -Selecting previously unselected package python3-numpy. -Preparing to unpack .../221-python3-numpy_1%3a1.16.2-1_amd64.deb ... -Unpacking python3-numpy (1:1.16.2-1) ... -Selecting previously unselected package python3-matplotlib. -Preparing to unpack .../222-python3-matplotlib_3.0.2-2_amd64.deb ... -Unpacking python3-matplotlib (3.0.2-2) ... -Selecting previously unselected package python3-more-itertools. -Preparing to unpack .../223-python3-more-itertools_4.2.0-1_all.deb ... -Unpacking python3-more-itertools (4.2.0-1) ... -Selecting previously unselected package python3-numexpr. -Preparing to unpack .../224-python3-numexpr_2.6.9-1_amd64.deb ... -Unpacking python3-numexpr (2.6.9-1) ... -Selecting previously unselected package python3-olefile. -Preparing to unpack .../225-python3-olefile_0.46-1_all.deb ... -Unpacking python3-olefile (0.46-1) ... -Selecting previously unselected package python3-tz. -Preparing to unpack .../226-python3-tz_2019.1-1_all.deb ... -Unpacking python3-tz (2019.1-1) ... -Selecting previously unselected package python3-pandas-lib. -Preparing to unpack .../227-python3-pandas-lib_0.23.3+dfsg-3_amd64.deb ... -Unpacking python3-pandas-lib (0.23.3+dfsg-3) ... -Selecting previously unselected package python3-pandas. -Preparing to unpack .../228-python3-pandas_0.23.3+dfsg-3_all.deb ... -Unpacking python3-pandas (0.23.3+dfsg-3) ... -Selecting previously unselected package python3-patsy. -Preparing to unpack .../229-python3-patsy_0.5.0+git13-g54dcf7b-1_all.deb ... -Unpacking python3-patsy (0.5.0+git13-g54dcf7b-1) ... -Selecting previously unselected package python3-pil:amd64. -Preparing to unpack .../230-python3-pil_5.4.1-2_amd64.deb ... -Unpacking python3-pil:amd64 (5.4.1-2) ... -Selecting previously unselected package python3-pip. -Preparing to unpack .../231-python3-pip_18.1-5_all.deb ... -Unpacking python3-pip (18.1-5) ... -Selecting previously unselected package python3-pluggy. -Preparing to unpack .../232-python3-pluggy_0.8.0-1_all.deb ... -Unpacking python3-pluggy (0.8.0-1) ... -Selecting previously unselected package python3-psutil. -Preparing to unpack .../233-python3-psutil_5.5.1-1_amd64.deb ... -Unpacking python3-psutil (5.5.1-1) ... -Selecting previously unselected package python3-py. -Preparing to unpack .../234-python3-py_1.7.0-2_all.deb ... -Unpacking python3-py (1.7.0-2) ... -Selecting previously unselected package python3-pytest. -Preparing to unpack .../235-python3-pytest_3.10.1-2_all.deb ... -Unpacking python3-pytest (3.10.1-2) ... -Selecting previously unselected package python3-scipy. -Preparing to unpack .../236-python3-scipy_1.1.0-7_amd64.deb ... -Unpacking python3-scipy (1.1.0-7) ... -Selecting previously unselected package python3-setuptools. -Preparing to unpack .../237-python3-setuptools_40.8.0-1_all.deb ... -Unpacking python3-setuptools (40.8.0-1) ... -Selecting previously unselected package python3-simplejson. -Preparing to unpack .../238-python3-simplejson_3.16.0-1_amd64.deb ... -Unpacking python3-simplejson (3.16.0-1) ... -Selecting previously unselected package python3-statsmodels-lib. -Preparing to unpack .../239-python3-statsmodels-lib_0.8.0-9_amd64.deb ... -Unpacking python3-statsmodels-lib (0.8.0-9) ... -Selecting previously unselected package python3-statsmodels. -Preparing to unpack .../240-python3-statsmodels_0.8.0-9_all.deb ... -Unpacking python3-statsmodels (0.8.0-9) ... -Selecting previously unselected package python3-tables-lib. -Preparing to unpack .../241-python3-tables-lib_3.4.4-2_amd64.deb ... -Unpacking python3-tables-lib (3.4.4-2) ... -Selecting previously unselected package python3-tables. -Preparing to unpack .../242-python3-tables_3.4.4-2_all.deb ... -Unpacking python3-tables (3.4.4-2) ... -Selecting previously unselected package python3-tk:amd64. -Preparing to unpack .../243-python3-tk_3.7.3-1_amd64.deb ... -Unpacking python3-tk:amd64 (3.7.3-1) ... -Selecting previously unselected package python3-wheel. -Preparing to unpack .../244-python3-wheel_0.32.3-2_all.deb ... -Unpacking python3-wheel (0.32.3-2) ... -Selecting previously unselected package python3-xdg. -Preparing to unpack .../245-python3-xdg_0.25-5_all.deb ... -Unpacking python3-xdg (0.25-5) ... -Selecting previously unselected package shared-mime-info. -Preparing to unpack .../246-shared-mime-info_1.10-1_amd64.deb ... -Unpacking shared-mime-info (1.10-1) ... -Selecting previously unselected package xdg-user-dirs. -Preparing to unpack .../247-xdg-user-dirs_0.17-2_amd64.deb ... -Unpacking xdg-user-dirs (0.17-2) ... -Setting up perl-modules-5.28 (5.28.1-6) ... -Setting up libksba8:amd64 (1.3.5-2) ... -Setting up javascript-common (11) ... -Setting up liblcms2-2:amd64 (2.9-3) ... -Setting up lsb-base (10.2019051400) ... -Setting up libxau6:amd64 (1:1.0.8-1+b2) ... -Setting up libkeyutils1:amd64 (1.6-6) ... -Setting up libapparmor1:amd64 (2.13.2-10) ... -Setting up ttf-bitstream-vera (1.10-8) ... -Setting up libsodium23:amd64 (1.0.17-1) ... -Setting up libgpm2:amd64 (1.20.7-5) ... -Setting up mime-support (3.62) ... -Setting up libgslcblas0:amd64 (2.5+dfsg-6) ... -Setting up xdg-user-dirs (0.17-2) ... -Setting up libmagic-mgc (1:5.35-4) ... -Setting up psmisc (23.2-1) ... -Setting up libyaml-0-2:amd64 (0.2.1-1) ... -Setting up libglib2.0-0:amd64 (2.58.3-2) ... -No schema files found: doing nothing. -Setting up manpages (4.16-2) ... -Setting up fonts-lyx (2.3.2-1) ... -Setting up libprocps7:amd64 (2:3.3.15-2) ... -Setting up libsqlite3-0:amd64 (3.27.2-3) ... -Setting up libsasl2-modules:amd64 (2.1.27+dfsg-1) ... -Setting up libnorm1:amd64 (1.5.8+dfsg2-1) ... -Setting up binutils-common:amd64 (2.31.1-16) ... -Setting up x11-common (1:7.7+19) ... -debconf: unable to initialize frontend: Dialog -debconf: (TERM is not set, so the dialog frontend is not usable.) -debconf: falling back to frontend: Readline -update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults -invoke-rc.d: could not determine current runlevel -invoke-rc.d: policy-rc.d denied execution of start. -Setting up libmagic1:amd64 (1:5.35-4) ... -Setting up linux-libc-dev:amd64 (4.19.37-5+deb10u1) ... -Setting up liblzo2-2:amd64 (2.10-0.1) ... -Setting up libnpth0:amd64 (1.6-1) ... -Setting up krb5-locales (1.17-3) ... -Setting up libmetis5:amd64 (5.1.0.dfsg-5+b2) ... -Setting up file (1:5.35-4) ... -Setting up libassuan0:amd64 (2.5.2-1) ... -Setting up libgomp1:amd64 (8.3.0-6) ... -Setting up bzip2 (1.0.6-9.1) ... -Setting up libldap-common (2.4.47+dfsg-3) ... -Setting up libjbig0:amd64 (2.1-3.1+b2) ... -Setting up libaec0:amd64 (1.0.2-1) ... -Setting up libicu63:amd64 (63.1-6) ... -Setting up libfakeroot:amd64 (1.23-1) ... -Setting up libsnappy1v5:amd64 (1.1.7-1) ... -Setting up libkrb5support0:amd64 (1.17-3) ... -Setting up libsasl2-modules-db:amd64 (2.1.27+dfsg-1) ... -Setting up fakeroot (1.23-1) ... -update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode -Setting up libasan5:amd64 (8.3.0-6) ... -Setting up libglib2.0-data (2.58.3-2) ... -Setting up libjpeg62-turbo:amd64 (1:1.5.2-2+b1) ... -Setting up libx11-data (2:1.6.7-1) ... -Setting up make (4.2.1-1.2) ... -Setting up libmpfr6:amd64 (4.0.2-1) ... -Setting up gnupg-l10n (2.2.12-1) ... -Setting up libgsl23:amd64 (2.5+dfsg-6) ... -Setting up libncurses6:amd64 (6.1+20181013-2) ... -Setting up libdbus-1-3:amd64 (1.12.16-1) ... -Setting up dbus (1.12.16-1) ... -invoke-rc.d: could not determine current runlevel -invoke-rc.d: policy-rc.d denied execution of start. -Setting up xz-utils (5.2.4-1) ... -update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode -Setting up libquadmath0:amd64 (8.3.0-6) ... -Setting up libimagequant0:amd64 (2.12.2-1.1) ... -Setting up libpng16-16:amd64 (1.6.36-6) ... -Setting up libmpc3:amd64 (1.1.0-1) ... -Setting up libatomic1:amd64 (8.3.0-6) ... -Setting up patch (2.7.6-3) ... -Setting up libtcl8.6:amd64 (8.6.9+dfsg-2) ... -Setting up libwebp6:amd64 (0.6.1-2) ... -Setting up libk5crypto3:amd64 (1.17-3) ... -Setting up libltdl7:amd64 (2.4.6-9) ... -Setting up libfftw3-double3:amd64 (3.3.8-2) ... -Setting up libsasl2-2:amd64 (2.1.27+dfsg-1) ... -Setting up libgfortran5:amd64 (8.3.0-6) ... -Setting up libmpx2:amd64 (8.3.0-6) ... -Setting up libubsan1:amd64 (8.3.0-6) ... -Setting up libisl19:amd64 (0.20-2) ... -Setting up sensible-utils (0.0.12) ... -Setting up procps (2:3.3.15-2) ... -update-alternatives: using /usr/bin/w.procps to provide /usr/bin/w (w) in auto mode -Setting up liblua5.1-0:amd64 (5.1.5-8.1+b2) ... -Setting up libblosc1 (1.15.1+ds1-1) ... -Setting up libgirepository-1.0-1:amd64 (1.58.3-2) ... -Setting up netbase (5.6) ... -Setting up libkrb5-3:amd64 (1.17-3) ... -Setting up libtiff5:amd64 (4.0.10-4) ... -Setting up libmpdec2:amd64 (2.4.2-2) ... -Setting up pandoc-data (2.2.1-3) ... -Setting up libjs-jquery (3.3.1~dfsg-3) ... -Setting up libbinutils:amd64 (2.31.1-16) ... -Setting up cpp-8 (8.3.0-6) ... -Setting up libc-dev-bin (2.28-10) ... -Setting up python-matplotlib-data (3.0.2-2) ... -Setting up openssl (1.1.1c-1) ... -Setting up libwebpmux3:amd64 (0.6.1-2) ... -Setting up libbsd0:amd64 (0.9.1-2) ... -Setting up readline-common (7.0-5) ... -Setting up libxml2:amd64 (2.9.4+dfsg1-7+b3) ... -Setting up python-tables-data (3.4.4-2) ... -Setting up libsuitesparseconfig5:amd64 (1:5.4.0+dfsg-1) ... -Setting up libcc1-0:amd64 (8.3.0-6) ... -Setting up liblocale-gettext-perl (1.07-3+b4) ... -Setting up liblsan0:amd64 (8.3.0-6) ... -Setting up libsz2:amd64 (1.0.2-1) ... -Setting up libitm1:amd64 (8.3.0-6) ... -Setting up libreadline7:amd64 (7.0-5) ... -Setting up libpgm-5.2-0:amd64 (5.2.122~dfsg-3) ... -Setting up libgdbm6:amd64 (1.18.1-4) ... -Setting up gnupg-utils (2.2.12-1) ... -Setting up binutils-x86-64-linux-gnu (2.31.1-16) ... -Setting up libtsan0:amd64 (8.3.0-6) ... -Setting up pinentry-curses (1.1.0-2) ... -Setting up libamd2:amd64 (1:5.4.0+dfsg-1) ... -Setting up manpages-dev (4.16-2) ... -Setting up libxdmcp6:amd64 (1:1.1.2-3) ... -Setting up libpython3.7-stdlib:amd64 (3.7.3-2) ... -Setting up libxcb1:amd64 (1.13.1-2) ... -Setting up libcolamd2:amd64 (1:5.4.0+dfsg-1) ... -Setting up libpython3.7:amd64 (3.7.3-2) ... -Setting up libwebpdemux2:amd64 (0.6.1-2) ... -Setting up libldap-2.4-2:amd64 (2.4.47+dfsg-3) ... -Setting up binutils (2.31.1-16) ... -Setting up ca-certificates (20190110) ... -debconf: unable to initialize frontend: Dialog -debconf: (TERM is not set, so the dialog frontend is not usable.) -debconf: falling back to frontend: Readline -Updating certificates in /etc/ssl/certs... -128 added, 0 removed; done. -Setting up libcamd2:amd64 (1:5.4.0+dfsg-1) ... -Setting up libblas3:amd64 (3.8.0-2) ... -update-alternatives: using /usr/lib/x86_64-linux-gnu/blas/libblas.so.3 to provide /usr/lib/x86_64-linux-gnu/libblas.so.3 (libblas.so.3-x86_64-linux-gnu) in auto mode -Setting up libjs-jquery-ui (1.12.1+dfsg-5) ... -Setting up pandoc (2.2.1-3+b2) ... -Setting up libfreetype6:amd64 (2.9.1-3) ... -Setting up libglpk40:amd64 (4.65-2) ... -Setting up libhdf5-103:amd64 (1.10.4+repack-10) ... -Setting up shared-mime-info (1.10-1) ... -Setting up libgssapi-krb5-2:amd64 (1.17-3) ... -Setting up libgdbm-compat4:amd64 (1.18.1-4) ... -Setting up ucf (3.0038+nmu1) ... -debconf: unable to initialize frontend: Dialog -debconf: (TERM is not set, so the dialog frontend is not usable.) -debconf: falling back to frontend: Readline -Setting up gir1.2-glib-2.0:amd64 (1.58.3-2) ... -Setting up libgcc-8-dev:amd64 (8.3.0-6) ... -Setting up libperl5.28:amd64 (5.28.1-6) ... -Setting up libccolamd2:amd64 (1:5.4.0+dfsg-1) ... -Setting up cpp (4:8.3.0-1) ... -Setting up libxslt1.1:amd64 (1.1.32-2) ... -Setting up gpgconf (2.2.12-1) ... -Setting up libc6-dev:amd64 (2.28-10) ... -Setting up libx11-6:amd64 (2:1.6.7-1) ... -Setting up python-pip-whl (18.1-5) ... -Setting up gpg (2.2.12-1) ... -Setting up libpython3-stdlib:amd64 (3.7.3-1) ... -Setting up libstdc++-8-dev:amd64 (8.3.0-6) ... -Setting up python3.7 (3.7.3-2) ... -Setting up liblapack3:amd64 (3.8.0-2) ... -update-alternatives: using /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3 to provide /usr/lib/x86_64-linux-gnu/liblapack.so.3 (liblapack.so.3-x86_64-linux-gnu) in auto mode -Setting up gcc-8 (8.3.0-6) ... -Setting up gpg-agent (2.2.12-1) ... -Setting up libzmq5:amd64 (4.3.1-4+deb10u1) ... -Setting up libxrender1:amd64 (1:0.9.10-1) ... -Setting up fontconfig-config (2.13.1-2) ... -debconf: unable to initialize frontend: Dialog -debconf: (TERM is not set, so the dialog frontend is not usable.) -debconf: falling back to frontend: Readline -Setting up gpgsm (2.2.12-1) ... -Setting up libxext6:amd64 (2:1.3.3-1+b2) ... -Setting up python3 (3.7.3-1) ... -running python rtupdate hooks for python3.7... -running python post-rtupdate hooks for python3.7... -Setting up python3-pandocfilters (1.4.2-1) ... -Setting up python3-xdg (0.25-5) ... -Setting up python3-markupsafe (1.1.0-1) ... -Setting up python3-wheel (0.32.3-2) ... -Setting up python3-webencodings (0.5.1-1) ... -Setting up python3-psutil (5.5.1-1) ... -Setting up python3-tz (2019.1-1) ... -Setting up gcc (4:8.3.0-1) ... -Setting up python3-atomicwrites (1.1.5-2) ... -Setting up python3-six (1.12.0-1) ... -Setting up python3-simplejson (3.16.0-1) ... -Setting up dirmngr (2.2.12-1) ... -Setting up python3-pil:amd64 (5.4.1-2) ... -Setting up python3-decorator (4.3.0-1.1) ... -Setting up perl (5.28.1-6) ... -Setting up python3-jinja2 (2.10-2) ... -Setting up python3-pygments (2.3.1+dfsg-1) ... -Setting up libexpat1-dev:amd64 (2.2.6-2) ... -Setting up python3-wcwidth (0.1.7+dfsg1-3) ... -Setting up python3-pyparsing (2.2.0+dfsg1-2) ... -Setting up libdsdp-5.8gf (5.8-9.4) ... -Setting up python3-testpath (0.4.2+dfsg-1) ... -Setting up python3-zmq (17.1.2-2) ... -Setting up python3-gi (3.30.4-1) ... -Setting up python3-cycler (0.10.0-1) ... -Setting up python3-html5lib (1.0.1-1) ... -Setting up python3-pickleshare (0.7.5-1) ... -Setting up libdpkg-perl (1.19.7) ... -Setting up python3-pluggy (0.8.0-1) ... -Setting up gpg-wks-server (2.2.12-1) ... -Setting up g++-8 (8.3.0-6) ... -Setting up python3-lxml:amd64 (4.3.2-1) ... -Setting up python3-crypto (2.6.1-9+b1) ... -Setting up python3-dateutil (2.7.3-3) ... -Setting up libxss1:amd64 (1:1.2.3-1) ... -Setting up libfontconfig1:amd64 (2.13.1-2) ... -Setting up python3-simplegeneric (0.8.1-2) ... -Setting up python3-lib2to3 (3.7.3-1) ... -Setting up python3-mistune (0.8.4-1) ... -Setting up python3-asn1crypto (0.24.0-1) ... -Setting up python3-soupsieve (1.8+dfsg-1) ... -Setting up libcholmod3:amd64 (1:5.4.0+dfsg-1) ... -Setting up python3-cffi-backend (1.12.2-1) ... -Setting up python3-ptyprocess (0.6.0-1) ... -Setting up python3-pkg-resources (40.8.0-1) ... -Setting up python3-entrypoints (0.3-1) ... -Setting up python3-prompt-toolkit (1.0.15-1) ... -Setting up python3-distutils (3.7.3-1) ... -Setting up dh-python (3.20190308) ... -Setting up python3-more-itertools (4.2.0-1) ... -Setting up python3-attr (18.2.0-1) ... -Setting up python3-tornado (5.1.1-4) ... -Setting up python3-dbus (1.2.8-3) ... -Setting up libxft2:amd64 (2.3.2-2) ... -Setting up python3-setuptools (40.8.0-1) ... -Setting up gpg-wks-client (2.2.12-1) ... -Setting up python3-py (1.7.0-2) ... -Setting up python3-joblib (0.13.0-2) ... -Setting up libfile-fcntllock-perl (0.22-3+b5) ... -Setting up python3-defusedxml (0.5.0-2) ... -Setting up libalgorithm-diff-perl (1.19.03-2) ... -Setting up python3-ipython-genutils (0.2.0-1) ... -Setting up python3-pytest (3.10.1-2) ... -Setting up libpython3.7-dev:amd64 (3.7.3-2) ... -Setting up python3-olefile (0.46-1) ... -Setting up libtk8.6:amd64 (8.6.9-2) ... -Setting up python3.7-dev (3.7.3-2) ... -Setting up python3-bs4 (4.7.1-1) ... -Setting up dpkg-dev (1.19.7) ... -Setting up python3-bleach (3.1.0-1) ... -Setting up python3-chardet (3.0.4-3) ... -Setting up libumfpack5:amd64 (1:5.4.0+dfsg-1) ... -Setting up python3-jsonschema (2.6.0-4) ... -update-alternatives: using /usr/bin/python3-jsonschema to provide /usr/bin/jsonschema (jsonschema) in auto mode -Setting up python3-pexpect (4.6.0-1) ... -Setting up python3-cryptography (2.6.1-3) ... -Setting up python3-kiwisolver (1.0.1-2+b1) ... -Setting up python3-pip (18.1-5) ... -Setting up python3-numpy (1:1.16.2-1) ... -Setting up g++ (4:8.3.0-1) ... -update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode -Setting up python3-traitlets (4.3.2-1) ... -Setting up python3-keyrings.alt (3.1.1-1) ... -Setting up gnupg (2.2.12-1) ... -Setting up build-essential (12.6) ... -Setting up libalgorithm-diff-xs-perl (0.04-5+b1) ... -Setting up python3-statsmodels-lib (0.8.0-9) ... -Setting up python3-jupyter-core (4.4.0-2) ... -Setting up libalgorithm-merge-perl (0.08-3) ... -Setting up tk8.6-blt2.5 (2.5.3+dfsg-4) ... -Setting up python3-matplotlib (3.0.2-2) ... -Setting up python3-scipy (1.1.0-7) ... -Setting up libpython3-dev:amd64 (3.7.3-1) ... -Setting up python3-cvxopt (1.1.9+dfsg-3+b1) ... -Setting up python3-tables-lib (3.4.4-2) ... -Setting up blt (2.5.3+dfsg-4) ... -Setting up python3-pandas-lib (0.23.3+dfsg-3) ... -Setting up python3-tk:amd64 (3.7.3-1) ... -Setting up python3-nbformat (4.4.0-1) ... -Setting up python3-patsy (0.5.0+git13-g54dcf7b-1) ... -Setting up python3-pandas (0.23.3+dfsg-3) ... -Setting up python3-secretstorage (2.3.1-2) ... -Setting up python3-ipython (5.8.0-1) ... -Setting up python3-dev (3.7.3-1) ... -Setting up python3-numexpr (2.6.9-1) ... -Setting up python3-statsmodels (0.8.0-9) ... -Setting up python3-keyring (17.1.1-1) ... -Setting up python3-jupyter-client (5.2.3-1) ... -Setting up python3-tables (3.4.4-2) ... -Setting up python3-ipykernel (4.9.0-1) ... -Setting up python3-nbconvert (5.4-2) ... -Setting up jupyter-nbconvert (5.4-2) ... -Processing triggers for libc-bin (2.28-10) ... -Processing triggers for ca-certificates (20190110) ... -Updating certificates in /etc/ssl/certs... -0 added, 0 removed; done. -Running hooks in /etc/ca-certificates/update.d... -done. - ---> 9d49dddc5394 -Removing intermediate container e2a4b2e6b46b -Successfully built 9d49dddc5394 -#+end_example - -Je n'ai pas précisé de nom à mon image. Je le fais maintenant. -#+begin_src shell :results output :exports both -docker tag 9d49dddc5394 debian_stable_jupyter_dockerfile:latest -docker image ls -#+end_src - -#+RESULTS: -#+begin_example -REPOSITORY TAG IMAGE ID CREATED SIZE -debian_stable_jupyter_dockerfile latest 9d49dddc5394 4 minutes ago 960MB -debian_stable_jupyter latest 2b001b2c02a6 About an hour ago 962MB -simgrid-website latest 0f3727380ab6 13 days ago 1.19GB -debian stable 40e13c3c9aab 13 days ago 114MB -#+end_example - -Bon, l'environnement ainsi construit n'est pas rigoureusement -identique à celui que j'ai construit manuellement. Je vais vérifier -s'il me permet d'obtenir les mêmes résultats: - -#+begin_src shell :session *shell* :results output :exports both -cp notebook.ipynb notebook_docker_dockerfile.ipynb -docker run --volume=`pwd`:/tmp debian_stable_jupyter jupyter-nbconvert --to notebook --execute /tmp/notebook_docker_dockerfile.ipynb --output /tmp/notebook_docker_dockerfile.ipynb -docker run --volume=`pwd`:/tmp debian_stable_jupyter jupyter-nbconvert --to html /tmp/notebook_docker_dockerfile.ipynb -#+end_src - -#+RESULTS: -: -: [NbConvertApp] Converting notebook /tmp/notebook_docker_dockerfile.ipynb to notebook -: [NbConvertApp] Executing notebook with kernel: python3 -: [NbConvertApp] Writing 41346 bytes to /tmp/notebook_docker_dockerfile.ipynb -: [NbConvertApp] Converting notebook /tmp/notebook_docker_dockerfile.ipynb to html -: [NbConvertApp] Writing 317721 bytes to /tmp/notebook_docker_dockerfile.html - -#+begin_src shell :session *shell* :results output :exports both -ls -l -#+end_src - -#+RESULTS: -#+begin_example -total 1412 --rw-r--r-- 1 alegrand alegrand 305302 Jul 23 09:20 notebook.html --rw-r--r-- 1 alegrand alegrand 41019 Jul 23 09:19 notebook.ipynb --rw-r--r-- 1 root root 317832 Jul 23 10:10 notebook_docker.html --rw-r--r-- 1 alegrand alegrand 41473 Jul 23 10:10 notebook_docker.ipynb --rw-r--r-- 1 root root 317843 Jul 23 11:13 notebook_docker_dockerfile.html --rw-r--r-- 1 alegrand alegrand 41473 Jul 23 11:13 notebook_docker_dockerfile.ipynb --rw-r--r-- 1 alegrand alegrand 305805 Jul 23 09:21 notebook_rerun.html --rw-r--r-- 1 alegrand alegrand 41473 Jul 23 09:21 notebook_rerun.ipynb --rw-r--r-- 1 alegrand alegrand 485 Jul 23 09:19 shuttle.csv -#+end_example - -Ah, au moins, cette fois-ci, les deux derniers notebooks -=notebook_docker_dockerfile.ipynb= et =notebook_docker.ipynb= ont la même -taille. - -#+begin_src shell :session *shell* :results output :exports both -diff notebook_docker.ipynb notebook_docker_dockerfile.ipynb # | sed 's/^/>/' -#+end_src - -#+RESULTS: -: -: 538c538 -: < " Time: 08:10:00 Pearson chi2: 0.236 \n", -: --- -: > " Time: 09:13:51 Pearson chi2: 0.236 \n", -: 567c567 -: < "Time: 08:10:00 Pearson chi2: 0.236\n", -: --- -: > "Time: 09:13:51 Pearson chi2: 0.236\n", - -Ouf, cette fois-ci, il n'y a plus que la date qui ait changé. -*** Mettre son image à disposition -Reste à publier mon image. Je me suis créé un compte sur dockerhub -afin de pouvoir y publier des images (vous pouvez aussi vous -authentifier via github). Une fois que vous aurez votre login et votre -mot de passe, il vous faudra les fournir au docker de votre machine -via cette commande: -# https://docs.docker.com/engine/reference/commandline/push/ - -#+begin_src shell :session *shell* :results output :exports both -docker login # login: alegrand38 passwd: XXXXXXXXXXX -#+end_src - -Il vous faudra ensuite donner à votre image docker le nom qui -apparaîtra sur dockerhub. Je choisis ici mon login suivi de -=moocrr_jupyter=: -#+begin_src shell :session *shell* :results output :exports both -docker tag debian_stable_jupyter_dockerfile alegrand38/moocrr_jupyter -#+end_src - -#+RESULTS: - -Je peux enfin publier mon image (attention, si vous êtes derrière une -connexion ADSL, c'est long!): -#+begin_src shell :results output :exports both -docker push alegrand38/moocrr_jupyter -#+end_src - -#+RESULTS: -#+begin_example -The push refers to a repository [docker.io/alegrand38/moocrr_jupyter] -92d1efe6875b: Pushing [=====================================> ] 638.8MB/846.4MB -92d1efe6875b: Pushed - -latest: digest: sha256:310d1018e5bfb831aa429b58d9b4073e68200c644ae92de1bc5e7f24ac6e6dd3 size: 742 -#+end_example - -Vous pouvez remarquer que deux "images" ont été poussées: une petite -de 200MB et une grosse de 846MB. La première correspond à l'image de -base que nous avons utilisée et la seconde à ce qui a été -rajouté/modifié à la suite de notre mise à jour et de l'installation -de python et de jupyter. - -Vos collègues peuvent maintenant récupérer cette image sans problème -et la réutiliser. -** Tester que votre code s'exécute correctement ailleurs que sur votre machine. -Je montrerais ensuite CI (sur la branche master) et comment utiliser -ces commandes pour que l'image soit capable d'exécuter notre notebook. - -https://docs.gitlab.com/ee/ci/quick_start/ - -*** Création d'un projet test et mise en place de l'intégration continue -Je commence par créer un projet jouet sur gitlab, que je clone ensuite -sur mon disque. -#+begin_src shell :results output :exports both -git clone git@gitlab.inria.fr:learninglab/mooc-rr/test_jupyter.git -#+end_src - -#+RESULTS: - -#+begin_src shell :results output :exports both -ls test_jupyter/ -#+end_src - -#+RESULTS: -: README.md - -Parfait, maintenant, nous mettons à la racine de ce dépot une fichier -=.gitlab-ci.yml= qui va partir d'une image docker et effectuer une série -de commandes. - -#+begin_src shell :results output :exports both :tangle test_jupyter/.gitlab-ci.yml.old -image: "debian:stable" - -before_script: - - perl -v - - which perl - -perl_addition: - script: - - perl -e "print(3+2);" - -perl_multiplication: - script: - - perl -e "print(3*2);" -#+end_src - -#+begin_src shell :results output :exports both -cd test_jupyter -git add .gitlab-ci.yml -git commit -m "Adding a gitlab-ci file" -git push -#+end_src - -#+RESULTS: -: [master b74a444] Adding a gitlab-ci file -: 1 file changed, 13 insertions(+) -: create mode 100644 .gitlab-ci.yml - - -On peut ensuite aller sur la page des commits: -- https://gitlab.inria.fr/learninglab/mooc-rr/test_jupyter/commits/ -- https://gitlab.inria.fr/learninglab/mooc-rr/test_jupyter/commit/b74a444042bf081cf72b12b932494702d11d0299/pipelines?ref=master - - -*** Et maintenant, Jupyter avec notre image docker! -Copions notre notebook et ses données dans notre projet: - -#+begin_src shell :results output :exports both -cd test_jupyter/ -cp ../mooc_docker/notebook.ipynb ../mooc_docker/shuttle.csv ./ -git add notebook.ipynb shuttle.csv -git commit -m "Adding a jupyter notebook" -git push -#+end_src - -#+RESULTS: -: [master cd67d8b] Adding a jupyter notebook -: 2 files changed, 737 insertions(+) -: create mode 100644 notebook.ipynb -: create mode 100644 shuttle.csv - -Changeons le docker file. - -#+begin_src shell :results output :exports both :tangle test_jupyter/.gitlab-ci.yml.old2 -image: "debian:stable" - -before_script: - - apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels - - python3 --version - - jupyter-nbconvert --version - -jupyter: - script: - - jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.ipynb - - jupyter-nbconvert --to html notebook.ipynb -#+end_src - -#+begin_src shell :results output :exports both -cd test_jupyter -git add .gitlab-ci.yml -git commit -m "Updating gitlab-ci file for Jupyter" -git push -#+end_src - -#+RESULTS: -: [master 0b796ae] Updating gitlab-ci file for Jupyter -: 1 file changed, 1 insertion(+), 4 deletions(-) - -Problème, en faisant cela à chaque fois, c'est: - A. Très lent (au moindre commit de correction orthographique), on - fait télécharger des tonnes de paquets. - B. Pas stable puisqu'on reconstruit sans rien maîtriser. - -Une meilleur solution: -#+begin_src shell :results output :exports both :tangle test_jupyter/.gitlab-ci.yml -jupyter_frozen: - image: "alegrand38/moocrr_jupyter" - before_script: - - python3 --version - - jupyter-nbconvert --version - script: - - jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.ipynb - - jupyter-nbconvert --to html notebook.ipynb - -jupyter_uptodate: - image: "debian:stable" - before_script: - - apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels - - python3 --version - - jupyter-nbconvert --version - script: - - jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.ipynb - - jupyter-nbconvert --to html notebook.ipynb -#+end_src - -#+begin_src shell :results output :exports both -cd test_jupyter -git add .gitlab-ci.yml -git commit -m "Updating gitlab-ci file for Jupyter" -git push -#+end_src - -#+RESULTS: -: [master a84baef] Updating gitlab-ci file for Jupyter -: 1 file changed, 4 insertions(+), 5 deletions(-) - - -Première chose à faire: activer l'intégration continue: -- https://gitlab.inria.fr/learninglab/mooc-rr/test_jupyter/edit - (Settings/General/Permissions) -- Passer par le container registry de gitlab ? - -Puis: https://gitlab.inria.fr/alegrand/test_jupyter/pipelines -- Mais https://gitlab.inria.fr/alegrand/test_jupyter/pipelines/88234: - stuck car pas de runner configuré. -- https://gitlab.inria.fr/alegrand/test_jupyter/-/settings/ci_cd - (Settings/CI-CD) - - Shared runners are disabled for the INRIA Gitlab instance. - -** Améliorer le test - Je peux alors montrer (a) comment utiliser l'environnement figé pour - s'assurer que nos propres modifications du notebook n'ont rien cassé - et (b) comment utiliser l'environnement qui se met à jour - régulièrement pour s'assurer que l'évolution de l'extérieur ne remet - pas en cause nos résultats. -** Aller plus loin -7. Enfin, pour s'occuper du point (B) sans passer par un docker - build/push manuel, je montrerais comment (sur une debian, par - exemple) améliorer le dockerfile afin d'expliciter les numéros de - version et de figer les sources des paquets. Tout est alors - explicite, figé, et construit sur une autre machine, ce qui ne - garantie rien mais renforce les chances que quelqu'un d'autre arrive - à reproduire cet environnement. Ça ouvre la voie à nix/guix qui - permettent d'expliciter finement tout ça mais dont je maîtrise mal - l'interaction avec docker. Mais je demanderai aux Nixiens autour de - moi ou à Ludovic Courtes. - -Une fois le push effectué, une information bien plus précise que le -dockerfile: - -#+begin_src shell :results output :exports both -docker run alegrand38/moocrr_jupyter dpkg --list -#+end_src - -#+RESULTS: -#+begin_example -Desired=Unknown/Install/Remove/Purge/Hold -| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend -|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) -||/ Name Version Architecture Description -+++-===========================-======================-============-=============================================================================== -ii adduser 3.118 all add and remove users and groups -ii apt 1.8.2 amd64 commandline package manager -ii base-files 10.3 amd64 Debian base system miscellaneous files -ii base-passwd 3.5.46 amd64 Debian base system master password and group files -ii bash 5.0-4 amd64 GNU Bourne Again SHell -ii binutils 2.31.1-16 amd64 GNU assembler, linker and binary utilities -ii binutils-common:amd64 2.31.1-16 amd64 Common files for the GNU assembler, linker and binary utilities -ii binutils-x86-64-linux-gnu 2.31.1-16 amd64 GNU binary utilities, for x86-64-linux-gnu target -ii blt 2.5.3+dfsg-4 amd64 graphics extension library for Tcl/Tk - run-time -ii bsdutils 1:2.33.1-0.1 amd64 basic utilities from 4.4BSD-Lite -ii build-essential 12.6 amd64 Informational list of build-essential packages -ii bzip2 1.0.6-9.1 amd64 high-quality block-sorting file compressor - utilities -ii ca-certificates 20190110 all Common CA certificates -ii coreutils 8.30-3 amd64 GNU core utilities -ii cpp 4:8.3.0-1 amd64 GNU C preprocessor (cpp) -ii cpp-8 8.3.0-6 amd64 GNU C preprocessor -ii dash 0.5.10.2-5 amd64 POSIX-compliant shell -ii dbus 1.12.16-1 amd64 simple interprocess messaging system (daemon and utilities) -ii debconf 1.5.71 all Debian configuration management system -ii debian-archive-keyring 2019.1 all GnuPG archive keys of the Debian archive -ii debianutils 4.8.6.1 amd64 Miscellaneous utilities specific to Debian -ii dh-python 3.20190308 all Debian helper tools for packaging Python libraries and applications -ii diffutils 1:3.7-3 amd64 File comparison utilities -ii dirmngr 2.2.12-1 amd64 GNU privacy guard - network certificate management service -ii dpkg 1.19.7 amd64 Debian package management system -ii dpkg-dev 1.19.7 all Debian package development tools -ii e2fsprogs 1.44.5-1 amd64 ext2/ext3/ext4 file system utilities -ii fakeroot 1.23-1 amd64 tool for simulating superuser privileges -ii fdisk 2.33.1-0.1 amd64 collection of partitioning utilities -ii file 1:5.35-4 amd64 Recognize the type of data in a file using "magic" numbers -ii findutils 4.6.0+git+20190209-2 amd64 utilities for finding files--find, xargs -ii fontconfig-config 2.13.1-2 all generic font configuration library - configuration -ii fonts-lyx 2.3.2-1 all TrueType versions of some TeX fonts used by LyX -ii g++ 4:8.3.0-1 amd64 GNU C++ compiler -ii g++-8 8.3.0-6 amd64 GNU C++ compiler -ii gcc 4:8.3.0-1 amd64 GNU C compiler -ii gcc-8 8.3.0-6 amd64 GNU C compiler -ii gcc-8-base:amd64 8.3.0-6 amd64 GCC, the GNU Compiler Collection (base package) -ii gir1.2-glib-2.0:amd64 1.58.3-2 amd64 Introspection data for GLib, GObject, Gio and GModule -ii gnupg 2.2.12-1 all GNU privacy guard - a free PGP replacement -ii gnupg-l10n 2.2.12-1 all GNU privacy guard - localization files -ii gnupg-utils 2.2.12-1 amd64 GNU privacy guard - utility programs -ii gpg 2.2.12-1 amd64 GNU Privacy Guard -- minimalist public key operations -ii gpg-agent 2.2.12-1 amd64 GNU privacy guard - cryptographic agent -ii gpg-wks-client 2.2.12-1 amd64 GNU privacy guard - Web Key Service client -ii gpg-wks-server 2.2.12-1 amd64 GNU privacy guard - Web Key Service server -ii gpgconf 2.2.12-1 amd64 GNU privacy guard - core configuration utilities -ii gpgsm 2.2.12-1 amd64 GNU privacy guard - S/MIME version -ii gpgv 2.2.12-1 amd64 GNU privacy guard - signature verification tool -ii grep 3.3-1 amd64 GNU grep, egrep and fgrep -ii gzip 1.9-3 amd64 GNU compression utilities -ii hostname 3.21 amd64 utility to set/show the host name or domain name -ii init-system-helpers 1.56+nmu1 all helper tools for all init systems -ii iproute2 4.20.0-2 amd64 networking and traffic control tools -ii iputils-ping 3:20180629-2 amd64 Tools to test the reachability of network hosts -ii javascript-common 11 all Base support for JavaScript library packages -ii jupyter-nbconvert 5.4-2 all Jupyter notebook conversion (scripts) -ii krb5-locales 1.17-3 all internationalization support for MIT Kerberos -ii libacl1:amd64 2.2.53-4 amd64 access control list - shared library -ii libaec0:amd64 1.0.2-1 amd64 Adaptive Entropy Coding library -ii libalgorithm-diff-perl 1.19.03-2 all module to find differences between files -ii libalgorithm-diff-xs-perl 0.04-5+b1 amd64 module to find differences between files (XS accelerated) -ii libalgorithm-merge-perl 0.08-3 all Perl module for three-way merge of textual data -ii libamd2:amd64 1:5.4.0+dfsg-1 amd64 approximate minimum degree ordering library for sparse matrices -ii libapparmor1:amd64 2.13.2-10 amd64 changehat AppArmor library -ii libapt-pkg5.0:amd64 1.8.2 amd64 package management runtime library -ii libasan5:amd64 8.3.0-6 amd64 AddressSanitizer -- a fast memory error detector -ii libassuan0:amd64 2.5.2-1 amd64 IPC library for the GnuPG components -ii libatomic1:amd64 8.3.0-6 amd64 support library providing __atomic built-in functions -ii libattr1:amd64 1:2.4.48-4 amd64 extended attribute handling - shared library -ii libaudit-common 1:2.8.4-3 all Dynamic library for security auditing - common files -ii libaudit1:amd64 1:2.8.4-3 amd64 Dynamic library for security auditing -ii libbinutils:amd64 2.31.1-16 amd64 GNU binary utilities (private shared library) -ii libblas3:amd64 3.8.0-2 amd64 Basic Linear Algebra Reference implementations, shared library -ii libblkid1:amd64 2.33.1-0.1 amd64 block device ID library -ii libblosc1 1.15.1+ds1-1 amd64 high performance meta-compressor optimized for binary data -ii libbsd0:amd64 0.9.1-2 amd64 utility functions from BSD systems - shared library -ii libbz2-1.0:amd64 1.0.6-9.1 amd64 high-quality block-sorting file compressor library - runtime -ii libc-bin 2.28-10 amd64 GNU C Library: Binaries -ii libc-dev-bin 2.28-10 amd64 GNU C Library: Development binaries -ii libc6:amd64 2.28-10 amd64 GNU C Library: Shared libraries -ii libc6-dev:amd64 2.28-10 amd64 GNU C Library: Development Libraries and Header Files -ii libcamd2:amd64 1:5.4.0+dfsg-1 amd64 symmetric approximate minimum degree library for sparse matrices -ii libcap-ng0:amd64 0.7.9-2 amd64 An alternate POSIX capabilities library -ii libcap2:amd64 1:2.25-2 amd64 POSIX 1003.1e capabilities (library) -ii libcap2-bin 1:2.25-2 amd64 POSIX 1003.1e capabilities (utilities) -ii libcc1-0:amd64 8.3.0-6 amd64 GCC cc1 plugin for GDB -ii libccolamd2:amd64 1:5.4.0+dfsg-1 amd64 constrained column approximate library for sparse matrices -ii libcholmod3:amd64 1:5.4.0+dfsg-1 amd64 sparse Cholesky factorization library for sparse matrices -ii libcolamd2:amd64 1:5.4.0+dfsg-1 amd64 column approximate minimum degree ordering library for sparse matrices -ii libcom-err2:amd64 1.44.5-1 amd64 common error description library -ii libdb5.3:amd64 5.3.28+dfsg1-0.5 amd64 Berkeley v5.3 Database Libraries [runtime] -ii libdbus-1-3:amd64 1.12.16-1 amd64 simple interprocess messaging system (library) -ii libdebconfclient0:amd64 0.249 amd64 Debian Configuration Management System (C-implementation library) -ii libdpkg-perl 1.19.7 all Dpkg perl modules -ii libdsdp-5.8gf 5.8-9.4 amd64 Software for Semidefinite Programming -ii libelf1:amd64 0.176-1.1 amd64 library to read and write ELF files -ii libexpat1:amd64 2.2.6-2 amd64 XML parsing C library - runtime library -ii libexpat1-dev:amd64 2.2.6-2 amd64 XML parsing C library - development kit -ii libext2fs2:amd64 1.44.5-1 amd64 ext2/ext3/ext4 file system libraries -ii libfakeroot:amd64 1.23-1 amd64 tool for simulating superuser privileges - shared libraries -ii libfdisk1:amd64 2.33.1-0.1 amd64 fdisk partitioning library -ii libffi6:amd64 3.2.1-9 amd64 Foreign Function Interface library runtime -ii libfftw3-double3:amd64 3.3.8-2 amd64 Library for computing Fast Fourier Transforms - Double precision -ii libfile-fcntllock-perl 0.22-3+b5 amd64 Perl module for file locking with fcntl(2) -ii libfontconfig1:amd64 2.13.1-2 amd64 generic font configuration library - runtime -ii libfreetype6:amd64 2.9.1-3 amd64 FreeType 2 font engine, shared library files -ii libgcc-8-dev:amd64 8.3.0-6 amd64 GCC support library (development files) -ii libgcc1:amd64 1:8.3.0-6 amd64 GCC support library -ii libgcrypt20:amd64 1.8.4-5 amd64 LGPL Crypto library - runtime library -ii libgdbm-compat4:amd64 1.18.1-4 amd64 GNU dbm database routines (legacy support runtime version) -ii libgdbm6:amd64 1.18.1-4 amd64 GNU dbm database routines (runtime version) -ii libgfortran5:amd64 8.3.0-6 amd64 Runtime library for GNU Fortran applications -ii libgirepository-1.0-1:amd64 1.58.3-2 amd64 Library for handling GObject introspection data (runtime library) -ii libglib2.0-0:amd64 2.58.3-2 amd64 GLib library of C routines -ii libglib2.0-data 2.58.3-2 all Common files for GLib library -ii libglpk40:amd64 4.65-2 amd64 linear programming kit with integer (MIP) support -ii libgmp10:amd64 2:6.1.2+dfsg-4 amd64 Multiprecision arithmetic library -ii libgnutls30:amd64 3.6.7-4 amd64 GNU TLS library - main runtime library -ii libgomp1:amd64 8.3.0-6 amd64 GCC OpenMP (GOMP) support library -ii libgpg-error0:amd64 1.35-1 amd64 GnuPG development runtime library -ii libgpm2:amd64 1.20.7-5 amd64 General Purpose Mouse - shared library -ii libgsl23:amd64 2.5+dfsg-6 amd64 GNU Scientific Library (GSL) -- library package -ii libgslcblas0:amd64 2.5+dfsg-6 amd64 GNU Scientific Library (GSL) -- blas library package -ii libgssapi-krb5-2:amd64 1.17-3 amd64 MIT Kerberos runtime libraries - krb5 GSS-API Mechanism -ii libhdf5-103:amd64 1.10.4+repack-10 amd64 Hierarchical Data Format 5 (HDF5) - runtime files - serial version -ii libhogweed4:amd64 3.4.1-1 amd64 low level cryptographic library (public-key cryptos) -ii libicu63:amd64 63.1-6 amd64 International Components for Unicode -ii libidn2-0:amd64 2.0.5-1 amd64 Internationalized domain names (IDNA2008/TR46) library -ii libimagequant0:amd64 2.12.2-1.1 amd64 palette quantization library -ii libisl19:amd64 0.20-2 amd64 manipulating sets and relations of integer points bounded by linear constraints -ii libitm1:amd64 8.3.0-6 amd64 GNU Transactional Memory Library -ii libjbig0:amd64 2.1-3.1+b2 amd64 JBIGkit libraries -ii libjpeg62-turbo:amd64 1:1.5.2-2+b1 amd64 libjpeg-turbo JPEG runtime library -ii libjs-jquery 3.3.1~dfsg-3 all JavaScript library for dynamic web applications -ii libjs-jquery-ui 1.12.1+dfsg-5 all JavaScript UI library for dynamic web applications -ii libk5crypto3:amd64 1.17-3 amd64 MIT Kerberos runtime libraries - Crypto Library -ii libkeyutils1:amd64 1.6-6 amd64 Linux Key Management Utilities (library) -ii libkrb5-3:amd64 1.17-3 amd64 MIT Kerberos runtime libraries -ii libkrb5support0:amd64 1.17-3 amd64 MIT Kerberos runtime libraries - Support library -ii libksba8:amd64 1.3.5-2 amd64 X.509 and CMS support library -ii liblapack3:amd64 3.8.0-2 amd64 Library of linear algebra routines 3 - shared version -ii liblcms2-2:amd64 2.9-3 amd64 Little CMS 2 color management library -ii libldap-2.4-2:amd64 2.4.47+dfsg-3 amd64 OpenLDAP libraries -ii libldap-common 2.4.47+dfsg-3 all OpenLDAP common files for libraries -ii liblocale-gettext-perl 1.07-3+b4 amd64 module using libc functions for internationalization in Perl -ii liblsan0:amd64 8.3.0-6 amd64 LeakSanitizer -- a memory leak detector (runtime) -ii libltdl7:amd64 2.4.6-9 amd64 System independent dlopen wrapper for GNU libtool -ii liblua5.1-0:amd64 5.1.5-8.1+b2 amd64 Shared library for the Lua interpreter version 5.1 -ii liblz4-1:amd64 1.8.3-1 amd64 Fast LZ compression algorithm library - runtime -ii liblzma5:amd64 5.2.4-1 amd64 XZ-format compression library -ii liblzo2-2:amd64 2.10-0.1 amd64 data compression library -ii libmagic-mgc 1:5.35-4 amd64 File type determination library using "magic" numbers (compiled magic file) -ii libmagic1:amd64 1:5.35-4 amd64 Recognize the type of data in a file using "magic" numbers - library -ii libmetis5:amd64 5.1.0.dfsg-5+b2 amd64 Serial Graph Partitioning and Fill-reducing Matrix Ordering -ii libmnl0:amd64 1.0.4-2 amd64 minimalistic Netlink communication library -ii libmount1:amd64 2.33.1-0.1 amd64 device mounting library -ii libmpc3:amd64 1.1.0-1 amd64 multiple precision complex floating-point library -ii libmpdec2:amd64 2.4.2-2 amd64 library for decimal floating point arithmetic (runtime library) -ii libmpfr6:amd64 4.0.2-1 amd64 multiple precision floating-point computation -ii libmpx2:amd64 8.3.0-6 amd64 Intel memory protection extensions (runtime) -ii libncurses6:amd64 6.1+20181013-2 amd64 shared libraries for terminal handling -ii libncursesw6:amd64 6.1+20181013-2 amd64 shared libraries for terminal handling (wide character support) -ii libnettle6:amd64 3.4.1-1 amd64 low level cryptographic library (symmetric and one-way cryptos) -ii libnorm1:amd64 1.5.8+dfsg2-1 amd64 NACK-Oriented Reliable Multicast (NORM) library -ii libnpth0:amd64 1.6-1 amd64 replacement for GNU Pth using system threads -ii libp11-kit0:amd64 0.23.15-2 amd64 library for loading and coordinating access to PKCS#11 modules - runtime -ii libpam-modules:amd64 1.3.1-5 amd64 Pluggable Authentication Modules for PAM -ii libpam-modules-bin 1.3.1-5 amd64 Pluggable Authentication Modules for PAM - helper binaries -ii libpam-runtime 1.3.1-5 all Runtime support for the PAM library -ii libpam0g:amd64 1.3.1-5 amd64 Pluggable Authentication Modules library -ii libpcre3:amd64 2:8.39-12 amd64 Old Perl 5 Compatible Regular Expression Library - runtime files -ii libperl5.28:amd64 5.28.1-6 amd64 shared Perl library -ii libpgm-5.2-0:amd64 5.2.122~dfsg-3 amd64 OpenPGM shared library -ii libpng16-16:amd64 1.6.36-6 amd64 PNG library - runtime (version 1.6) -ii libprocps7:amd64 2:3.3.15-2 amd64 library for accessing process information from /proc -ii libpython3-dev:amd64 3.7.3-1 amd64 header files and a static library for Python (default) -ii libpython3-stdlib:amd64 3.7.3-1 amd64 interactive high-level object-oriented language (default python3 version) -ii libpython3.7:amd64 3.7.3-2 amd64 Shared Python runtime library (version 3.7) -ii libpython3.7-dev:amd64 3.7.3-2 amd64 Header files and a static library for Python (v3.7) -ii libpython3.7-minimal:amd64 3.7.3-2 amd64 Minimal subset of the Python language (version 3.7) -ii libpython3.7-stdlib:amd64 3.7.3-2 amd64 Interactive high-level object-oriented language (standard library, version 3.7) -ii libquadmath0:amd64 8.3.0-6 amd64 GCC Quad-Precision Math Library -ii libreadline7:amd64 7.0-5 amd64 GNU readline and history libraries, run-time libraries -ii libsasl2-2:amd64 2.1.27+dfsg-1 amd64 Cyrus SASL - authentication abstraction library -ii libsasl2-modules:amd64 2.1.27+dfsg-1 amd64 Cyrus SASL - pluggable authentication modules -ii libsasl2-modules-db:amd64 2.1.27+dfsg-1 amd64 Cyrus SASL - pluggable authentication modules (DB) -ii libseccomp2:amd64 2.3.3-4 amd64 high level interface to Linux seccomp filter -ii libselinux1:amd64 2.8-1+b1 amd64 SELinux runtime shared libraries -ii libsemanage-common 2.8-2 all Common files for SELinux policy management libraries -ii libsemanage1:amd64 2.8-2 amd64 SELinux policy management library -ii libsepol1:amd64 2.8-1 amd64 SELinux library for manipulating binary security policies -ii libsmartcols1:amd64 2.33.1-0.1 amd64 smart column output alignment library -ii libsnappy1v5:amd64 1.1.7-1 amd64 fast compression/decompression library -ii libsodium23:amd64 1.0.17-1 amd64 Network communication, cryptography and signaturing library -ii libsqlite3-0:amd64 3.27.2-3 amd64 SQLite 3 shared library -ii libss2:amd64 1.44.5-1 amd64 command-line interface parsing library -ii libssl1.1:amd64 1.1.1c-1 amd64 Secure Sockets Layer toolkit - shared libraries -ii libstdc++-8-dev:amd64 8.3.0-6 amd64 GNU Standard C++ Library v3 (development files) -ii libstdc++6:amd64 8.3.0-6 amd64 GNU Standard C++ Library v3 -ii libsuitesparseconfig5:amd64 1:5.4.0+dfsg-1 amd64 configuration routines for all SuiteSparse modules -ii libsystemd0:amd64 241-5 amd64 systemd utility library -ii libsz2:amd64 1.0.2-1 amd64 Adaptive Entropy Coding library - SZIP -ii libtasn1-6:amd64 4.13-3 amd64 Manage ASN.1 structures (runtime) -ii libtcl8.6:amd64 8.6.9+dfsg-2 amd64 Tcl (the Tool Command Language) v8.6 - run-time library files -ii libtiff5:amd64 4.0.10-4 amd64 Tag Image File Format (TIFF) library -ii libtinfo6:amd64 6.1+20181013-2 amd64 shared low-level terminfo library for terminal handling -ii libtk8.6:amd64 8.6.9-2 amd64 Tk toolkit for Tcl and X11 v8.6 - run-time files -ii libtsan0:amd64 8.3.0-6 amd64 ThreadSanitizer -- a Valgrind-based detector of data races (runtime) -ii libubsan1:amd64 8.3.0-6 amd64 UBSan -- undefined behaviour sanitizer (runtime) -ii libudev1:amd64 241-5 amd64 libudev shared library -ii libumfpack5:amd64 1:5.4.0+dfsg-1 amd64 sparse LU factorization library -ii libunistring2:amd64 0.9.10-1 amd64 Unicode string library for C -ii libuuid1:amd64 2.33.1-0.1 amd64 Universally Unique ID library -ii libwebp6:amd64 0.6.1-2 amd64 Lossy compression of digital photographic images. -ii libwebpdemux2:amd64 0.6.1-2 amd64 Lossy compression of digital photographic images. -ii libwebpmux3:amd64 0.6.1-2 amd64 Lossy compression of digital photographic images. -ii libx11-6:amd64 2:1.6.7-1 amd64 X11 client-side library -ii libx11-data 2:1.6.7-1 all X11 client-side library -ii libxau6:amd64 1:1.0.8-1+b2 amd64 X11 authorisation library -ii libxcb1:amd64 1.13.1-2 amd64 X C Binding -ii libxdmcp6:amd64 1:1.1.2-3 amd64 X11 Display Manager Control Protocol library -ii libxext6:amd64 2:1.3.3-1+b2 amd64 X11 miscellaneous extension library -ii libxft2:amd64 2.3.2-2 amd64 FreeType-based font drawing library for X -ii libxml2:amd64 2.9.4+dfsg1-7+b3 amd64 GNOME XML library -ii libxrender1:amd64 1:0.9.10-1 amd64 X Rendering Extension client library -ii libxslt1.1:amd64 1.1.32-2 amd64 XSLT 1.0 processing library - runtime library -ii libxss1:amd64 1:1.2.3-1 amd64 X11 Screen Saver extension library -ii libxtables12:amd64 1.8.2-4 amd64 netfilter xtables library -ii libyaml-0-2:amd64 0.2.1-1 amd64 Fast YAML 1.1 parser and emitter library -ii libzmq5:amd64 4.3.1-4+deb10u1 amd64 lightweight messaging kernel (shared library) -ii libzstd1:amd64 1.3.8+dfsg-3 amd64 fast lossless compression algorithm -ii linux-libc-dev:amd64 4.19.37-5+deb10u1 amd64 Linux support headers for userspace development -ii login 1:4.5-1.1 amd64 system login tools -ii lsb-base 10.2019051400 all Linux Standard Base init script functionality -ii make 4.2.1-1.2 amd64 utility for directing compilation -ii manpages 4.16-2 all Manual pages about using a GNU/Linux system -ii manpages-dev 4.16-2 all Manual pages about using GNU/Linux for development -ii mawk 1.3.3-17+b3 amd64 a pattern scanning and text processing language -ii mime-support 3.62 all MIME files 'mime.types' & 'mailcap', and support programs -ii mount 2.33.1-0.1 amd64 tools for mounting and manipulating filesystems -ii ncurses-base 6.1+20181013-2 all basic terminal type definitions -ii ncurses-bin 6.1+20181013-2 amd64 terminal-related programs and man pages -ii netbase 5.6 all Basic TCP/IP networking system -ii openssl 1.1.1c-1 amd64 Secure Sockets Layer toolkit - cryptographic utility -ii pandoc 2.2.1-3+b2 amd64 general markup converter -ii pandoc-data 2.2.1-3 all general markup converter - data files -ii passwd 1:4.5-1.1 amd64 change and administer password and group data -ii patch 2.7.6-3 amd64 Apply a diff file to an original -ii perl 5.28.1-6 amd64 Larry Wall's Practical Extraction and Report Language -ii perl-base 5.28.1-6 amd64 minimal Perl system -ii perl-modules-5.28 5.28.1-6 all Core Perl modules -ii pinentry-curses 1.1.0-2 amd64 curses-based PIN or pass-phrase entry dialog for GnuPG -ii procps 2:3.3.15-2 amd64 /proc file system utilities -ii psmisc 23.2-1 amd64 utilities that use the proc file system -ii python-matplotlib-data 3.0.2-2 all Python based plotting system (data package) -ii python-pip-whl 18.1-5 all Python package installer -ii python-tables-data 3.4.4-2 all hierarchical database for Python based on HDF5 - test data -ii python3 3.7.3-1 amd64 interactive high-level object-oriented language (default python3 version) -ii python3-asn1crypto 0.24.0-1 all Fast ASN.1 parser and serializer (Python 3) -ii python3-atomicwrites 1.1.5-2 all Atomic file writes - Python 3.x -ii python3-attr 18.2.0-1 all Attributes without boilerplate (Python 3) -ii python3-bleach 3.1.0-1 all whitelist-based HTML-sanitizing library (Python 3) -ii python3-bs4 4.7.1-1 all error-tolerant HTML parser for Python 3 -ii python3-cffi-backend 1.12.2-1 amd64 Foreign Function Interface for Python 3 calling C code - runtime -ii python3-chardet 3.0.4-3 all universal character encoding detector for Python3 -ii python3-crypto 2.6.1-9+b1 amd64 cryptographic algorithms and protocols for Python 3 -ii python3-cryptography 2.6.1-3 amd64 Python library exposing cryptographic recipes and primitives (Python 3) -ii python3-cvxopt 1.1.9+dfsg-3+b1 amd64 Python3 package for convex optimization -ii python3-cycler 0.10.0-1 all composable kwarg iterator (Python 3) -ii python3-dateutil 2.7.3-3 all powerful extensions to the standard Python 3 datetime module -ii python3-dbus 1.2.8-3 amd64 simple interprocess messaging system (Python 3 interface) -ii python3-decorator 4.3.0-1.1 all simplify usage of Python decorators by programmers -ii python3-defusedxml 0.5.0-2 all XML bomb protection for Python stdlib modules (for Python 3) -ii python3-dev 3.7.3-1 amd64 header files and a static library for Python (default) -ii python3-distutils 3.7.3-1 all distutils package for Python 3.x -ii python3-entrypoints 0.3-1 all Discover and load entry points from installed packages (Python 3) -ii python3-gi 3.30.4-1 amd64 Python 3 bindings for gobject-introspection libraries -ii python3-html5lib 1.0.1-1 all HTML parser/tokenizer based on the WHATWG HTML5 specification -ii python3-ipykernel 4.9.0-1 all IPython kernel for Jupyter (Python 3) -ii python3-ipython 5.8.0-1 all Enhanced interactive Python shell (Python 3 version) -ii python3-ipython-genutils 0.2.0-1 all IPython vestigial utilities for Python 3 -ii python3-jinja2 2.10-2 all small but fast and easy to use stand-alone template engine -ii python3-joblib 0.13.0-2 all tools to provide lightweight pipelining in Python -ii python3-jsonschema 2.6.0-4 all An(other) implementation of JSON Schema (Draft 3 and 4) - Python 3.x -ii python3-jupyter-client 5.2.3-1 all Jupyter protocol client APIs (Python 3) -ii python3-jupyter-core 4.4.0-2 all Core common functionality of Jupyter projects for Python 3 -ii python3-keyring 17.1.1-1 all store and access your passwords safely - Python 3 version of the package -ii python3-keyrings.alt 3.1.1-1 all alternate backend implementations for python3-keyring -ii python3-kiwisolver 1.0.1-2+b1 amd64 fast implementation of the Cassowary constraint solver - Python 3.X -ii python3-lib2to3 3.7.3-1 all Interactive high-level object-oriented language (2to3, version 3.6) -ii python3-lxml:amd64 4.3.2-1 amd64 pythonic binding for the libxml2 and libxslt libraries -ii python3-markupsafe 1.1.0-1 amd64 HTML/XHTML/XML string library for Python 3 -ii python3-matplotlib 3.0.2-2 amd64 Python based plotting system in a style similar to Matlab (Python 3) -ii python3-minimal 3.7.3-1 amd64 minimal subset of the Python language (default python3 version) -ii python3-mistune 0.8.4-1 all Markdown parser for Python 3 -ii python3-more-itertools 4.2.0-1 all library with routines for operating on iterables, beyond itertools (Python 3) -ii python3-nbconvert 5.4-2 all Jupyter notebook conversion (Python 3) -ii python3-nbformat 4.4.0-1 all Jupyter notebook format (Python 3) -ii python3-numexpr 2.6.9-1 amd64 Fast numerical array expression evaluator for Python 3 and NumPy -ii python3-numpy 1:1.16.2-1 amd64 Fast array facility to the Python 3 language -ii python3-olefile 0.46-1 all Python module to read/write MS OLE2 files -ii python3-pandas 0.23.3+dfsg-3 all data structures for "relational" or "labeled" data - Python 3 -ii python3-pandas-lib 0.23.3+dfsg-3 amd64 low-level implementations and bindings for pandas - Python 3 -ii python3-pandocfilters 1.4.2-1 all python3 bindings for Pandoc's filters -ii python3-patsy 0.5.0+git13-g54dcf7b-1 all statistical models in Python using symbolic formulas -ii python3-pexpect 4.6.0-1 all Python 3 module for automating interactive applications -ii python3-pickleshare 0.7.5-1 all File system based database that uses Python pickles for Python 3 -ii python3-pil:amd64 5.4.1-2 amd64 Python Imaging Library (Python3) -ii python3-pip 18.1-5 all Python package installer -ii python3-pkg-resources 40.8.0-1 all Package Discovery and Resource Access using pkg_resources -ii python3-pluggy 0.8.0-1 all plugin and hook calling mechanisms for Python - 3.x -ii python3-prompt-toolkit 1.0.15-1 all library for building interactive command lines (Python 3) -ii python3-psutil 5.5.1-1 amd64 module providing convenience functions for managing processes (Python3) -ii python3-ptyprocess 0.6.0-1 all Run a subprocess in a pseudo terminal from Python 3 -ii python3-py 1.7.0-2 all Advanced Python development support library (Python 3) -ii python3-pygments 2.3.1+dfsg-1 all syntax highlighting package written in Python 3 -ii python3-pyparsing 2.2.0+dfsg1-2 all alternative to creating and executing simple grammars - Python 3.x -ii python3-pytest 3.10.1-2 all Simple, powerful testing in Python3 -ii python3-scipy 1.1.0-7 amd64 scientific tools for Python 3 -ii python3-secretstorage 2.3.1-2 all Python module for storing secrets - Python 3.x version -ii python3-setuptools 40.8.0-1 all Python3 Distutils Enhancements -ii python3-simplegeneric 0.8.1-2 all simple generic functions for Python3 -ii python3-simplejson 3.16.0-1 amd64 simple, fast, extensible JSON encoder/decoder for Python 3.x -ii python3-six 1.12.0-1 all Python 2 and 3 compatibility library (Python 3 interface) -ii python3-soupsieve 1.8+dfsg-1 all modern CSS selector implementation for BeautifulSoup (Python 3) -ii python3-statsmodels 0.8.0-9 all Python3 module for the estimation of statistical models -ii python3-statsmodels-lib 0.8.0-9 amd64 Python3 low-level implementations and bindings for statsmodels -ii python3-tables 3.4.4-2 all hierarchical database for Python3 based on HDF5 -ii python3-tables-lib 3.4.4-2 amd64 hierarchical database for Python3 based on HDF5 (extension) -ii python3-testpath 0.4.2+dfsg-1 all Utilities for Python 3 code working with files and commands -ii python3-tk:amd64 3.7.3-1 amd64 Tkinter - Writing Tk applications with Python 3.x -ii python3-tornado 5.1.1-4 amd64 scalable, non-blocking web server and tools - Python 3 package -ii python3-traitlets 4.3.2-1 all Lightweight Traits-like package for Python 3 -ii python3-tz 2019.1-1 all Python3 version of the Olson timezone database -ii python3-wcwidth 0.1.7+dfsg1-3 all determine printable width of a string on a terminal (Python 3) -ii python3-webencodings 0.5.1-1 all Python implementation of the WHATWG Encoding standard -ii python3-wheel 0.32.3-2 all built-package format for Python -ii python3-xdg 0.25-5 all Python 3 library to access freedesktop.org standards -ii python3-zmq 17.1.2-2 amd64 Python3 bindings for 0MQ library -ii python3.7 3.7.3-2 amd64 Interactive high-level object-oriented language (version 3.7) -ii python3.7-dev 3.7.3-2 amd64 Header files and a static library for Python (v3.7) -ii python3.7-minimal 3.7.3-2 amd64 Minimal subset of the Python language (version 3.7) -ii readline-common 7.0-5 all GNU readline and history libraries, common files -ii sed 4.7-1 amd64 GNU stream editor for filtering/transforming text -ii sensible-utils 0.0.12 all Utilities for sensible alternative selection -ii shared-mime-info 1.10-1 amd64 FreeDesktop.org shared MIME database and spec -ii sysvinit-utils 2.93-8 amd64 System-V-like utilities -ii tar 1.30+dfsg-6 amd64 GNU version of the tar archiving utility -ii tk8.6-blt2.5 2.5.3+dfsg-4 amd64 graphics extension library for Tcl/Tk - library -ii ttf-bitstream-vera 1.10-8 all The Bitstream Vera family of free TrueType fonts -ii tzdata 2019a-1 all time zone and daylight-saving time data -ii ucf 3.0038+nmu1 all Update Configuration File(s): preserve user changes to config files -ii util-linux 2.33.1-0.1 amd64 miscellaneous system utilities -ii x11-common 1:7.7+19 all X Window System (X.Org) infrastructure -ii xdg-user-dirs 0.17-2 amd64 tool to manage well known user directories -ii xz-utils 5.2.4-1 amd64 XZ-format compression utilities -ii zlib1g:amd64 1:1.2.11.dfsg-1 amd64 compression library - runtime -#+end_example - -#+begin_src shell :results output :exports both -dpkg --get-selections # dpkg --set-selections -#+end_src -** Time machine - -From https://www.debian.org/releases/: - -- oldoldstable: jessie (juin 2018) -- oldstable: stretch (avril 2019) -- stable: buster (juillet 2019) -- testing: bullseye -- unstable: sid -*** oldoldstable (jessie) :noexport: - -#+begin_src shell :session *docker* :results output :exports both -docker run -t -i debian:oldoldstable-slim -#+end_src - -#+RESULTS: -: -: echo 'org_babel_sh_eoe' - -#+begin_src shell :session *docker* :results output :exports both -cat /etc/apt/sources.list -#+end_src - -#+RESULTS: -: -: deb http://snapshot.debian.org/archive/debian/20190708T033000Z oldoldstable main -: deb http://deb.debian.org/debian oldoldstable main -: deb http://snapshot.debian.org/archive/debian-security/20190708T033000Z oldoldstable/updates main -: deb http://security.debian.org/debian-security oldoldstable/updates main - - -#+begin_src shell :results output :exports both -mkdir -p mooc_docker_image_oldoldstable -#+end_src - -#+RESULTS: - -#+begin_src shell :results output :exports both :tangle mooc_docker_image_oldoldstable/Dockerfile -FROM debian:oldoldstable - -LABEL maintainer="Arnaud Legrand " - -RUN apt-get update \ - && apt-get install -y python3 \ - jupyter-nbconvert python3-ipykernel \ - python3-matplotlib python3-pandas python3-numpy python3-statsmodels -#+end_src - -#+begin_src shell :results output :exports both -docker build -t debian_oldoldstable_jupyter_dockerfile mooc_docker_image_oldoldstable -#+end_src - -#+RESULTS: - -#+BEGIN_EXAMPLE -The command '/bin/sh -c apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels' returned a non-zero code: 100 -#+END_EXAMPLE - -#+begin_src shell :session *docker* :results output :exports both -for i in python3-ipykernel jupyter-nbconvert python3-matplotlib python3-pandas python3-numpy python3-statsmodels ; do - echo $i; - apt-cache show $i | grep Version ; -done -#+end_src - -#+RESULTS: -#+begin_example -python3-ipykernel -E: No packages found -jupyter-nbconvert -E: No packages found -python3-matplotlib -Version: 1.4.2-3.1 -python3-pandas -Version: 0.14.1-2 -python3-numpy -Version: 1:1.8.2-2 -python3-statsmodels -E: No packages found -#+end_example - -https://snapshot.debian.org/binary/python3-statsmodels/ - -#+begin_src shell :session *docker* :results output :exports both -apt-get install wget -wget https://snapshot.debian.org/archive/debian/20170929T215212Z/pool/main/s/statsmodels/python3-statsmodels_0.8.0-4_all.deb -wget https://snapshot.debian.org/archive/debian-ports/20171026T191424Z/pool/main/n/nbconvert/jupyter-nbconvert_5.3.1-1_all.deb -wget https://snapshot.debian.org/archive/debian-ports/20171026T191424Z/pool/main/n/nbconvert/python3-nbconvert_5.3.1-1_all.deb -dpkg -i python3-statsmodels_0.8.0-4_all.deb jupyter-nbconvert_5.3.1-1_all.deb python3-nbconvert_5.3.1-1_all.deb -apt-get -f install -#+end_src - -#+begin_src shell :session *docker* :results output :exports both -for i in python3-ipykernel jupyter-nbconvert python3-matplotlib python3-pandas python3-numpy python3-statsmodels ; do - echo "===== $i ====="; - dpkg -s $i -done -#+end_src - -#+RESULTS: -#+begin_example -for i in python3-ipykernel jupyter-nbconvert python3-matplotlib python3- pandas python3-numpy python3-statsmodels ; do -echo "===== $i ====="; -dpkg -s $i -done -===== python3-ipykernel ===== -dpkg-query: package 'python3-ipykernel' is not installed and no information is available -Use dpkg --info (= dpkg-deb --info) to examine archive files, -and dpkg --contents (= dpkg-deb --contents) to list their contents. -===== jupyter-nbconvert ===== -dpkg-query: package 'jupyter-nbconvert' is not installed and no information is available -Use dpkg --info (= dpkg-deb --info) to examine archive files, -and dpkg --contents (= dpkg-deb --contents) to list their contents. -===== python3-matplotlib ===== -Package: python3-matplotlib -Status: install ok installed -Priority: optional -Section: python -Installed-Size: 12987 -Architecture: amd64 -Source: matplotlib -Version: 1.4.2-3.1 -= 1.4.2-3.1), python3-pyparsing (>= 1.5.6), python3-six (>= 1.4), python3-tz, libjs-jquery, libjs-jquery-ui, python3-numpy (>= 1:1.8.0), python3-numpy-abi9, python3 (<< 3.5), python3 (>= 3.4~), python3-nose, libc6 (>= 2.14), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:4.1.1), libpng12-0 (>= 1.2.13-4), libstdc++6 (>= 4.6), libtcl8.6 (>= 8.6.0), libtk8.6 (>= 8.6.0) -Recommends: python3-pil, python3-tk -Suggests: dvipng, gir1.2-gtk-3.0, ghostscript, inkscape, ipython3, librsvg2-common, python-matplotlib-doc, python3-cairocffi, python3-gi, python3-gi-cairo, python3-gobject, python3-pyqt4, python3-scipy, python3-sip, python3-tornado, texlive-extra-utils, texlive-latex-extra, ttf-staypuft -Enhances: ipython3 -Description: Python based plotting system in a style similar to Matlab (Python 3) - Matplotlib is a pure Python plotting library designed to bring - publication quality plotting to Python with a syntax familiar to - Matlab users. All of the plotting commands in the pylab interface can - be accessed either via a functional interface familiar to Matlab - users or an object oriented interface familiar to Python users. - . - This package contains the Python 3 version of matplotlib. -Homepage: http://matplotlib.org/ -===== python3-pandas ===== -echo 'org_babel_sh_eoe' -Package: python3-pandas -Status: install ok installed -Priority: optional -Section: python -Installed-Size: 8903 -#+end_example - -#+begin_src shell :session *docker* :results output :exports both -apt-get install python3-numpy +Argh! Les différences insignifiantes comme l'heure ou la date ne sont +pas reportées par notre script mais d'autres différences apparaissent +et elles sont assez alarmantes. +- Les images sont différentes dans les deux cas!!! J'ai donc une + troisième sortie mais difficile de voir en quoi. Il faudrait les + décoder et les comparer comme j'ai fait avant. Puisque j'ai la + valeur, je peux la copier coller et le faire tout de suite: + #+begin_src shell :results output :exports both + echo "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\n" | \ + base64 -d > moocrr_notebook/img1_debian_stable_jupyter.png + #+end_src + + #+RESULTS: + [[file:moocrr_notebook/img1_debian_stable_jupyter.png][file:moocrr_notebook/img1_debian_stable_jupyter.png]] + + Si je la compare à une des précédentes, les différences sont + visibles, c'est l'échelle des abcisses qui a changé. :( + + [[file:moocrr_notebook/img1.png][file:moocrr_notebook/img1.png]] + + Ce n'est donc pas bien grave (et on pourrait rajouter cette nouvelle + sortie à la liste des sorties acceptables) mais cette variabilité + complique singulièrement la mise en place d'un test sur les + images. Comme souvent, c'est l'utilisation des paramètres par défaut + qui pose problème. Nous aurions dû préciser dans notre notebook les + valeurs minimales et maximales à utiliser plutôt que de laisser + matplotlib en décider puisque cette décision évolue au fil des + versions. +- Bien plus génant, le nombre d'itérations pour calculer la régression + logistique n'est pas le même (5 au lieu de 4) et les valeurs de + Log-Likelihood et de Deviance sont très différentes! +Que s'est-il passé ? A priori, ce sont des bibliothèques python +différentes de celles actuellement dans =jupyter/scipy-notebook= et qui +peuvent expliquer ces différences. Quel est le "bon" résultat ? Pas +clair, il faudra creuser. +**** =alegrand38/moocrr_debian_snapshot_jupyter:20171209T114814Z= +Enfin, qu'obtient-on avec une debian de 2017 ? +#+begin_src shell :session *shell* :results output :exports both +docker run --volume=`pwd`:/root/ alegrand38/moocrr_debian_snapshot_jupyter:20171209T114814Z \ + sh -c "cd /root; sh notebook_test.sh" #+end_src #+RESULTS: #+begin_example -Reading package lists... Done -Building dependency tree -Reading state information... Done -You might want to run 'apt-get -f install' to correct these: -The following packages have unmet dependencies: - jupyter-nbconvert : Depends: python3:any (>= 3.3~) - python3-nbconvert : Depends: python3-entrypoints but it is not installable - Depends: python3-ipython (>= 5.0.0) but it is not installable - Depends: python3-jupyter-client but it is not installable - Depends: python3-testpath but it is not installable - Depends: python3-bleach but it is not going to be installed - Depends: python3-jinja2 but it is not going to be installed - Depends: python3-jupyter-core but it is not installable - Depends: python3-mistune but it is not installable - Depends: python3-nbformat but it is not installable - Depends: python3-pandocfilters (>= 1.4) but it is not going to be installed - Depends: python3-pygments but it is not going to be installed - Depends: python3-traitlets but it is not installable - Depends: python3:any (>= 3.3.2-2~) - Recommends: pandoc but it is not going to be installed - python3-numpy : Depends: python3 (>= 3.4~) but it is not going to be installed - Depends: python3 (< 3.5) but it is not going to be installed - Depends: python3.4 but it is not going to be installed - Depends: libblas3 but it is not going to be installed or - libblas.so.3 - Depends: libgfortran3 (>= 4.3) but it is not going to be installed - Depends: liblapack3 but it is not going to be installed or - liblapack.so.3 - Depends: libquadmath0 (>= 4.6) but it is not going to be installed - python3-statsmodels : Depends: python3:any (>= 3.3.2-2~) - Depends: python3-scipy but it is not going to be installed - Depends: python3-statsmodels-lib (>= 0.8.0-4) but it is not installable - Depends: python3-patsy but it is not going to be installed - Depends: python3-pandas but it is not going to be installed - Recommends: python3-matplotlib but it is not going to be installed - Recommends: python3-joblib but it is not going to be installed - Recommends: python3-cvxopt but it is not installable -E: Unmet dependencies. Try 'apt-get -f install' with no packages (or -specify a solution). -#+end_example - -Moralité: c'est l'horreur, vaut mieux oublier de partir d'une distrib -où les paquets n'étaient pas encore rentrés. Il faudrait itérativement -repérer chacun des paquets, un numéro de version qui va bien et les -récuperer sur snapshot... -*** oldstable (stretch, V2 more controled) :noexport: - -#+begin_src shell :session *docker* :results output :exports both -docker run -t -i debian:stretch-20190708-slim -#+end_src - -#+RESULTS: -: Unable to find image 'debian:stretch-20190708-slim' locally -: stretch-20190708-slim: Pulling from library/debian -: -: 0a4690c5d889: Pulling fs layer 0a4690c5d889: Downloading 228.5kB/22.49MB0a4690c5d889: Downloading 457.5kB/22.49MB0a4690c5d889: Downloading 695kB/22.49MB0a4690c5d889: Downloading 920.3kB/22.49MB0a4690c5d889: Downloading 1.15MB/22.49MB0a4690c5d889: Downloading 1.379MB/22.49MB0a4690c5d889: Downloading 1.617MB/22.49MB0a4690c5d889: Downloading 1.85MB/22.49MB0a4690c5d889: Downloading 2.079MB/22.49MB0a4690c5d889: Downloading 2.309MB/22.49MB0a4690c5d889: Downloading 2.538MB/22.49MB0a4690c5d889: Downloading 2.768MB/22.49MB0a4690c5d889: Downloading 2.997MB/22.49MB0a4690c5d889: Downloading 3.226MB/22.49MB0a4690c5d889: Downloading 3.456MB/22.49MB0a4690c5d889: Downloading 3.685MB/22.49MB0a4690c5d889: Downloading 3.919MB/22.49MB0a4690c5d889: Downloading 4.148MB/22.49MB0a4690c5d889: Downloading 4.373MB/22.49MB0a4690c5d889: Downloading 4.603MB/22.49MB0a4690c5d889: Downloading 4.832MB/22.49MB0a4690c5d889: Downloading 5.061MB/22.49MB0a4690c5d889: Downloading 5.291MB/22.49MB0a4690c5d889: Downloading 5.524MB/22.49MB0a4690c5d889: Downloading 5.754MB/22.49MB0a4690c5d889: Downloading 5.991MB/22.49MB0a4690c5d889: Downloading 6.221MB/22.49MB0a4690c5d889: Downloading 6.45MB/22.49MB0a4690c5d889: Downloading 6.675MB/22.49MB0a4690c5d889: Downloading 6.905MB/22.49MB0a4690c5d889: Downloading 7.134MB/22.49MB0a4690c5d889: Downloading 7.372MB/22.49MB0a4690c5d889: Downloading 7.601MB/22.49MB0a4690c5d889: Downloading 7.826MB/22.49MB0a4690c5d889: Downloading 8.06MB/22.49MB0a4690c5d889: Downloading 8.289MB/22.49MB0a4690c5d889: Downloading 8.518MB/22.49MB0a4690c5d889: Downloading 8.748MB/22.49MB0a4690c5d889: Downloading 8.973MB/22.49MB0a4690c5d889: Downloading 9.202MB/22.49MB0a4690c5d889: Downloading 9.432MB/22.49MB0a4690c5d889: Downloading 9.665MB/22.49MB0a4690c5d889: Downloading 9.891MB/22.49MB0a4690c5d889: Downloading 10.12MB/22.49MB0a4690c5d889: Downloading 10.35MB/22.49MB0a4690c5d889: Downloading 10.58MB/22.49MB0a4690c5d889: Downloading 10.82MB/22.49MB0a4690c5d889: Downloading 11.05MB/22.49MB0a4690c5d889: Downloading 11.27MB/22.49MB0a4690c5d889: Downloading 11.5MB/22.49MB0a4690c5d889: Downloading 11.73MB/22.49MB0a4690c5d889: Downloading 11.96MB/22.49MB0a4690c5d889: Downloading 12.19MB/22.49MB0a4690c5d889: Downloading 12.42MB/22.49MB0a4690c5d889: Downloading 12.65MB/22.49MB0a4690c5d889: Downloading 12.88MB/22.49MB0a4690c5d889: Downloading 13.11MB/22.49MB0a4690c5d889: Downloading 13.34MB/22.49MB0a4690c5d889: Downloading 13.57MB/22.49MB0a4690c5d889: Downloading 13.8MB/22.49MB0a4690c5d889: Downloading 14.03MB/22.49MB0a4690c5d889: Downloading 14.26MB/22.49MB0a4690c5d889: Downloading 14.49MB/22.49MB0a4690c5d889: Downloading 14.72MB/22.49MB0a4690c5d889: Downloading 14.95MB/22.49MB0a4690c5d889: Downloading 15.17MB/22.49MB0a4690c5d889: Downloading 15.4MB/22.49MB0a4690c5d889: Downloading 15.63MB/22.49MB0a4690c5d889: Downloading 15.86MB/22.49MB0a4690c5d889: Downloading 16.1MB/22.49MB0a4690c5d889: Downloading 16.33MB/22.49MB0a4690c5d889: Downloading 16.56MB/22.49MB0a4690c5d889: Downloading 16.79MB/22.49MB0a4690c5d889: Downloading 17.02MB/22.49MB0a4690c5d889: Downloading 17.25MB/22.49MB0a4690c5d889: Downloading 17.48MB/22.49MB0a4690c5d889: Downloading 17.71MB/22.49MB0a4690c5d889: Downloading 17.94MB/22.49MB0a4690c5d889: Downloading 18.17MB/22.49MB0a4690c5d889: Downloading 18.39MB/22.49MB0a4690c5d889: Downloading 18.62MB/22.49MB0a4690c5d889: Downloading 18.85MB/22.49MB0a4690c5d889: Downloading 19.08MB/22.49MB0a4690c5d889: Downloading 19.31MB/22.49MB0a4690c5d889: Downloading 19.54MB/22.49MB0a4690c5d889: Downloading 19.77MB/22.49MB0a4690c5d889: Downloading 20MB/22.49MB0a4690c5d889: Downloading 20.22MB/22.49MB0a4690c5d889: Downloading 20.45MB/22.49MB0a4690c5d889: Downloading 20.68MB/22.49MB0a4690c5d889: Downloading 20.91MB/22.49MB0a4690c5d889: Downloading 21.14MB/22.49MB0a4690c5d889: Downloading 21.37MB/22.49MB0a4690c5d889: Downloading 21.6MB/22.49MB0a4690c5d889: Downloading 21.83MB/22.49MB0a4690c5d889: Downloading 22.06MB/22.49MB0a4690c5d889: Downloading 22.29MB/22.49MB0a4690c5d889: Verifying Checksum 0a4690c5d889: Download complete 0a4690c5d889: Extracting 229.4kB/22.49MB0a4690c5d889: Extracting 2.523MB/22.49MB0a4690c5d889: Extracting 5.505MB/22.49MB0a4690c5d889: Extracting 8.258MB/22.49MB0a4690c5d889: Extracting 8.946MB/22.49MB0a4690c5d889: Extracting 11.24MB/22.49MB0a4690c5d889: Extracting 13.53MB/22.49MB0a4690c5d889: Extracting 14.45MB/22.49MB0a4690c5d889: Extracting 15.83MB/22.49MB0a4690c5d889: Extracting 17.89MB/22.49MB0a4690c5d889: Extracting 19.73MB/22.49MB0a4690c5d889: Extracting 20.19MB/22.49MB0a4690c5d889: Extracting 21.33MB/22.49MB0a4690c5d889: Extracting 21.79MB/22.49MB0a4690c5d889: Extracting 22.49MB/22.49MB0a4690c5d889: Pull complete Digest: sha256:0c04edb9ae10feb7ac03a659dd41e16c79e04fdb2b10cf93c3cbcef1fd6cc1d5 -: Status: Downloaded newer image for debian:stretch-20190708-slim - -#+begin_src shell :session *docker* :results output :exports both -cat /etc/apt/sources.list -#+end_src - -#+RESULTS: -: -: deb http://snapshot.debian.org/archive/debian/20190708T033000Z stretch main -: deb http://deb.debian.org/debian stretch main -: deb http://snapshot.debian.org/archive/debian-security/20190708T033000Z stretch/updates main -: deb http://security.debian.org/debian-security stretch/updates main -: deb http://snapshot.debian.org/archive/debian/20190708T033000Z stretch-updates main -: deb http://deb.debian.org/debian stretch-updates main - -#+begin_src shell :session *docker* :results output :exports both -cp /etc/apt/sources.list /etc/apt/sources.list.bak -cat /etc/apt/sources.list.bak | grep snapsho > /etc/apt/sources.list -cat /etc/apt/sources.list -#+end_src - -#+RESULTS: -: cp /etc/apt/sources.list /etc/apt/sources.list.bak -: cat /etc/apt/sources.list.bak | grep snapsho > /etc/apt/sources.list -: cat /etc/apt/sources.list -: deb http://snapshot.debian.org/archive/debian/20190708T033000Z stretch main -: deb http://snapshot.debian.org/archive/debian-security/20190708T033000Z stretch/updates main -: deb http://snapshot.debian.org/archive/debian/20190708T033000Z stretch-updates main - - -# #+begin_src shell :results output :exports both -# mkdir -p mooc_docker_image_oldoldstable -# #+end_src - -# #+RESULTS: - -# #+begin_src shell :results output :exports both :tangle mooc_docker_image_oldoldstable/Dockerfile -# FROM debian:oldoldstable - -# LABEL maintainer="Arnaud Legrand " - -# RUN apt-get update \ -# && apt-get install -y python3 \ -# jupyter-nbconvert python3-ipykernel \ -# python3-matplotlib python3-pandas python3-numpy python3-statsmodels -# #+end_src - -# #+begin_src shell :results output :exports both -# docker build -t debian_oldoldstable_jupyter_dockerfile mooc_docker_image_oldoldstable -# #+end_src - -# #+RESULTS: - -# #+BEGIN_EXAMPLE -# The command '/bin/sh -c apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels' returned a non-zero code: 100 -# #+END_EXAMPLE - -#+begin_src shell :session *docker* :results output :exports both -for i in python3-ipykernel jupyter-nbconvert python3-matplotlib python3-pandas python3-numpy python3-statsmodels ; do - echo $i; - apt-cache show $i | grep Version ; -done -#+end_src -#+RESULTS: -#+begin_example -for i in python3-ipykernel jupyter-nbconvert python3-matplotlib python33-pandas python3-numpy python3-statsmodels ; do -echo $i; -apt-cache show $i | grep Version ; -done -python3-ipykernel -E: No packages found -jupyter-nbconvert -E: No packages found -python3-matplotlib -E: No packages found -python3-pandas -E: No packages found -python3-numpy -E: No packages found -python3-statsmodels -E: No packages found +[NbConvertApp] Converting notebook notebook.ipynb to notebook +[NbConvertApp] Executing notebook with kernel: python3 +[NbConvertApp] Writing 41408 bytes to notebook.nbconvert.ipynb +======= Comparing to correct_output/notebook_orig.ipynb ======= +50,52c50,52 +< "\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", + " \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", + " \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", + " \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", + " \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", + "
DateCountTemperaturePressureMalfunction
04/12/81666500
111/12/81670501
23/22/82669500
311/11/82668500
44/04/83667500
56/18/82672500
68/30/836731000
711/28/836701000
82/03/846572001
94/06/846632001
108/30/846702001
1110/05/846782000
1211/08/846672000
131/24/856532002
144/12/856672000
154/29/856752000
166/17/856702000
177/2903/856812000
188/27/856762000
1910/03/856792000
2010/30/856752002
2111/26/856762000
221/12/866582001
\n", + "" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "0 4/12/81 6 66 50 0\n", + "1 11/12/81 6 70 50 1\n", + "2 3/22/82 6 69 50 0\n", + "3 11/11/82 6 68 50 0\n", + "4 4/04/83 6 67 50 0\n", + "5 6/18/82 6 72 50 0\n", + "6 8/30/83 6 73 100 0\n", + "7 11/28/83 6 70 100 0\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "11 10/05/84 6 78 200 0\n", + "12 11/08/84 6 67 200 0\n", + "13 1/24/85 6 53 200 2\n", + "14 4/12/85 6 67 200 0\n", + "15 4/29/85 6 75 200 0\n", + "16 6/17/85 6 70 200 0\n", + "17 7/2903/85 6 81 200 0\n", + "18 8/27/85 6 76 200 0\n", + "19 10/03/85 6 79 200 0\n", + "20 10/30/85 6 75 200 2\n", + "21 11/26/85 6 76 200 0\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "data = pd.read_csv(\"shuttle.csv\")\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le jeu de données nous indique la date de l'essai, le nombre de joints\n", + "toriques mesurés (il y en a 6 sur le lançeur principal), la\n", + "température (en Farenheit) et la pression (en psi), et enfin le\n", + "nombre de dysfonctionnements relevés. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspection graphique des données\n", + "Les vols où aucun incident n'est relevé n'apportant aucun information\n", + "sur l'influence de la température ou de la pression sur les\n", + "dysfonctionnements, nous nous concentrons sur les expériences où au\n", + "moins un joint a été défectueux.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + "
DateCountTemperaturePressureMalfunction
111/12/81670501
82/03/846572001
94/06/846632001
108/30/846702001
131/24/856532002
2010/30/856752002
221/12/866582001
\n", + "
" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "1 11/12/81 6 70 50 1\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "13 1/24/85 6 53 200 2\n", + "20 10/30/85 6 75 200 2\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data[data.Malfunction>0]\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Très bien, nous avons une variabilité de température importante mais\n", + "la pression est quasiment toujours égale à 200, ce qui devrait\n", + "simplifier l'analyse.\n", + "\n", + "Comment la fréquence d'échecs varie-t-elle avec la température ?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "pd.set_option('mode.chained_assignment',None) # this removes a useless warning from pandas\n", + "import matplotlib.pyplot as plt\n", + "\n", + "data[\"Frequency\"]=data.Malfunction/data.Count\n", + "data.plot(x=\"Temperature\",y=\"Frequency\",kind=\"scatter\",ylim=[0,1])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "À première vue, ce n'est pas flagrant mais bon, essayons quand même\n", + "d'estimer l'impact de la température $t$ sur la probabilité de\n", + "dysfonctionnements d'un joint. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de l'influence de la température\n", + "\n", + "Supposons que chacun des 6 joints toriques est endommagé avec la même\n", + "probabilité et indépendamment des autres et que cette probabilité ne\n", + "dépend que de la température. Si on note $p(t)$ cette probabilité, le\n", + "nombre de joints $D$ dysfonctionnant lorsque l'on effectue le vol à\n", + "température $t$ suit une loi binomiale de paramètre $n=6$ et\n", + "$p=p(t)$. Pour relier $p(t)$ à $t$, on va donc effectuer une\n", + "régression logistique." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:6: DeprecationWarning: Calling Family(..) with a link class as argument is deprecated.\n", + "Use an instance of a link class instead.\n", + " \n" + ] + }, + { + "data": { + "text/html": [ + "\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", + "
Generalized Linear Model Regression Results
Dep. Variable: Frequency No. Observations: 7
Model: GLM Df Residuals: 5
Model Family: Binomial Df Model: 1
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -2.5250
Date: Tue, 20 Aug 2019 Deviance: 0.22231
Time: 09:05:05 Pearson chi2: 0.236
No. Iterations: 4
Covariance Type: nonrobust
\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err z P>|z| [0.025 0.975]
Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953
Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240
" + ], + "text/plain": [ + "\n", + "\"\"\"\n", + " Generalized Linear Model Regression Results \n", + "==============================================================================\n", + "Dep. Variable: Frequency No. Observations: 7\n", + "Model: GLM Df Residuals: 5\n", + "Model Family: Binomial Df Model: 1\n", + "Link Function: logit Scale: 1.0000\n", + "Method: IRLS Log-Likelihood: -2.5250\n", + "Date: Tue, 20 Aug 2019 Deviance: 0.22231\n", + "Time: 09:05:05 Pearson chi2: 0.236\n", + "No. Iterations: 4 \n", + "Covariance Type: nonrobust \n", + "===============================================================================\n", + " coef std err z P>|z| [0.025 0.975]\n", + "-------------------------------------------------------------------------------\n", + "Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953\n", + "Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240\n", + "===============================================================================\n", + "\"\"\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "data[\"Success\"]=data.Count-data.Malfunction\n", + "data[\"Intercept\"]=1\n", + "\n", + "logmodel=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit)).fit()\n", + "\n", + "logmodel.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "L'estimateur le plus probable du paramètre de température est 0.0014\n", + "et l'erreur standard de cet estimateur est de 0.122, autrement dit on\n", + "ne peut pas distinguer d'impact particulier et il faut prendre nos\n", + "estimations avec des pincettes.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de la probabilité de dysfonctionnant des joints toriques\n", + "La température prévue le jour du décollage est de 31°F. Essayons\n", + "d'estimer la probabilité de dysfonctionnement des joints toriques à\n", + "cette température à partir du modèle que nous venons de construire:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAay0lEQVR4nO3dfZRU9Z3n8fenGwgNIoxIMgoayBzSrhsVMYDK6PYYBc2JT7tRJM6YuMMSd2Iy2T1ho+dkVjPRc3YO7hwzGSOyhnGMGR/GVdQcJqBuOs64PqABQSQ8rCHSkAQxo9DaKN393T/u7aa6upuuLqof6ufndU6frnvrd299v1Vdn7p969YtRQRmZpaumqEuwMzMBpaD3swscQ56M7PEOejNzBLnoDczS5yD3swscX0GvaQVkvZIerWX6yXpbyRtl7RB0szKl2lmZuUqZYv+HuDCw1x/ETA9/1kM3HnkZZmZWaX0GfQR8Qzwu8MMuRS4NzLPAxMkHVepAs3M7MiMqMA6JgM7C6ab8nm/Lh4oaTHZVj+jR48+48QTT6zAzQ9P7e3t1NSk+xaI+6teKfcG6fe3devWvRExqT/LVCLo1cO8Hs+rEBHLgeUA9fX1sWXLlgrc/PDU2NhIQ0PDUJcxYNxf9Uq5N0i/P0m/6u8ylXjZawJOKJieAuyuwHrNzKwCKhH0jwPX5EffnAm8ExHddtuYmdnQ6HPXjaT7gQbgWElNwE3ASICIWAasAj4LbAfeA64dqGLNzKz/+gz6iFjYx/UBfKViFZlZVTh48CBNTU0cOHBgqEvpYvz48WzevHmoyzhio0ePZsqUKYwcOfKI11WJN2PN7EOoqamJcePGMXXqVKSejskYGvv372fcuHFDXcYRiQjeeustmpqamDZt2hGvL91jkMxsQB04cICJEycOq5BPhSQmTpxYsf+WHPRmVjaH/MCp5H3roDczS5z30ZtZ1aqtreWUU07pnF65ciUTJ04cwoqGJwe9mVWturo61q9f32Xe/v37Oy+3trYyYoRjzrtuzCwpP/rRj7jiiiu4+OKLmTdvHgBLly5l1qxZnHrqqdx0002dY2+99Vbq6+s5//zzWbhwIbfddhsADQ0NvPTSSwDs3buXqVOnAtDW1saSJUs613XXXXcBh0678PnPf56TTjqJq6++muzIc1i7di1nn302p512GrNnz2b//v2cc845XV6g5s6dy4YNGwbsPvFLnZkdsW8/sYnXdu+r6DpPPv5obrr43x52TEtLCzNmzABg2rRpPProowA899xzbNiwgWOOOYY1a9awbds2XnzxRSKCSy65hGeeeYaxY8fywAMPsG7dOlpbW5k5cyZnnHHGYW/vBz/4AePHj2ft2rW8//77zJ07t/PFZN26dWzatInjjz+euXPn8uyzzzJ79mwWLFjAgw8+yKxZs9i3bx91dXUsWrSIe+65h9tvv52tW7fy/vvvc+qpp1bgXuuZg97MqlZPu24ALrjgAo455hgA1qxZw5o1azj99NMBaG5uZtu2bezfv5/LL7+cMWPGAHDJJZf0eXtr1qxhw4YNPPzwwwC88847bNu2jVGjRjF79mymTJkCwIwZM9ixYwfjx4/nuOOOY9asWQAcffTRAFxxxRV85zvfYenSpaxYsYIvfelLR3ZH9MFBb2ZHrK8t78E2duzYzssRwY033siXv/zlLmNuv/32Xg9hHDFiBO3t7QBdjmWPCL73ve8xf/78LuMbGxv5yEc+0jldW1tLa2srEdHjbYwZM4YLLriAxx57jIceeqhzN9FA8T56M0va/PnzWbFiBc3NzQDs2rWLPXv2cO655/Loo4/S0tLC/v37eeKJJzqXmTp1Ki+//DJA59Z7x7ruvPNODh48CMDWrVt59913e73tk046id27d7N27Voge6O4tbUVgEWLFvG1r32NWbNmdf73MVC8RW9mSZs3bx6bN2/mrLPOAuCoo47ivvvuY+bMmSxYsIAZM2bw8Y9/nHPOOadzmW984xtceeWV/PCHP+S8887rnL9o0SJ27NjBzJkziQgmTZrEypUre73tUaNG8eCDD/LVr36VlpYW6urqeOqppzjqqKM444wzOProo7n22kE4D2REDMnPJz/5yUjZT3/606EuYUC5v+pVqd5ee+21iqyn0vbt21fWcjfddFMsXbq0wtX0bteuXTF9+vRoa2vrdUxP9zHwUvQzb73rxsxskN17773MmTOHW2+9dVC+9tC7bszMgJtvvnnQbuuaa67hmmuuGbTb8xa9mZUtosevh7YKqOR966A3s7KMHj2at956y2E/ACI/H/3o0aMrsj7vujGzskyZMoWmpibefPPNoS6liwMHDlQsIIdSxzdMVYKD3szKMnLkyIp8+1Gl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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "data_pred = pd.DataFrame({'Temperature': np.linspace(start=30, stop=90, num=121), 'Intercept': 1})\n", + "data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])\n", + "data_pred.plot(x=\"Temperature\",y=\"Frequency\",kind=\"line\",ylim=[0,1])\n", + "plt.scatter(x=data[\"Temperature\"],y=data[\"Frequency\"])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hideCode": false, + "hidePrompt": false, + "scrolled": true + }, + "source": [ + "Comme on pouvait s'attendre au vu des données initiales, la\n", + "température n'a pas d'impact notable sur la probabilité d'échec des\n", + "joints toriques. Elle sera d'environ 0.2, comme dans les essais\n", + "précédents où nous il y a eu défaillance d'au moins un joint. Revenons\n", + "à l'ensemble des données initiales pour estimer la probabilité de\n", + "défaillance d'un joint:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.06521739130434782\n" + ] + } + ], + "source": [ + "data = pd.read_csv(\"shuttle.csv\")\n", + "print(np.sum(data.Malfunction)/np.sum(data.Count))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cette probabilité est donc d'environ $p=0.065$, sachant qu'il existe\n", + "un joint primaire un joint secondaire sur chacune des trois parties du\n", + "lançeur, la probabilité de défaillance des deux joints d'un lançeur\n", + "est de $p^2 \\approx 0.00425$. La probabilité de défaillance d'un des\n", + "lançeur est donc de $1-(1-p^2)^3 \\approx 1.2%$. Ça serait vraiment\n", + "pas de chance... Tout est sous contrôle, le décollage peut donc avoir\n", + "lieu demain comme prévu.\n", + "\n", + "Seulement, le lendemain, la navette Challenger explosera et emportera\n", + "avec elle ses sept membres d'équipages. L'opinion publique est\n", + "fortement touchée et lors de l'enquête qui suivra, la fiabilité des\n", + "joints toriques sera directement mise en cause. Au delà des problèmes\n", + "de communication interne à la NASA qui sont pour beaucoup dans ce\n", + "fiasco, l'analyse précédente comporte (au moins) un petit\n", + "problème... Saurez-vous le trouver ? Vous êtes libre de modifier cette\n", + "analyse et de regarder ce jeu de données sous tous les angles afin\n", + "d'expliquer ce qui ne va pas." + ] + } + ], + "metadata": { + "celltoolbar": "Hide code", + "kernelspec": { + "display_name": "Python 3", + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/module4/ressources/moocrr_notebook/correct_output/notebook_orig.ipynb b/module4/ressources/moocrr_notebook/correct_output/notebook_orig.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a2a512d10dfcf2370bcd394297e7ec5cac17d6b7 --- /dev/null +++ b/module4/ressources/moocrr_notebook/correct_output/notebook_orig.ipynb @@ -0,0 +1,713 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analyse du risque de défaillance des joints toriques de la navette Challenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le 27 Janvier 1986, veille du décollage de la navette *Challenger*, eu\n", + "lieu une télé-conférence de trois heures entre les ingénieurs de la\n", + "Morton Thiokol (constructeur d'un des moteurs) et de la NASA. La\n", + "discussion portait principalement sur les conséquences de la\n", + "température prévue au moment du décollage de 31°F (juste en dessous de\n", + "0°C) sur le succès du vol et en particulier sur la performance des\n", + "joints toriques utilisés dans les moteurs. En effet, aucun test\n", + "n'avait été effectué à cette température.\n", + "\n", + "L'étude qui suit reprend donc une partie des analyses effectuées cette\n", + "nuit là et dont l'objectif était d'évaluer l'influence potentielle de\n", + "la température et de la pression à laquelle sont soumis les joints\n", + "toriques sur leur probabilité de dysfonctionnement. Pour cela, nous\n", + "disposons des résultats des expériences réalisées par les ingénieurs\n", + "de la NASA durant les 6 années précédant le lancement de la navette\n", + "Challenger.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chargement des données\n", + "Nous commençons donc par charger ces données:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + "
DateCountTemperaturePressureMalfunction
04/12/81666500
111/12/81670501
23/22/82669500
311/11/82668500
44/04/83667500
56/18/82672500
68/30/836731000
711/28/836701000
82/03/846572001
94/06/846632001
108/30/846702001
1110/05/846782000
1211/08/846672000
131/24/856532002
144/12/856672000
154/29/856752000
166/17/856702000
177/2903/856812000
188/27/856762000
1910/03/856792000
2010/30/856752002
2111/26/856762000
221/12/866582001
\n", + "
" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "0 4/12/81 6 66 50 0\n", + "1 11/12/81 6 70 50 1\n", + "2 3/22/82 6 69 50 0\n", + "3 11/11/82 6 68 50 0\n", + "4 4/04/83 6 67 50 0\n", + "5 6/18/82 6 72 50 0\n", + "6 8/30/83 6 73 100 0\n", + "7 11/28/83 6 70 100 0\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "11 10/05/84 6 78 200 0\n", + "12 11/08/84 6 67 200 0\n", + "13 1/24/85 6 53 200 2\n", + "14 4/12/85 6 67 200 0\n", + "15 4/29/85 6 75 200 0\n", + "16 6/17/85 6 70 200 0\n", + "17 7/2903/85 6 81 200 0\n", + "18 8/27/85 6 76 200 0\n", + "19 10/03/85 6 79 200 0\n", + "20 10/30/85 6 75 200 2\n", + "21 11/26/85 6 76 200 0\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "data = pd.read_csv(\"shuttle.csv\")\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le jeu de données nous indique la date de l'essai, le nombre de joints\n", + "toriques mesurés (il y en a 6 sur le lançeur principal), la\n", + "température (en Farenheit) et la pression (en psi), et enfin le\n", + "nombre de dysfonctionnements relevés. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspection graphique des données\n", + "Les vols où aucun incident n'est relevé n'apportant aucun information\n", + "sur l'influence de la température ou de la pression sur les\n", + "dysfonctionnements, nous nous concentrons sur les expériences où au\n", + "moins un joint a été défectueux.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + "
DateCountTemperaturePressureMalfunction
111/12/81670501
82/03/846572001
94/06/846632001
108/30/846702001
131/24/856532002
2010/30/856752002
221/12/866582001
\n", + "
" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "1 11/12/81 6 70 50 1\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "13 1/24/85 6 53 200 2\n", + "20 10/30/85 6 75 200 2\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data[data.Malfunction>0]\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Très bien, nous avons une variabilité de température importante mais\n", + "la pression est quasiment toujours égale à 200, ce qui devrait\n", + "simplifier l'analyse.\n", + "\n", + "Comment la fréquence d'échecs varie-t-elle avec la température ?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "pd.set_option('mode.chained_assignment',None) # this removes a useless warning from pandas\n", + "import matplotlib.pyplot as plt\n", + "\n", + "data[\"Frequency\"]=data.Malfunction/data.Count\n", + "data.plot(x=\"Temperature\",y=\"Frequency\",kind=\"scatter\",ylim=[0,1])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "À première vue, ce n'est pas flagrant mais bon, essayons quand même\n", + "d'estimer l'impact de la température $t$ sur la probabilité de\n", + "dysfonctionnements d'un joint. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de l'influence de la température\n", + "\n", + "Supposons que chacun des 6 joints toriques est endommagé avec la même\n", + "probabilité et indépendamment des autres et que cette probabilité ne\n", + "dépend que de la température. Si on note $p(t)$ cette probabilité, le\n", + "nombre de joints $D$ dysfonctionnant lorsque l'on effectue le vol à\n", + "température $t$ suit une loi binomiale de paramètre $n=6$ et\n", + "$p=p(t)$. Pour relier $p(t)$ à $t$, on va donc effectuer une\n", + "régression logistique." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\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", + "
Generalized Linear Model Regression Results
Dep. Variable: Frequency No. Observations: 7
Model: GLM Df Residuals: 5
Model Family: Binomial Df Model: 1
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -2.5250
Date: Sat, 13 Apr 2019 Deviance: 0.22231
Time: 19:11:24 Pearson chi2: 0.236
No. Iterations: 4 Covariance Type: nonrobust
\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err z P>|z| [0.025 0.975]
Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953
Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240
" + ], + "text/plain": [ + "\n", + "\"\"\"\n", + " Generalized Linear Model Regression Results \n", + "==============================================================================\n", + "Dep. Variable: Frequency No. Observations: 7\n", + "Model: GLM Df Residuals: 5\n", + "Model Family: Binomial Df Model: 1\n", + "Link Function: logit Scale: 1.0000\n", + "Method: IRLS Log-Likelihood: -2.5250\n", + "Date: Sat, 13 Apr 2019 Deviance: 0.22231\n", + "Time: 19:11:24 Pearson chi2: 0.236\n", + "No. Iterations: 4 Covariance Type: nonrobust\n", + "===============================================================================\n", + " coef std err z P>|z| [0.025 0.975]\n", + "-------------------------------------------------------------------------------\n", + "Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953\n", + "Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240\n", + "===============================================================================\n", + "\"\"\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "data[\"Success\"]=data.Count-data.Malfunction\n", + "data[\"Intercept\"]=1\n", + "\n", + "logmodel=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit)).fit()\n", + "\n", + "logmodel.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "L'estimateur le plus probable du paramètre de température est 0.0014\n", + "et l'erreur standard de cet estimateur est de 0.122, autrement dit on\n", + "ne peut pas distinguer d'impact particulier et il faut prendre nos\n", + "estimations avec des pincettes.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de la probabilité de dysfonctionnant des joints toriques\n", + "La température prévue le jour du décollage est de 31°F. Essayons\n", + "d'estimer la probabilité de dysfonctionnement des joints toriques à\n", + "cette température à partir du modèle que nous venons de construire:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGyFJREFUeJzt3X2UVPWd5/H3pxuQBhEjkhkFDWSWtHF9ABRQWZ3WqGhORLPrE2vGMRNCdmeMk83Knng2E43Rc2YHd2I26zgy6jgxiUo8iiSHCahjT2Y8PoCCILAIY4g2JEGND7Q2Snd/9497u6kuqunqpvqhfnxe5/Tpurd+de/3V7fvp27fuvUrRQRmZpaumsEuwMzM+peD3swscQ56M7PEOejNzBLnoDczS5yD3swscT0GvaR7Je2U9HI390vS/5G0VdI6SdMrX6aZmfVVOUf09wEX7Of+C4Ep+c8C4M4DL8vMzCqlx6CPiF8Av9tPk4uBH0TmWeBwSUdVqkAzMzswwyqwjAnA6wXTTfm8Xxc3lLSA7KifkSNHnnLsscdWYPVDU3t7OzU16b4FknL/Uu4buH/V7pVXXnkzIsb35jGVCHqVmFdyXIWIWAwsBqivr4/NmzdXYPVDU2NjIw0NDYNdRr9JuX8p9w3cv2on6Ve9fUwlXvaagGMKpicCOyqwXDMzq4BKBP0y4Or86pvTgHcjYp/TNmZmNjh6PHUj6QGgAThSUhNwIzAcICL+FlgOfBbYCnwAfLG/ijUzs97rMegjYl4P9wfwZxWryMyqwp49e2hqamL37t2DXUoXY8eOZdOmTYNdxgEbOXIkEydOZPjw4Qe8rEq8GWtmB6GmpibGjBnDpEmTkEpdkzE4du3axZgxYwa7jAMSEbz11ls0NTUxefLkA15eutcgmVm/2r17N+PGjRtSIZ8KSYwbN65i/y056M2szxzy/aeSz62D3swscT5Hb2ZVq7a2lhNPPLFzeunSpYwbN24QKxqaHPRmVrXq6upYu3Ztl3m7du3qvN3a2sqwYY45n7oxs6T86Ec/4rLLLuOiiy7i/PPPB2DRokXMmDGDk046iRtvvLGz7a233kp9fT3nnnsu8+bN47bbbgOgoaGB1atXA/Dmm28yadIkANra2li4cGHnsu666y5g77ALl156KccddxxXXXUV2ZXnsGrVKs444wxOPvlkZs6cya5duzjzzDO7vEDNnj2bdevW9dtz4pc6Mztg3/7pBjbueK+iyzz+6MO48aJ/v982LS0tTJ06FYDJkyfz6KOPAvDMM8+wbt06jjjiCFauXMmWLVt4/vnniQjmzp3LL37xC0aPHs2DDz7ImjVraG1tZfr06Zxyyin7Xd8999zD2LFjWbVqFR9++CGzZ8/ufDFZs2YNGzZs4Oijj2b27Nk8/fTTzJw5kyuuuIKHHnqIGTNm8N5771FXV8f8+fO57777uP3223nllVf48MMPOemkkyrwrJXmoDezqlXq1A3AeeedxxFHHAHAypUrWblyJdOmTQOgubmZLVu2sGvXLj7/+c8zatQoAObOndvj+lauXMm6det4+OGHAXj33XfZsmULI0aMYObMmUycOBGAqVOnsm3bNsaOHctRRx3FjBkzADjssMMAuOyyy/jOd77DokWLuPfee7nmmmsO7InogYPezA5YT0feA2306NGdtyOCG264ga985Std2tx+++3dXsI4bNgw2tvbAbpcyx4RfP/732fOnDld2jc2NnLIIYd0TtfW1tLa2kpElFzHqFGjOO+883jsscdYsmRJ52mi/uJz9GaWtDlz5nDvvffS3NwMwPbt29m5cydnnXUWjz76KC0tLezatYuf/vSnnY+ZNGkSL7zwAkDn0XvHsu6880727NkDwCuvvML777/f7bqPO+44duzYwapVq4DsjeLW1lYA5s+fz3XXXceMGTM6//voLz6iN7OknX/++WzatInTTz8dgEMPPZQf/vCHTJ8+nSuuuIKpU6fyiU98gjPPPLPzMddffz2XX345999/P+ecc07n/Pnz57Nt2zamT59ORDB+/HiWLl3a7bpHjBjBQw89xFe/+lVaWlqoq6vjiSee4NBDD+WUU07hsMMO44tfHIBxICNiUH4+9alPRcqeeuqpwS6hX6Xcv5T7FlG5/m3cuLEiy6m09957r0+Pu/HGG2PRokUVrqZ727dvjylTpkRbW1u3bUo9x8Dq6GXe+tSNmdkA+8EPfsCsWbO49dZbB+RrD33qxswMuOmmmwZsXVdffTVXX331gK3PR/Rm1mcRJb8e2iqgks+tg97M+mTkyJG89dZbDvt+EPl49CNHjqzI8nzqxsz6ZOLEiTQ1NfHGG28Mdild7N69u2IBOZg6vmGqEhz0ZtYnw4cPr8i3H1VaY2Nj56dgLeNTN2ZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeLKCnpJF0jaLGmrpG+UuP9YSU9JWiNpnaTPVr5UMzPrix6DXlItcAdwIXA8ME/S8UXNvgksiYhpwJXA31S6UDMz65tyjuhnAlsj4tWI+Ah4ELi4qE0Ah+W3xwI7KleimZkdCPX0De6SLgUuiIj5+fQfAbMi4tqCNkcBK4GPAaOBcyPihRLLWgAsABg/fvwpS5YsqVQ/hpzm5mYOPfTQwS6j36Tcv5T7Bu5ftTv77LNfiIhTe/OYcr4cXCXmFb86zAPui4j/Lel04H5JJ0REe5cHRSwGFgPU19dHQ0NDb2qtKo2Njbh/1SnlvoH7dzAq59RNE3BMwfRE9j018yVgCUBEPAOMBI6sRIFmZnZgygn6VcAUSZMljSB7s3VZUZvXgM8ASPo0WdC/UclCzcysb3oM+ohoBa4FVgCbyK6u2SDpZklz82b/HfiypJeAB4BroqeT/2ZmNiDKOUdPRCwHlhfN+1bB7Y3A7MqWZmZmleBPxpqZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWuLKCXtIFkjZL2irpG920uVzSRkkbJP24smWamVlfDeupgaRa4A7gPKAJWCVpWURsLGgzBbgBmB0Rb0v6eH8VbGZmvVPOEf1MYGtEvBoRHwEPAhcXtfkycEdEvA0QETsrW6aZmfVVj0f0wATg9YLpJmBWUZtPAUh6GqgFboqInxcvSNICYAHA+PHjaWxs7EPJ1aG5udn9q1Ip9w3cv4NROUGvEvOixHKmAA3AROBfJJ0QEe90eVDEYmAxQH19fTQ0NPS23qrR2NiI+1edUu4buH8Ho3JO3TQBxxRMTwR2lGjzWETsiYhfApvJgt/MzAZZOUG/CpgiabKkEcCVwLKiNkuBswEkHUl2KufVShZqZmZ902PQR0QrcC2wAtgELImIDZJuljQ3b7YCeEvSRuApYGFEvNVfRZuZWfnKOUdPRCwHlhfN+1bB7QC+nv+YmdkQ4k/GmpklzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeIc9GZmiXPQm5klzkFvZpY4B72ZWeLKCnpJF0jaLGmrpG/sp92lkkLSqZUr0czMDkSPQS+pFrgDuBA4Hpgn6fgS7cYA1wHPVbpIMzPru3KO6GcCWyPi1Yj4CHgQuLhEu+8AfwXsrmB9ZmZ2gIaV0WYC8HrBdBMwq7CBpGnAMRHxM0nXd7cgSQuABQDjx4+nsbGx1wVXi+bmZvevSqXcN3D/DkblBL1KzIvOO6Ua4LvANT0tKCIWA4sB6uvro6Ghoawiq1FjYyPuX3VKuW/g/h2Myjl10wQcUzA9EdhRMD0GOAFolLQNOA1Y5jdkzcyGhnKCfhUwRdJkSSOAK4FlHXdGxLsRcWRETIqIScCzwNyIWN0vFZuZWa/0GPQR0QpcC6wANgFLImKDpJslze3vAs3M7MCUc46eiFgOLC+a961u2jYceFlmZlYp/mSsmVniHPRmZolz0JuZJc5Bb2aWOAe9mVniyrrqxqxSlq7ZzqIVm9nxTgtHH17Hwjn1XDJtwmCXZf3A23rocNDbgFm6Zjs3PLKelj1tAGx/p4UbHlkP4ABIjLf10OJTNzZgFq3Y3Lnjd2jZ08aiFZsHqSLrL97WQ4uD3gbMjndaejXfqpe39dDioLcBc/Thdb2ab9XL23pocdDbgFk4p5664bVd5tUNr2XhnPpBqsj6i7f10OI3Y23AdLwJ5ysx0udtPbQ46G1AXTJtgnf2g4S39dDhUzdmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOAe9mVniHPRmZolz0JuZJc5Bb2aWOH9nrJmVJSJoaw/aA9oj8h9oa49u72tvL9Eugvb20svYp13RMtoj8mloi6L15u02vbaH15/9Vba89qAtStS+T61BW3vpPnZMd3df5DV31Fiq9s52HevrspyCdlG0vKK+tkfftp2D3gZN4Y7dJRwiiPaCnaI4GPLbe3f0vfdFqeX1cud8eUcrv3uxqcdgiYKAKL1Tlg6P0kGwd3n7C7G2gvW2t5doV+r5KgqSDz7YzSHPPLnf9RSHS1tfE2awbHy57KYS1ErUSNTUQI1ErYQENTUdt0WNoLZmb7u9j8nuqylaRo0K5teI2hoxvOPxUr4sAFFbky1b+bq7PK5omWv68HSUFfSSLgC+B9QCd0fEXxbd/3VgPtAKvAH8SUT8qg/19Nk+r/qljgAKjhpKvcruEzzFO0vnEUL2uP0dtaz/TSvvvbRjnzCIotvdBl3Rq3rbfu7b35HBPvOLQ6rLkcq+Ry7dHYE1N3/AyFVPdd7X2ZcSwVNYb9fneyD/Qnpp3UsH9PDC8FBhQOThURwEtTXZziyU7/D7Pr62RojC8MkeO6y2hkOG7Q2cjmDqWEbn8vL17vztbzn6qCP3CaWOdvvczutUPr+wPqlrqGX9UNewLFFDTan11AhREKI1RcuVgL3PRZdw7QjfGvHsM88we/YZBbUL1RQ9FwXPrfLlVotb+vCYHoNeUi1wB3Ae0ASskrQsIjYWNFsDnBoRH0j6r8BfAVfsb7nbm9s596//uXQQlArtff716Ro8Q9Lavrz2ltbxh93lFb9oR+g86ug4AqnpLmz2hkoWGnuPHrJ1lA6O2jwUJHizpoWjfv/wLjt58Tpqa9Sl9pJHPwV9KWyX9TN7LHmfawtrrum6jNqa7LkR+4ZNjYAuobdvUBTWvnrV85x+2qx9gqXrkV/R9ig6EhzK4dHY2EhDw8mDXUa/+djIGj4+ZuRglzGklHNEPxPYGhGvAkh6ELgY6Az6iHiqoP2zwBd6WujwGlH/e2M6d8CSQdBNKOzdWfNQoGvoFR/xFP6bpOLbRUc1xUddxQGyN/T2hlvx0UiNxIurVzNr1oyCYN7fkR37HAWpKJiGmiwspg12Gf2iaXQNnxg3erDLMKuYcoJ+AvB6wXQTMGs/7b8E/GOpOyQtABYAjB8/nssmvFdmmX0Q+U8FteU/5RirD2ja+EJlCxhCmpubaWxsHOwy+kXKfQP372BUTtCXOpwsGaGSvgCcCvxhqfsjYjGwGKC+vj4aGhrKq7IKZUe8DYNdRr9JuX8p9w3cv4NROUHfBBxTMD0R2FHcSNK5wP8E/jAiPqxMeWZmdqDK+cDUKmCKpMmSRgBXAssKG0iaBtwFzI2InZUv08zM+qrHoI+IVuBaYAWwCVgSERsk3Sxpbt5sEXAo8BNJayUt62ZxZmY2wMq6jj4ilgPLi+Z9q+D2uRWuy6zXlq7ZzqIVm9nxTgtHH17Hwjn1APvMu2TahAGtoT/X1xvfXLqeB557na+dsIcv3bCcebOO4ZZLThzssmwA+JOxloSla7ZzwyPradmTXRe1/Z0WFv7kJRDsaYvOeTc8sh6gX8K3VA39ub7e+ObS9fzw2dc6p9siOqcd9unzoGaWhEUrNncGbIc97dEZ8h1a9rSxaMXmAauhP9fXGw8893qv5ltaHPSWhB3vtPRL20rU0F/r6422bsab6G6+pcVBb0k4+vC6fmlbiRr6a329UdvNp6u7m29pcdBbEhbOqadueG2XecNrxPDarkFWN7y2803agaihP9fXG/NmHdOr+ZYWvxlrSeh4s3Mwr7rprobBfiMW9r7h2nFOvlbyVTcHEQe9JeOSaRNKhupABm13NQwFt1xyIrdcciKNjY3821UNg12ODSCfujEzS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBLnoDczS5yD3swscQ56M7PEOejNzBJXVtBLukDSZklbJX2jxP2HSHoov/85SZMqXaiZmfVNj0EvqRa4A7gQOB6YJ+n4omZfAt6OiH8HfBf4X5Uu1MzM+qacI/qZwNaIeDUiPgIeBC4uanMx8A/57YeBz0hS5co0M7O+GlZGmwnA6wXTTcCs7tpERKukd4FxwJuFjSQtABbkkx9KerkvRVeJIynqf2JS7l/KfQP3r9rV9/YB5QR9qSPz6EMbImIxsBhA0uqIOLWM9Vcl9696pdw3cP+qnaTVvX1MOadumoBjCqYnAju6ayNpGDAW+F1vizEzs8orJ+hXAVMkTZY0ArgSWFbUZhnwx/ntS4F/ioh9jujNzGzg9XjqJj/nfi2wAqgF7o2IDZJuBlZHxDLgHuB+SVvJjuSvLGPdiw+g7mrg/lWvlPsG7l+163X/5ANvM7O0+ZOxZmaJc9CbmSVuQIJe0khJz0t6SdIGSd/O50/Oh0zYkg+hMGIg6ukPkmolrZH0s3w6pb5tk7Re0tqOS7skHSHp8bx/j0v62GDX2VeSDpf0sKT/J2mTpNNT6Z+k+ny7dfy8J+lrCfXvv+WZ8rKkB/KsSWnf+/O8bxskfS2f1+ttN1BH9B8C50TEycBU4AJJp5ENlfDdiJgCvE02lEK1+nNgU8F0Sn0DODsiphZcn/wN4Mm8f0/m09Xqe8DPI+I44GSy7ZhE/yJic77dpgKnAB8Aj5JA/yRNAK4DTo2IE8guFrmSRPY9SScAXyYbneBk4HOSptCXbRcRA/oDjAJeJPt07ZvAsHz+6cCKga6nQn2amD/h5wA/I/sAWRJ9y+vfBhxZNG8zcFR++yhg82DX2ce+HQb8kvzChNT6V9Sn84GnU+kfez+RfwTZFYQ/A+aksu8BlwF3F0z/BfA/+rLtBuwcfX5qYy2wE3gc+DfgnYhozZs0kW24anQ72QZoz6fHkU7fIPuU80pJL+TDWAD8XkT8GiD//fFBq+7AfBJ4A/j7/NTb3ZJGk07/Cl0JPJDfrvr+RcR24DbgNeDXwLvAC6Sz770MnCVpnKRRwGfJPpja6203YEEfEW2R/fs4kexfkU+XajZQ9VSKpM8BOyPihcLZJZpWXd8KzI6I6WQjmP6ZpLMGu6AKGgZMB+6MiGnA+1ThaYye5Oep5wI/GexaKiU/N30xMBk4GhhN9jdarCr3vYjYRHYa6nHg58BLQOt+H9SNAb/qJiLeARqB04DD8yEToPTQCtVgNjBX0jaykT3PITvCT6FvAETEjvz3TrLzuzOB30o6CiD/vXPwKjwgTUBTRDyXTz9MFvyp9K/DhcCLEfHbfDqF/p0L/DIi3oiIPcAjwBmkte/dExHTI+Issg+jbqEP226grroZL+nw/HYd2QbaBDxFNmQCZEMoPDYQ9VRSRNwQERMjYhLZv8b/FBFXkUDfACSNljSm4zbZed6X6TrsRdX2LyJ+A7wuqWNEwM8AG0mkfwXmsfe0DaTRv9eA0ySNyodF79h2Sex7AJI+nv8+FviPZNuw19tuQD4ZK+kksvHqa8leXJZExM2SPkl2FHwEsAb4QkR82O8F9RNJDcD1EfG5VPqW9+PRfHIY8OOIuFXSOGAJcCzZDndZRFTlQHaSpgJ3AyOAV4Evkv+dkkb/RpG9afnJiHg3n5fE9ssv1b6C7JTGGmA+2Tn5qt/3ACT9C9l7fnuAr0fEk33Zdh4Cwcwscf5krJlZ4hz0ZmaJc9CbmSXOQW9mljgHvZlZ4sr5cnCzAZVfPvZkPvn7QBvZMAUAMyPio0EpbD8k/QmwPL8u32xI8eWVNqRJuglojojbhkAttRHR1s19/wpcGxFre7G8YQVjspj1G5+6saoi6Y+VfbfBWkl/I6lG0jBJ70haJOlFSSskzZL0z5JelfTZ/LHzJT2a379Z0jfLXO4tkp4HZkr6tqRV+Rjhf6vMFWTDbz+UP36EpKaCT4OfJumJ/PYtku6S9DjZQGrDJP11vu51kuYP/LNqqXPQW9XIx+f+PHBGPkDeMPZ+Ef1YYGU++NpHwE1kH4m/DLi5YDEz88dMB/6zpKllLPfFiJgZEc8A34uIGcCJ+X0XRMRDwFrgisjGfu/p1NI04KKI+CNgAdmgeDOBGWSDxh3bl+fHrDs+R2/V5FyyMFydDW1CHdlH+wFaIuLx/PZ64N2IaJW0HphUsIwVEfE2gKSlwH8g2w+6W+5H7B0CAuAzkhYCI4EjyYbF/cde9uOxiNid3z4f+LSkwheWKWQfbTerCAe9VRMB90bEX3SZmY1UWHgU3U72rWYdtwv/zovflIoeltsS+RtZ+Zgx/xeYHhHbJd1CFviltLL3P+biNu8X9elPI+JJzPqJT91YNXkCuFzSkZBdndOH0xznK/uO2FFkY5k/3Yvl1pG9cLyZj+j5nwru2wWMKZjeRvbVfRS1K7YC+NOOYXWVfcdrXS/7ZLZfPqK3qhER6/PRCp+QVEM2ot9/oXfjjf8r8GPgD4D7O66SKWe5EfGWpH8gG6b5V8BzBXf/PXC3pBay9wFuAv5O0m+A5/dTz11koxCuzU8b7SR7ATKrGF9eaQeN/IqWEyLia4Ndi9lA8qkbM7PE+YjezCxxPqI3M0ucg97MLHEOejOzxDnozcwS56A3M0vc/wcowwoTqhaBUgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "data_pred = pd.DataFrame({'Temperature': np.linspace(start=30, stop=90, num=121), 'Intercept': 1})\n", + "data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])\n", + "data_pred.plot(x=\"Temperature\",y=\"Frequency\",kind=\"line\",ylim=[0,1])\n", + "plt.scatter(x=data[\"Temperature\"],y=data[\"Frequency\"])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hideCode": false, + "hidePrompt": false, + "scrolled": true + }, + "source": [ + "Comme on pouvait s'attendre au vu des données initiales, la\n", + "température n'a pas d'impact notable sur la probabilité d'échec des\n", + "joints toriques. Elle sera d'environ 0.2, comme dans les essais\n", + "précédents où nous il y a eu défaillance d'au moins un joint. Revenons\n", + "à l'ensemble des données initiales pour estimer la probabilité de\n", + "défaillance d'un joint:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.06521739130434782\n" + ] + } + ], + "source": [ + "data = pd.read_csv(\"shuttle.csv\")\n", + "print(np.sum(data.Malfunction)/np.sum(data.Count))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cette probabilité est donc d'environ $p=0.065$, sachant qu'il existe\n", + "un joint primaire un joint secondaire sur chacune des trois parties du\n", + "lançeur, la probabilité de défaillance des deux joints d'un lançeur\n", + "est de $p^2 \\approx 0.00425$. La probabilité de défaillance d'un des\n", + "lançeur est donc de $1-(1-p^2)^3 \\approx 1.2%$. Ça serait vraiment\n", + "pas de chance... Tout est sous contrôle, le décollage peut donc avoir\n", + "lieu demain comme prévu.\n", + "\n", + "Seulement, le lendemain, la navette Challenger explosera et emportera\n", + "avec elle ses sept membres d'équipages. L'opinion publique est\n", + "fortement touchée et lors de l'enquête qui suivra, la fiabilité des\n", + "joints toriques sera directement mise en cause. Au delà des problèmes\n", + "de communication interne à la NASA qui sont pour beaucoup dans ce\n", + "fiasco, l'analyse précédente comporte (au moins) un petit\n", + "problème... Saurez-vous le trouver ? Vous êtes libre de modifier cette\n", + "analyse et de regarder ce jeu de données sous tous les angles afin\n", + "d'expliquer ce qui ne va pas." + ] + } + ], + "metadata": { + "celltoolbar": "Hide code", + "kernelspec": { + "display_name": "Python 3", + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/module4/ressources/moocrr_notebook/diff.png b/module4/ressources/moocrr_notebook/diff.png new file mode 100644 index 0000000000000000000000000000000000000000..219d2fabfc3be7dcbc3923eb9228b6db6beff9fc Binary files /dev/null and b/module4/ressources/moocrr_notebook/diff.png differ diff --git a/module4/ressources/moocrr_notebook/img1.png b/module4/ressources/moocrr_notebook/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..a379fcdb0fae822b0801353b0740f1e6f57c588b Binary files /dev/null and b/module4/ressources/moocrr_notebook/img1.png differ diff --git a/module4/ressources/moocrr_notebook/img1_debian_stable_jupyter.png b/module4/ressources/moocrr_notebook/img1_debian_stable_jupyter.png new file mode 100644 index 0000000000000000000000000000000000000000..9b24bbd254caf43b5fa688dd4f0f9e1bd85edfd8 Binary files /dev/null and b/module4/ressources/moocrr_notebook/img1_debian_stable_jupyter.png differ diff --git a/module4/ressources/moocrr_notebook/img1_nbconvert.png b/module4/ressources/moocrr_notebook/img1_nbconvert.png new file mode 100644 index 0000000000000000000000000000000000000000..8af8f4bbff8d1c05b60b8525329464b5d6d2fb8c Binary files /dev/null and b/module4/ressources/moocrr_notebook/img1_nbconvert.png differ diff --git a/module4/ressources/moocrr_notebook/notebook.ipynb b/module4/ressources/moocrr_notebook/notebook.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a2a512d10dfcf2370bcd394297e7ec5cac17d6b7 --- /dev/null +++ b/module4/ressources/moocrr_notebook/notebook.ipynb @@ -0,0 +1,713 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analyse du risque de défaillance des joints toriques de la navette Challenger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le 27 Janvier 1986, veille du décollage de la navette *Challenger*, eu\n", + "lieu une télé-conférence de trois heures entre les ingénieurs de la\n", + "Morton Thiokol (constructeur d'un des moteurs) et de la NASA. La\n", + "discussion portait principalement sur les conséquences de la\n", + "température prévue au moment du décollage de 31°F (juste en dessous de\n", + "0°C) sur le succès du vol et en particulier sur la performance des\n", + "joints toriques utilisés dans les moteurs. En effet, aucun test\n", + "n'avait été effectué à cette température.\n", + "\n", + "L'étude qui suit reprend donc une partie des analyses effectuées cette\n", + "nuit là et dont l'objectif était d'évaluer l'influence potentielle de\n", + "la température et de la pression à laquelle sont soumis les joints\n", + "toriques sur leur probabilité de dysfonctionnement. Pour cela, nous\n", + "disposons des résultats des expériences réalisées par les ingénieurs\n", + "de la NASA durant les 6 années précédant le lancement de la navette\n", + "Challenger.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chargement des données\n", + "Nous commençons donc par charger ces données:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + " \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", + " \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", + " \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", + "
DateCountTemperaturePressureMalfunction
04/12/81666500
111/12/81670501
23/22/82669500
311/11/82668500
44/04/83667500
56/18/82672500
68/30/836731000
711/28/836701000
82/03/846572001
94/06/846632001
108/30/846702001
1110/05/846782000
1211/08/846672000
131/24/856532002
144/12/856672000
154/29/856752000
166/17/856702000
177/2903/856812000
188/27/856762000
1910/03/856792000
2010/30/856752002
2111/26/856762000
221/12/866582001
\n", + "
" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "0 4/12/81 6 66 50 0\n", + "1 11/12/81 6 70 50 1\n", + "2 3/22/82 6 69 50 0\n", + "3 11/11/82 6 68 50 0\n", + "4 4/04/83 6 67 50 0\n", + "5 6/18/82 6 72 50 0\n", + "6 8/30/83 6 73 100 0\n", + "7 11/28/83 6 70 100 0\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "11 10/05/84 6 78 200 0\n", + "12 11/08/84 6 67 200 0\n", + "13 1/24/85 6 53 200 2\n", + "14 4/12/85 6 67 200 0\n", + "15 4/29/85 6 75 200 0\n", + "16 6/17/85 6 70 200 0\n", + "17 7/2903/85 6 81 200 0\n", + "18 8/27/85 6 76 200 0\n", + "19 10/03/85 6 79 200 0\n", + "20 10/30/85 6 75 200 2\n", + "21 11/26/85 6 76 200 0\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "data = pd.read_csv(\"shuttle.csv\")\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le jeu de données nous indique la date de l'essai, le nombre de joints\n", + "toriques mesurés (il y en a 6 sur le lançeur principal), la\n", + "température (en Farenheit) et la pression (en psi), et enfin le\n", + "nombre de dysfonctionnements relevés. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspection graphique des données\n", + "Les vols où aucun incident n'est relevé n'apportant aucun information\n", + "sur l'influence de la température ou de la pression sur les\n", + "dysfonctionnements, nous nous concentrons sur les expériences où au\n", + "moins un joint a été défectueux.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + " \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", + "
DateCountTemperaturePressureMalfunction
111/12/81670501
82/03/846572001
94/06/846632001
108/30/846702001
131/24/856532002
2010/30/856752002
221/12/866582001
\n", + "
" + ], + "text/plain": [ + " Date Count Temperature Pressure Malfunction\n", + "1 11/12/81 6 70 50 1\n", + "8 2/03/84 6 57 200 1\n", + "9 4/06/84 6 63 200 1\n", + "10 8/30/84 6 70 200 1\n", + "13 1/24/85 6 53 200 2\n", + "20 10/30/85 6 75 200 2\n", + "22 1/12/86 6 58 200 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data[data.Malfunction>0]\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Très bien, nous avons une variabilité de température importante mais\n", + "la pression est quasiment toujours égale à 200, ce qui devrait\n", + "simplifier l'analyse.\n", + "\n", + "Comment la fréquence d'échecs varie-t-elle avec la température ?\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "pd.set_option('mode.chained_assignment',None) # this removes a useless warning from pandas\n", + "import matplotlib.pyplot as plt\n", + "\n", + "data[\"Frequency\"]=data.Malfunction/data.Count\n", + "data.plot(x=\"Temperature\",y=\"Frequency\",kind=\"scatter\",ylim=[0,1])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "À première vue, ce n'est pas flagrant mais bon, essayons quand même\n", + "d'estimer l'impact de la température $t$ sur la probabilité de\n", + "dysfonctionnements d'un joint. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de l'influence de la température\n", + "\n", + "Supposons que chacun des 6 joints toriques est endommagé avec la même\n", + "probabilité et indépendamment des autres et que cette probabilité ne\n", + "dépend que de la température. Si on note $p(t)$ cette probabilité, le\n", + "nombre de joints $D$ dysfonctionnant lorsque l'on effectue le vol à\n", + "température $t$ suit une loi binomiale de paramètre $n=6$ et\n", + "$p=p(t)$. Pour relier $p(t)$ à $t$, on va donc effectuer une\n", + "régression logistique." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\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", + "
Generalized Linear Model Regression Results
Dep. Variable: Frequency No. Observations: 7
Model: GLM Df Residuals: 5
Model Family: Binomial Df Model: 1
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -2.5250
Date: Sat, 13 Apr 2019 Deviance: 0.22231
Time: 19:11:24 Pearson chi2: 0.236
No. Iterations: 4 Covariance Type: nonrobust
\n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "\n", + " \n", + "\n", + "
coef std err z P>|z| [0.025 0.975]
Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953
Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240
" + ], + "text/plain": [ + "\n", + "\"\"\"\n", + " Generalized Linear Model Regression Results \n", + "==============================================================================\n", + "Dep. Variable: Frequency No. Observations: 7\n", + "Model: GLM Df Residuals: 5\n", + "Model Family: Binomial Df Model: 1\n", + "Link Function: logit Scale: 1.0000\n", + "Method: IRLS Log-Likelihood: -2.5250\n", + "Date: Sat, 13 Apr 2019 Deviance: 0.22231\n", + "Time: 19:11:24 Pearson chi2: 0.236\n", + "No. Iterations: 4 Covariance Type: nonrobust\n", + "===============================================================================\n", + " coef std err z P>|z| [0.025 0.975]\n", + "-------------------------------------------------------------------------------\n", + "Intercept -1.3895 7.828 -0.178 0.859 -16.732 13.953\n", + "Temperature 0.0014 0.122 0.012 0.991 -0.238 0.240\n", + "===============================================================================\n", + "\"\"\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "data[\"Success\"]=data.Count-data.Malfunction\n", + "data[\"Intercept\"]=1\n", + "\n", + "logmodel=sm.GLM(data['Frequency'], data[['Intercept','Temperature']], family=sm.families.Binomial(sm.families.links.logit)).fit()\n", + "\n", + "logmodel.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "L'estimateur le plus probable du paramètre de température est 0.0014\n", + "et l'erreur standard de cet estimateur est de 0.122, autrement dit on\n", + "ne peut pas distinguer d'impact particulier et il faut prendre nos\n", + "estimations avec des pincettes.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimation de la probabilité de dysfonctionnant des joints toriques\n", + "La température prévue le jour du décollage est de 31°F. Essayons\n", + "d'estimer la probabilité de dysfonctionnement des joints toriques à\n", + "cette température à partir du modèle que nous venons de construire:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEKCAYAAAAcgp5RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAGyFJREFUeJzt3X2UVPWd5/H3pxuQBhEjkhkFDWSWtHF9ABRQWZ3WqGhORLPrE2vGMRNCdmeMk83Knng2E43Rc2YHd2I26zgy6jgxiUo8iiSHCahjT2Y8PoCCILAIY4g2JEGND7Q2Snd/9497u6kuqunqpvqhfnxe5/Tpurd+de/3V7fvp27fuvUrRQRmZpaumsEuwMzM+peD3swscQ56M7PEOejNzBLnoDczS5yD3swscT0GvaR7Je2U9HI390vS/5G0VdI6SdMrX6aZmfVVOUf09wEX7Of+C4Ep+c8C4M4DL8vMzCqlx6CPiF8Av9tPk4uBH0TmWeBwSUdVqkAzMzswwyqwjAnA6wXTTfm8Xxc3lLSA7KifkSNHnnLsscdWYPVDU3t7OzU16b4FknL/Uu4buH/V7pVXXnkzIsb35jGVCHqVmFdyXIWIWAwsBqivr4/NmzdXYPVDU2NjIw0NDYNdRr9JuX8p9w3cv2on6Ve9fUwlXvaagGMKpicCOyqwXDMzq4BKBP0y4Or86pvTgHcjYp/TNmZmNjh6PHUj6QGgAThSUhNwIzAcICL+FlgOfBbYCnwAfLG/ijUzs97rMegjYl4P9wfwZxWryMyqwp49e2hqamL37t2DXUoXY8eOZdOmTYNdxgEbOXIkEydOZPjw4Qe8rEq8GWtmB6GmpibGjBnDpEmTkEpdkzE4du3axZgxYwa7jAMSEbz11ls0NTUxefLkA15eutcgmVm/2r17N+PGjRtSIZ8KSYwbN65i/y056M2szxzy/aeSz62D3swscT5Hb2ZVq7a2lhNPPLFzeunSpYwbN24QKxqaHPRmVrXq6upYu3Ztl3m7du3qvN3a2sqwYY45n7oxs6T86Ec/4rLLLuOiiy7i/PPPB2DRokXMmDGDk046iRtvvLGz7a233kp9fT3nnnsu8+bN47bbbgOgoaGB1atXA/Dmm28yadIkANra2li4cGHnsu666y5g77ALl156KccddxxXXXUV2ZXnsGrVKs444wxOPvlkZs6cya5duzjzzDO7vEDNnj2bdevW9dtz4pc6Mztg3/7pBjbueK+iyzz+6MO48aJ/v982LS0tTJ06FYDJkyfz6KOPAvDMM8+wbt06jjjiCFauXMmWLVt4/vnniQjmzp3LL37xC0aPHs2DDz7ImjVraG1tZfr06Zxyyin7Xd8999zD2LFjWbVqFR9++CGzZ8/ufDFZs2YNGzZs4Oijj2b27Nk8/fTTzJw5kyuuuIKHHnqIGTNm8N5771FXV8f8+fO57777uP3223nllVf48MMPOemkkyrwrJXmoDezqlXq1A3AeeedxxFHHAHAypUrWblyJdOmTQOgubmZLVu2sGvXLj7/+c8zatQoAObOndvj+lauXMm6det4+OGHAXj33XfZsmULI0aMYObMmUycOBGAqVOnsm3bNsaOHctRRx3FjBkzADjssMMAuOyyy/jOd77DokWLuPfee7nmmmsO7InogYPezA5YT0feA2306NGdtyOCG264ga985Std2tx+++3dXsI4bNgw2tvbAbpcyx4RfP/732fOnDld2jc2NnLIIYd0TtfW1tLa2kpElFzHqFGjOO+883jsscdYsmRJ52mi/uJz9GaWtDlz5nDvvffS3NwMwPbt29m5cydnnXUWjz76KC0tLezatYuf/vSnnY+ZNGkSL7zwAkDn0XvHsu6880727NkDwCuvvML777/f7bqPO+44duzYwapVq4DsjeLW1lYA5s+fz3XXXceMGTM6//voLz6iN7OknX/++WzatInTTz8dgEMPPZQf/vCHTJ8+nSuuuIKpU6fyiU98gjPPPLPzMddffz2XX345999/P+ecc07n/Pnz57Nt2zamT59ORDB+/HiWLl3a7bpHjBjBQw89xFe/+lVaWlqoq6vjiSee4NBDD+WUU07hsMMO44tfHIBxICNiUH4+9alPRcqeeuqpwS6hX6Xcv5T7FlG5/m3cuLEiy6m09957r0+Pu/HGG2PRokUVrqZ727dvjylTpkRbW1u3bUo9x8Dq6GXe+tSNmdkA+8EPfsCsWbO49dZbB+RrD33qxswMuOmmmwZsXVdffTVXX331gK3PR/Rm1mcRJb8e2iqgks+tg97M+mTkyJG89dZbDvt+EPl49CNHjqzI8nzqxsz6ZOLEiTQ1NfHGG28Mdild7N69u2IBOZg6vmGqEhz0ZtYnw4cP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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "data_pred = pd.DataFrame({'Temperature': np.linspace(start=30, stop=90, num=121), 'Intercept': 1})\n", + "data_pred['Frequency'] = logmodel.predict(data_pred[['Intercept','Temperature']])\n", + "data_pred.plot(x=\"Temperature\",y=\"Frequency\",kind=\"line\",ylim=[0,1])\n", + "plt.scatter(x=data[\"Temperature\"],y=data[\"Frequency\"])\n", + "plt.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hideCode": false, + "hidePrompt": false, + "scrolled": true + }, + "source": [ + "Comme on pouvait s'attendre au vu des données initiales, la\n", + "température n'a pas d'impact notable sur la probabilité d'échec des\n", + "joints toriques. Elle sera d'environ 0.2, comme dans les essais\n", + "précédents où nous il y a eu défaillance d'au moins un joint. Revenons\n", + "à l'ensemble des données initiales pour estimer la probabilité de\n", + "défaillance d'un joint:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.06521739130434782\n" + ] + } + ], + "source": [ + "data = pd.read_csv(\"shuttle.csv\")\n", + "print(np.sum(data.Malfunction)/np.sum(data.Count))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cette probabilité est donc d'environ $p=0.065$, sachant qu'il existe\n", + "un joint primaire un joint secondaire sur chacune des trois parties du\n", + "lançeur, la probabilité de défaillance des deux joints d'un lançeur\n", + "est de $p^2 \\approx 0.00425$. La probabilité de défaillance d'un des\n", + "lançeur est donc de $1-(1-p^2)^3 \\approx 1.2%$. Ça serait vraiment\n", + "pas de chance... Tout est sous contrôle, le décollage peut donc avoir\n", + "lieu demain comme prévu.\n", + "\n", + "Seulement, le lendemain, la navette Challenger explosera et emportera\n", + "avec elle ses sept membres d'équipages. L'opinion publique est\n", + "fortement touchée et lors de l'enquête qui suivra, la fiabilité des\n", + "joints toriques sera directement mise en cause. Au delà des problèmes\n", + "de communication interne à la NASA qui sont pour beaucoup dans ce\n", + "fiasco, l'analyse précédente comporte (au moins) un petit\n", + "problème... Saurez-vous le trouver ? Vous êtes libre de modifier cette\n", + "analyse et de regarder ce jeu de données sous tous les angles afin\n", + "d'expliquer ce qui ne va pas." + ] + } + ], + "metadata": { + "celltoolbar": "Hide code", + "kernelspec": { + "display_name": "Python 3", + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/module4/ressources/moocrr_notebook/notebook_test.sh b/module4/ressources/moocrr_notebook/notebook_test.sh new file mode 100644 index 0000000000000000000000000000000000000000..1d044308aaeec966049944d56cd971dbb68ba819 --- /dev/null +++ b/module4/ressources/moocrr_notebook/notebook_test.sh @@ -0,0 +1,35 @@ +jupyter-nbconvert --to notebook --execute notebook.ipynb --output notebook.nbconvert.ipynb + +compare_notebooks() { + OLD=$1 + NEW=$2 + mkdir -p `dirname sed/$1` + mkdir -p `dirname sed/$2` + echo "======= Comparing to $OLD =======" + sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" $1 > sed/$1 + sed -e "s/Date:.*Deviance:/Deviance/" -e "s/Time:.*Pearson/Pearson/" $2 > sed/$2 + # Test #1 (--ignore-matching-lines="image/png" ) + diff -w --ignore-matching-lines="nbformat_minor" \ + --ignore-matching-lines="hidePrompt" \ + --ignore-matching-lines="scrolled" \ + --ignore-matching-lines="No. Iterations:" \ + --ignore-matching-lines="Covariance Type:" \ + sed/$1 sed/$2 # | sed 's/^/>/' + CMP_RES=$? + echo "======= End of Comparison =======" + rm sed/$1 sed/$2 + return $CMP_RES +} + +compare_notebooks correct_output/notebook_orig.ipynb notebook.nbconvert.ipynb +CMP1=$? +compare_notebooks correct_output/notebook_844815ed865e.ipynb notebook.nbconvert.ipynb +CMP2=$? + +if [ $CMP1 -eq "0" -o $CMP2 -eq "0" ] ; then + echo "Test succeeded"; + return 0; +else + echo "Test failed"; + return 1; +fi diff --git a/module4/ressources/moocrr_notebook/shuttle.csv b/module4/ressources/moocrr_notebook/shuttle.csv new file mode 100644 index 0000000000000000000000000000000000000000..9412ab30682565afb0ca3b4bcc6b0f99f632bbf2 --- /dev/null +++ b/module4/ressources/moocrr_notebook/shuttle.csv @@ -0,0 +1,24 @@ +Date,Count,Temperature,Pressure,Malfunction +4/12/81,6,66,50,0 +11/12/81,6,70,50,1 +3/22/82,6,69,50,0 +11/11/82,6,68,50,0 +4/04/83,6,67,50,0 +6/18/82,6,72,50,0 +8/30/83,6,73,100,0 +11/28/83,6,70,100,0 +2/03/84,6,57,200,1 +4/06/84,6,63,200,1 +8/30/84,6,70,200,1 +10/05/84,6,78,200,0 +11/08/84,6,67,200,0 +1/24/85,6,53,200,2 +4/12/85,6,67,200,0 +4/29/85,6,75,200,0 +6/17/85,6,70,200,0 +7/2903/85,6,81,200,0 +8/27/85,6,76,200,0 +10/03/85,6,79,200,0 +10/30/85,6,75,200,2 +11/26/85,6,76,200,0 +1/12/86,6,58,200,1 diff --git a/module4/ressources/test_jupyter/.gitlab-ci.yml.basic b/module4/ressources/test_jupyter/.gitlab-ci.yml.basic new file mode 100644 index 0000000000000000000000000000000000000000..87f1a119aa194b362e6f4a06cb29529c57a1c304 --- /dev/null +++ b/module4/ressources/test_jupyter/.gitlab-ci.yml.basic @@ -0,0 +1,13 @@ +image: "debian:stable" + +before_script: + - perl -v + - which perl + +perl_addition: + script: + - perl -e "print(3+2);" + +perl_multiplication: + script: + - perl -e "print(3*2);" diff --git a/module4/ressources/test_jupyter/.gitlab-ci.yml.full b/module4/ressources/test_jupyter/.gitlab-ci.yml.full new file mode 100644 index 0000000000000000000000000000000000000000..e74cca84b136872e8bc0807c1eddc98461dcfd56 --- /dev/null +++ b/module4/ressources/test_jupyter/.gitlab-ci.yml.full @@ -0,0 +1,24 @@ +jupyter_debian_frozen: + image: "alegrand38/moocrr_jupyter" + before_script: + - python3 --version + - jupyter-nbconvert --version + script: + - sh notebook_test.sh + +jupyter_scipy_uptodate: + image: "jupyter/scipy-notebook" + before_script: + - python3 --version + - jupyter-nbconvert --version + script: + - sh notebook_test.sh + +jupyter_debian_uptodate: + image: "debian:stable" + before_script: + - apt-get update && apt-get install -y python3 jupyter-nbconvert python3-ipykernel python3-matplotlib python3-pandas python3-numpy python3-statsmodels + - python3 --version + - jupyter-nbconvert --version + script: + - sh notebook_test.sh diff --git a/module4/ressources/test_jupyter/.gitlab-ci.yml.scipy b/module4/ressources/test_jupyter/.gitlab-ci.yml.scipy new file mode 100644 index 0000000000000000000000000000000000000000..c5bd596177ae6be0eb9906e6927f786b7c459f4f --- /dev/null +++ b/module4/ressources/test_jupyter/.gitlab-ci.yml.scipy @@ -0,0 +1,9 @@ +image: "jupyter/scipy-notebook" + +before_script: + - python3 --version + - jupyter-nbconvert --version + +jupyter: + script: + - sh notebook_test.sh