Commit b0237e6c authored by brospars's avatar brospars

CI : Export org files to html and move to public

parent 14090da4
...@@ -5,11 +5,11 @@ build: ...@@ -5,11 +5,11 @@ build:
image: binarin/org-export image: binarin/org-export
stage: build stage: build
script: script:
- pwd - for file in $(find -name "*.org"); do emacs --batch --load /emacs/export.el --file $file --eval '(org-html-export-to-html)' &> /dev/null || echo "Exported $file"; done
- ls -al - find -name "*.html" -exec mv -t public {} +
# artifacts: artifacts:
# expire_in: 1 day expire_in: 1 day
# paths: paths:
# - build/*.zip - public/*.html
only: only:
- ci - ci
<div id="content">
<h1 class="title">Introduction à Markdown</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org99b4a98">Syntaxe</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org28d66f2">Headers</a></li>
<li style="margin-bottom:0;"><a href="#orgc27acce">Emphasis</a></li>
<li style="margin-bottom:0;"><a href="#org50640c4">Lists</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org11d3314">Unordered</a></li>
<li style="margin-bottom:0;"><a href="#org0453134">Ordered</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#orgda3d80b">Images</a></li>
<li style="margin-bottom:0;"><a href="#org7cb67aa">Links</a></li>
<li style="margin-bottom:0;"><a href="#orge09365f">Blockquotes</a></li>
<li style="margin-bottom:0;"><a href="#orgfa4914a">Inline code</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org8737c71">Écrire des Maths</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org6dc05c1">Lettres grecques</a></li>
<li style="margin-bottom:0;"><a href="#org2d8310d">Fonctions et opérateurs</a></li>
<li style="margin-bottom:0;"><a href="#org69729f8">Exposants et indices</a></li>
<li style="margin-bottom:0;"><a href="#org39a711a">Fractions, coefficients binomiaux, racines, &#x2026;</a></li>
<li style="margin-bottom:0;"><a href="#org4b11fa4">Sommes et intégrales</a></li>
<li style="margin-bottom:0;"><a href="#org55cc222">Déguisements</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org5bb515f">Autour de <code>markdown</code></a></li>
</ul>
</div>
</div>
<p>
Voici un aperçu rapide de la syntaxe Markdown repris d'une
<a href="https://guides.github.com/features/mastering-markdown/">présentation de Github</a> ainsi que de celles d'<a href="http://csrgxtu.github.io/2015/03/20/Writing-Mathematic-Fomulars-in-Markdown/">Archer Reilly</a>.
</p>
<div id="outline-container-org99b4a98" class="outline-2">
<h2 id="org99b4a98">Syntaxe</h2>
<div class="outline-text-2" id="text-org99b4a98">
</div>
<div id="outline-container-org28d66f2" class="outline-3">
<h3 id="org28d66f2">Headers</h3>
<div class="outline-text-3" id="text-org28d66f2">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
# This is an &lt;h1&gt; tag
## This is an &lt;h2&gt; tag
###### This is an &lt;h6&gt; tag
</pre>
</div>
</div>
<div id="outline-container-orgc27acce" class="outline-3">
<h3 id="orgc27acce">Emphasis</h3>
<div class="outline-text-3" id="text-orgc27acce">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
*This text will be italic*
_This will also be italic_
**This text will be bold**
__This will also be bold__
_You **can** combine them_
</pre>
</div>
</div>
<div id="outline-container-org50640c4" class="outline-3">
<h3 id="org50640c4">Lists</h3>
<div class="outline-text-3" id="text-org50640c4">
</div>
<div id="outline-container-org11d3314" class="outline-4">
<h4 id="org11d3314">Unordered</h4>
<div class="outline-text-4" id="text-org11d3314">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
- Item 1
- Item 2
- Item 2a
- Item 2b
</pre>
</div>
</div>
<div id="outline-container-org0453134" class="outline-4">
<h4 id="org0453134">Ordered</h4>
<div class="outline-text-4" id="text-org0453134">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
1. Item 1
2. Item 2
3. Item 3
1. Item 3a
2. Item 3b
</pre>
</div>
</div>
</div>
<div id="outline-container-orgda3d80b" class="outline-3">
<h3 id="orgda3d80b">Images</h3>
<div class="outline-text-3" id="text-orgda3d80b">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
![GitHub Logo](/images/logo.png)
Format: ![Alt Text](url)
</pre>
</div>
</div>
<div id="outline-container-org7cb67aa" class="outline-3">
<h3 id="org7cb67aa">Links</h3>
<div class="outline-text-3" id="text-org7cb67aa">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
http://github.com - automatic!
[GitHub](http://github.com)
</pre>
</div>
</div>
<div id="outline-container-orge09365f" class="outline-3">
<h3 id="orge09365f">Blockquotes</h3>
<div class="outline-text-3" id="text-orge09365f">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
As Kanye West said:
&gt; We're living the future so
&gt; the present is our past.
</pre>
</div>
</div>
<div id="outline-container-orgfa4914a" class="outline-3">
<h3 id="orgfa4914a">Inline code</h3>
<div class="outline-text-3" id="text-orgfa4914a">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
To print some text with python, you should use the `print()` function.
```
print("Hello world!")
```
</pre>
</div>
</div>
</div>
<div id="outline-container-org8737c71" class="outline-2">
<h2 id="org8737c71">Écrire des Maths</h2>
<div class="outline-text-2" id="text-org8737c71">
<p>
Il est possible d'écrire des formules en Markdown, soit en mode <b>inline</b>
soit en mode <b>displayed formulas</b>. Dans le premier cas, les formules
sont inclues directement à l'intérieur du paragraphe courant alors
que dans le second, elles apparaissent centrées et mises en exergue.
</p>
<p>
Le formatage de la formule est légèrement différent dans les deux cas
car pour qu'une formule s'affiche joliment sur une seule ligne, il
faut la "tasser" un peu plus que lorsqu'elle est mise en valeur.
</p>
<p>
Pour écrire une formule en mode <b>inline</b>, il faut la délimiter par un <code>$</code>
(du coup, pour écrire le symbole dollar, il faut le préfixer par un
backslash, comme ceci: <code>\$</code>) alors que pour écrire en mode <b>displayed</b>, il
faut la délimiter par un <code>$$</code>. Un petit exemple valant mieux qu'un long
discours, voici concrètement comment cela fonctionne:
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Cette expression $\sum_{i=1}^n X_i$ est inlinée.
</pre>
<p>
Cette expression \(\sum_{i=1}^n X_i\) est inlinée.
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Cette expression est mise en valeur:
$$\sum_{i=1}^n X_i$$
</pre>
<p>
Cette expression est mise en valeur:
</p>
<p>
\[\sum_{i=1}^n X_i\]
</p>
<p>
Nous vous présentons par la suite une sélection de symboles et de
commandes courantes. En fait, à peu près tout ce qui est classique
dans le langage LaTeX peut être utilisé pourvu que vous délimitiez
bien avec un <code>$</code>. Pour d'autres exemples plus complets jetez un coup
d'œil à ces <a href="http://www.statpower.net/Content/310/R%20Stuff/SampleMarkdown.html">exemples de James H. Steiger</a>.
</p>
</div>
<div id="outline-container-org6dc05c1" class="outline-3">
<h3 id="org6dc05c1">Lettres grecques</h3>
<div class="outline-text-3" id="text-org6dc05c1">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\alpha\)</td>
<td class="org-left"><code>$\alpha$</code></td>
</tr>
<tr>
<td class="org-left">\(\beta\)</td>
<td class="org-left"><code>$\beta$</code></td>
</tr>
<tr>
<td class="org-left">\(\gamma\)</td>
<td class="org-left"><code>$\gamma$</code></td>
</tr>
<tr>
<td class="org-left">\(\Gamma\)</td>
<td class="org-left"><code>$\Gamma$</code></td>
</tr>
<tr>
<td class="org-left">\(\pi\)</td>
<td class="org-left"><code>$\pi$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org2d8310d" class="outline-3">
<h3 id="org2d8310d">Fonctions et opérateurs</h3>
<div class="outline-text-3" id="text-org2d8310d">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\cos\)</td>
<td class="org-left"><code>$\cos$</code></td>
</tr>
<tr>
<td class="org-left">\(\sin\)</td>
<td class="org-left"><code>$\sin$</code></td>
</tr>
<tr>
<td class="org-left">\(\lim\)</td>
<td class="org-left"><code>$\lim$</code></td>
</tr>
<tr>
<td class="org-left">\(\exp\)</td>
<td class="org-left"><code>$\exp$</code></td>
</tr>
<tr>
<td class="org-left">\(\to\)</td>
<td class="org-left"><code>$\to$</code></td>
</tr>
<tr>
<td class="org-left">\(\in\)</td>
<td class="org-left"><code>$\in$</code></td>
</tr>
<tr>
<td class="org-left">\(\forall\)</td>
<td class="org-left"><code>$\forall$</code></td>
</tr>
<tr>
<td class="org-left">\(\exists\)</td>
<td class="org-left"><code>$\exists$</code></td>
</tr>
<tr>
<td class="org-left">\(\equiv\)</td>
<td class="org-left"><code>$\equiv$</code></td>
</tr>
<tr>
<td class="org-left">\(\sim\)</td>
<td class="org-left"><code>$\sim$</code></td>
</tr>
<tr>
<td class="org-left">\(\approx\)</td>
<td class="org-left"><code>$\approx$</code></td>
</tr>
<tr>
<td class="org-left">\(\times\)</td>
<td class="org-left"><code>$\times$</code></td>
</tr>
<tr>
<td class="org-left">\(\le\)</td>
<td class="org-left"><code>$\le$</code></td>
</tr>
<tr>
<td class="org-left">\(\ge\)</td>
<td class="org-left"><code>$\ge$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org69729f8" class="outline-3">
<h3 id="org69729f8">Exposants et indices</h3>
<div class="outline-text-3" id="text-org69729f8">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(k_{n+1}\)</td>
<td class="org-left"><code>$k_{n+1}$</code></td>
</tr>
<tr>
<td class="org-left">\(n^2\)</td>
<td class="org-left"><code>$n^2$</code></td>
</tr>
<tr>
<td class="org-left">\(k_n^2\)</td>
<td class="org-left"><code>$k_n^2$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org39a711a" class="outline-3">
<h3 id="org39a711a">Fractions, coefficients binomiaux, racines, &#x2026;</h3>
<div class="outline-text-3" id="text-org39a711a">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\frac{4z^3}{16}\)</td>
<td class="org-left"><code>$\frac{4z^3}{16}$</code></td>
</tr>
<tr>
<td class="org-left">\(\frac{n!}{k!(n-k)!}\)</td>
<td class="org-left"><code>$\frac{n!}{k!(n-k)!}$</code></td>
</tr>
<tr>
<td class="org-left">\(\binom{n}{k}\)</td>
<td class="org-left"><code>$\binom{n}{k}$</code></td>
</tr>
<tr>
<td class="org-left">\(\frac{\frac{x}{1}}{x - y}\)</td>
<td class="org-left"><code>$\frac{\frac{x}{1}}{x - y}$</code></td>
</tr>
<tr>
<td class="org-left">\(^3/_7\)</td>
<td class="org-left"><code>$^3/_7$</code></td>
</tr>
<tr>
<td class="org-left">\(\sqrt{k}\)</td>
<td class="org-left"><code>$\sqrt{k}$</code></td>
</tr>
<tr>
<td class="org-left">\(\sqrt[n]{k}\)</td>
<td class="org-left"><code>$\sqrt[n]{k}$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org4b11fa4" class="outline-3">
<h3 id="org4b11fa4">Sommes et intégrales</h3>
<div class="outline-text-3" id="text-org4b11fa4">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\sum_{i=1}^{10} t_i\)</td>
<td class="org-left"><code>$\sum_{i=1}^{10} t_i$</code></td>
</tr>
<tr>
<td class="org-left">\(\int_0^\infty \mathrm{e}^{-x}\,\mathrm{d}x\)</td>
<td class="org-left"><code>$\int_0^\infty \mathrm{e}^{-x}\,\mathrm{d}x$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-org55cc222" class="outline-3">
<h3 id="org55cc222">Déguisements</h3>
<div class="outline-text-3" id="text-org55cc222">
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Symbole</th>
<th scope="col" class="org-left">Commande</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">\(\hat{a}\)</td>
<td class="org-left"><code>$\hat{a}$</code></td>
</tr>
<tr>
<td class="org-left">\(\bar{a}\)</td>
<td class="org-left"><code>$\bar{a}$</code></td>
</tr>
<tr>
<td class="org-left">\(\dot{a}\)</td>
<td class="org-left"><code>$\dot{a}$</code></td>
</tr>
<tr>
<td class="org-left">\(\ddot{a}\)</td>
<td class="org-left"><code>$\ddot{a}$</code></td>
</tr>
<tr>
<td class="org-left">\(\overrightarrow{AB}\)</td>
<td class="org-left"><code>$\overrightarrow{AB}$</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="outline-container-org5bb515f" class="outline-2">
<h2 id="org5bb515f">Autour de <code>markdown</code></h2>
<div class="outline-text-2" id="text-org5bb515f">
<p>
Tout d'abord, pour aller plus loin avec <code>markdown</code> et ses extensions / ramifications :
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Le didacticiel « <a href="https://enacit1.epfl.ch/markdown-pandoc/">Élaboration et conversion de documents avec Markdown et Pandoc</a> » de Jean-Daniel Bonjour (EPFL), précis, complet, concis, en français ; un vrai bonheur !</li>
<li style="margin-bottom:0;">L'article <a href="https://en.wikipedia.org/wiki/Markdown#Example">Markdown</a> de wikipedia en anglais contient un bon pense-bête sur la syntaxe <code>markdown</code>.</li>
<li style="margin-bottom:0;">Github propose un court et efficace didacticiel (en anglais) : <a href="https://guides.github.com/features/mastering-markdown/">Mastering Markdown</a>.</li>
</ul>
<p>
Comme nous l'illustrons dans la « film d'écran » (<i>screencast</i>), l'éditeur de texte des dépôts <code>github</code> et <code>gitlab</code> permet d'interpréter / transformer à la demande un fichier <code>mardown</code> en un fichier <code>html</code>. C'est à la fois agréable et pratique, mais ce n'est pas une solution pour une utilisation quotidienne de <code>markdown</code>, pour cela, il est plus efficace d'éditer son texte, avec un éditeur de texte, sur son ordinateur, avant de « l'exporter » dans un format comme <code>html</code>, <code>pdf</code>, <code>docx</code>, <code>epub</code>, etc. Il existe des éditeurs plus ou moins spécialisés pour <code>markdown</code>, certains sont indiqués sur la page <a href="https://github.com/jgm/pandoc/wiki/Pandoc-Extras#editors">Editors</a> du site de <code>pandoc</code>, mais nous préconisons clairement l'emploi d'un éditeur de texte « généraliste » capable de reconnaître la syntaxe <code>markdown</code>. Nous en avons indiqué en début de séquence et on pourra trouver des informations complémentaires dans la section <a href="https://enacit1.epfl.ch/markdown-pandoc/#editeurs_markdown">Quelques éditeurs adaptés à l'édition Markdown</a> du didacticiel de Jean-Daniel Bonjour.
</p>
<p>
Pour convertir un fichier <code>markdown</code> en un format « arbitraire », la solution à ce jour la plus complète est <a href="http://pandoc.org/">Pandoc</a>, logiciel développé par John MacFarlane, un philosophe de Berkeley (le site <a href="https://github.com/jgm/pandoc">github</a>). En plus du site de <code>Pandoc</code>, le didacticiel de J.-D. Bonjour donne de nombreuses explications sur comment installer et utiliser <code>pandoc</code> dans la section <a href="https://enacit1.epfl.ch/markdown-pandoc/#commande_pandoc">Utilisation du convertisseur Pandoc</a>. Comme <code>pandoc</code> &#x2013; écrit en Haskell &#x2013; peut être parfois un peu difficile à installer, nous indiquons maintenant quelques solutions alternatives :
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Des sites comme <a href="http://www.markdowntopdf.com/">http://www.markdowntopdf.com/</a> et <a href="http://markdown2pdf.com/">http://markdown2pdf.com/</a> permettent de convertir en ligne un fichier <code>markdown</code> en un fichier <code>pdf</code>.</li>
<li style="margin-bottom:0;">Le projet <a href="http://commonmark.org/">CommonMark</a> propose, en plus d'une spécifications plus rigoureuse de la syntaxe <code>markdown</code>, des convertisseurs <code>markdown</code><code>html</code> / <code>LaTeX</code> (et plus) écris en <code>C</code> et en <code>JavaScript</code> (<a href="https://github.com/CommonMark/CommonMark">https://github.com/CommonMark/CommonMark</a>).</li>
<li style="margin-bottom:0;">Le site de <a href="https://daringfireball.net/projects/markdown/">John Gruber</a>, le créateur de <code>markdown</code>, fournit un convertisseur <code>markdown</code><code>html</code> écrit en <code>perl</code>.</li>
<li style="margin-bottom:0;"><a href="http://fletcherpenney.net/multimarkdown/">MultiMarkdown</a> est une autre extension de <code>markdown</code> qui vient avec son convertisseur <code>markdown</code><code>html</code> écrit en <code>C</code>.</li>
<li style="margin-bottom:0;"><a href="https://github.com/joeyespo/grip">grip</a> est un serveur écrit en <code>python</code> qui permet de convertir et visualiser à la volée des fichiers <code>markdown</code> avec son navigateur (très utile pour éviter d'avoir à faire des « commits » en grande quantité lorsqu'on écrit de tels fichiers pour un dépôt <code>github</code> ou <code>gitlab</code>).</li>
</ul>
<p>
La conversion en <code>pdf</code> passe toujours par <a href="https://fr.wikipedia.org/wiki/LaTeX">LaTeX</a> ce qui nécessite d'avoir une version complète et à jour de ce logiciel sur sa machine.
</p>
<p>
Dans la petite démonstration, nous montrons comment générer un fichier <code>docx</code> à partir d'un fichier <code>md</code> avec <code>Pandoc</code> et nous soulignons qu'il est alors possible d'utiliser un traitement de texte comme <code>LibreOffice</code> pour modifier le fichier obtenu. Il est clair que si des modifications sont apportées au <code>docx</code> elle en seront pas (automatiquement) propagées au <code>md</code>. Il faudra utiliser <code>Pandoc</code> pour cela et effectuer une conversion de <code>docx</code> vers <code>md</code> (et seules les éléments du format <code>docx</code> qui existent en <code>md</code> seront conservés).
</p>
<p>
Une stratégie qui est souvent employée et qui fonctionne bien en pratique consiste à faire le gros du travail de rédaction d'un article ou d'un mémoire en <code>Markdown</code>. La rédaction terminée, le fichier est exporté au format <code>docx</code> (ou <code>LaTeX</code>) et des ajustements de mise en page sont alors effectués avec un logiciel de traitement de texte (ou un éditeur <code>LaTeX</code>).
</p>
</div>
</div>
</div>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<!-- 2018-09-05 mer. 07:41 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Analyse des mots-clés de mon journal</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Arnaud Legrand" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2018 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script type="text/javascript">
function rpl(expr,a,b) {
var i=0
while (i!=-1) {
i=expr.indexOf(a,i);
if (i>=0) {
expr=expr.substring(0,i)+b+expr.substring(i+a.length);
i+=b.length;
}
}
return expr
}
function show_org_source(){
document.location.href = rpl(document.location.href,".php",".org");
}
</script>
</head>
<body>
<div id="content">
<h1 class="title">Analyse des mots-clés de mon journal</h1>
<div id="table-of-contents">
<h2>Table des matières</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orge93496f">1. Mise en forme des données</a></li>
<li><a href="#org91643e3">2. Statistiques de base</a></li>
<li><a href="#org1db0ff8">3. Représentations graphiques</a></li>
</ul>
</div>
</div>
<p>
J'ai la chance de ne pas avoir de comptes à rendre trop précis sur le
temps que je passe à faire telle ou telle chose. Ça tombe bien car je
n'aime pas vraiment suivre précisément et quotidiennement le temps que
je passe à faire telle ou telle chose. Par contre, comme vous avez pu
le voir dans une des vidéos de ce module, je note beaucoup
d'informations dans mon journal et j'étiquette (quand j'y pense) ces
informations. Je me suis dit qu'il pourrait être intéressant de voir
si l'évolution de l'utilisation de ces étiquettes révélait quelque
chose sur mes centres d'intérêts professionnels. Je ne compte pas en
déduire grand chose de significatif sur le plan statistique vu que je
sais que ma rigueur dans l'utilisation de ces étiquettes et leur
sémantique a évolué au fil des années mais bon, on va bien voir ce
qu'on y trouve.
</p>
<div id="outline-container-orge93496f" class="outline-2">
<h2 id="orge93496f"><span class="section-number-2">1</span> Mise en forme des données</h2>
<div class="outline-text-2" id="text-1">
<p>
Mon journal est stocké dans <code>/home/alegrand/org/journal.org</code>. Les
entrées de niveau 1 (une étoile) indiquent l'année, celles de niveau 2
(2 étoiles) le mois, celles de niveau 3 (3 étoiles) la date du jour et
enfin, celles de profondeur plus importantes ce sur quoi j'ai
travaillé ce jour là. Ce sont généralement celles-ci qui sont
étiquetées avec des mots-clés entre ":" à la fin de la ligne.
</p>
<p>
Je vais donc chercher à extraire les lignes comportant trois <code>*</code> en
début de ligne et celles commençant par une <code>*</code> et terminant par des
mots-clés (des <code>:</code> suivis éventuellement d'un espace). L'expression
régulière n'est pas forcément parfaite mais ça me donne une première
idée de ce que j'aurai besoin de faire en terme de remise en forme.
</p>
<div class="org-src-container">
<pre class="src src-shell">grep -e <span class="org-string">'^\*\*\* '</span> -e <span class="org-string">'^\*.*:.*: *$'</span> ~/org/journal.org | tail -n 20
</pre>
</div>
<pre class="example">
*** 2018-06-01 vendredi
**** CP Inria du 01/06/18 :POLARIS:INRIA:
*** 2018-06-04 lundi
*** 2018-06-07 jeudi
**** The Cognitive Packet Network - Reinforcement based Network Routing with Random Neural Networks (Erol Gelenbe) :Seminar:
*** 2018-06-08 vendredi
**** The credibility revolution in psychological science: the view from an editor's desk (Simine Vazire, UC DAVIS) :Seminar:
*** 2018-06-11 lundi
**** LIG leaders du 11 juin 2018 :POLARIS:LIG:
*** 2018-06-12 mardi
**** geom_ribbon with discrete x scale :R:
*** 2018-06-13 mercredi
*** 2018-06-14 jeudi
*** 2018-06-20 mercredi
*** 2018-06-21 jeudi
*** 2018-06-22 vendredi
**** Discussion Nicolas Benoit (TGCC, Bruyère) :SG:WP4:
*** 2018-06-25 lundi
*** 2018-06-26 mardi
**** Point budget/contrats POLARIS :POLARIS:INRIA:
</pre>
<p>
OK, je suis sur la bonne voie. Je vois qu'il y a pas mal d'entrées
sans annotation. Tant pis. Il y a aussi souvent plusieurs mots-clés
pour une même date et pour pouvoir bien rajouter la date du jour en
face de chaque mot-clé, je vais essayer un vrai langage plutôt que
d'essayer de faire ça à coup de commandes shell. Je suis de l'ancienne
génération donc j'ai plus l'habitude de Perl que de Python pour ce
genre de choses. Curieusement, ça s'écrit bien plus facilement (ça m'a
pris 5 minutes) que ça ne se relit&#x2026; &#9786;
</p>
<div class="org-src-container">
<pre class="src src-perl">open INPUT, <span class="org-string">"/home/alegrand/org/journal.org"</span> or <span class="org-keyword">die</span> $<span class="org-variable-name">_</span>;
open OUTPUT, <span class="org-string">"&gt; ./org_keywords.csv"</span> or <span class="org-keyword">die</span>;
$<span class="org-variable-name">date</span>=<span class="org-string">""</span>;
print OUTPUT <span class="org-string">"Date,Keyword\n"</span>;
%<span class="org-underline"><span class="org-variable-name">skip</span></span> = <span class="org-type">my</span> %<span class="org-underline"><span class="org-variable-name">params</span></span> = map { $<span class="org-variable-name">_</span> =&gt; 1 } (<span class="org-string">""</span>, <span class="org-string">"ATTACH"</span>, <span class="org-string">"Alvin"</span>, <span class="org-string">"Fred"</span>, <span class="org-string">"Mt"</span>, <span class="org-string">"Henri"</span>, <span class="org-string">"HenriRaf"</span>);
<span class="org-keyword">while</span>(defined($<span class="org-variable-name">line</span>=&lt;<span class="org-constant">INPUT</span>&gt;)) {
chomp($<span class="org-variable-name">line</span>);
<span class="org-keyword">if</span>($<span class="org-variable-name">line</span> =~ <span class="org-string">'^\*\*\* (20[\d\-]*)'</span>) {
$<span class="org-variable-name">date</span>=$<span class="org-variable-name">1</span>;
}
<span class="org-keyword">if</span>($<span class="org-variable-name">line</span> =~ <span class="org-string">'^\*.*(:\w*:)\s*$'</span>) {
@<span class="org-underline"><span class="org-variable-name">kw</span></span>=split(<span class="org-string">/:/</span>,$<span class="org-variable-name">1</span>);
<span class="org-keyword">if</span>($<span class="org-variable-name">date</span> eq <span class="org-string">""</span>) { <span class="org-keyword">next</span>;}
<span class="org-keyword">foreach</span> $<span class="org-variable-name">k</span> (@<span class="org-underline"><span class="org-variable-name">kw</span></span>) {
<span class="org-keyword">if</span>(exists($<span class="org-variable-name">skip</span>{$<span class="org-variable-name">k</span>})) { <span class="org-keyword">next</span>;}
print OUTPUT <span class="org-string">"$date,$k\n"</span>;
}
}
}
</pre>
</div>
<p>
Vérifions à quoi ressemble le résultat :
</p>
<div class="org-src-container">
<pre class="src src-shell">head org_keywords.csv
<span class="org-builtin">echo</span> <span class="org-string">"..."</span>
tail org_keywords.csv
</pre>
</div>
<pre class="example">
Date,Keyword
2011-02-08,R
2011-02-08,Blog
2011-02-08,WP8
2011-02-08,WP8
2011-02-08,WP8
2011-02-17,WP0
2011-02-23,WP0
2011-04-05,Workload
2011-05-17,Workload
...
2018-05-17,POLARIS
2018-05-30,INRIA
2018-05-31,LIG
2018-06-01,INRIA
2018-06-07,Seminar
2018-06-08,Seminar
2018-06-11,LIG
2018-06-12,R
2018-06-22,WP4
2018-06-26,INRIA
</pre>
<p>
C'est parfait !
</p>
</div>
</div>
<div id="outline-container-org91643e3" class="outline-2">
<h2 id="org91643e3"><span class="section-number-2">2</span> Statistiques de base</h2>
<div class="outline-text-2" id="text-2">
<p>
Je suis bien plus à l'aise avec R qu'avec Python. J'utiliserai les
package du tidyverse dès que le besoin s'en fera sentir. Commençons
par lire ces données :
</p>
<div class="org-src-container">
<pre class="src src-R"><span class="org-constant">library</span>(lubridate) <span class="org-comment-delimiter"># </span><span class="org-comment">&#224; installer via install.package("tidyverse")</span>
<span class="org-constant">library</span>(dplyr)
df=read.csv(<span class="org-string">"./org_keywords.csv"</span>,header=T)
df$Year=year(date(df$Date))
</pre>
</div>
<pre class="example">
Attachement du package : ‘lubridate’
The following object is masked from ‘package:base’:
date
Attachement du package : ‘dplyr’
The following objects are masked from ‘package:lubridate’:
intersect, setdiff, union
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
</pre>
<p>
Alors, à quoi ressemblent ces données :
</p>
<div class="org-src-container">
<pre class="src src-R">str(df)
summary(df)
</pre>
</div>
<pre class="example">
'data.frame': 566 obs. of 3 variables:
$ Date : Factor w/ 420 levels "2011-02-08","2011-02-17",..: 1 1 1 1 1 2 3 4 5 6 ...
$ Keyword: Factor w/ 36 levels "Argonne","autotuning",..: 22 3 36 36 36 30 30 29 29 36 ...
$ Year : num 2011 2011 2011 2011 2011 ...
Date Keyword Year
2011-02-08: 5 WP4 : 77 Min. :2011
2016-01-06: 5 POLARIS : 56 1st Qu.:2013
2016-03-29: 5 R : 48 Median :2016
2017-12-11: 5 LIG : 40 Mean :2015
2017-12-12: 5 Teaching: 38 3rd Qu.:2017
2016-01-26: 4 WP7 : 36 Max. :2018
(Other) :537 (Other) :271
</pre>
<p>
Les types ont l'air corrects, 568 entrées, tout va bien.
</p>
<div class="org-src-container">
<pre class="src src-R">df <span class="org-ess-XopX">%&gt;%</span> group_by(Keyword, Year) <span class="org-ess-XopX">%&gt;%</span> summarize(Count=n()) <span class="org-ess-XopX">%&gt;%</span>
ungroup() <span class="org-ess-XopX">%&gt;%</span> arrange(Keyword,Year) <span class="org-constant">-&gt;</span> df_summarized
df_summarized
</pre>
</div>
<pre class="example">
# A tibble: 120 x 3
Keyword Year Count
&lt;fct&gt; &lt;dbl&gt; &lt;int&gt;
1 Argonne 2012 4
2 Argonne 2013 6
3 Argonne 2014 4
4 Argonne 2015 1
5 autotuning 2012 2
6 autotuning 2014 1
7 autotuning 2016 4
8 Blog 2011 2
9 Blog 2012 6
10 Blog 2013 4
# ... with 110 more rows
</pre>
<p>
Commençons par compter combien d'annotations je fais par an.
</p>
<div class="org-src-container">
<pre class="src src-R">df_summarized_total_year = df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Year) <span class="org-ess-XopX">%&gt;%</span> summarize(Cout=sum(Count))
df_summarized_total_year
</pre>
</div>
<pre class="example">
# A tibble: 8 x 2
Year Cout
&lt;dbl&gt; &lt;int&gt;
1 2011 24
2 2012 57
3 2013 68
4 2014 21
5 2015 80
6 2016 133
7 2017 135
8 2018 48
</pre>
<p>
Ah, visiblement, je m'améliore au fil du temps et en 2014, j'ai oublié
de le faire régulièrement.
</p>
<p>
L'annotation étant libre, certains mots-clés sont peut-être très peu
présents. Regardons ça.
</p>
<div class="org-src-container">
<pre class="src src-R">df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Keyword) <span class="org-ess-XopX">%&gt;%</span> summarize(Count=sum(Count)) <span class="org-ess-XopX">%&gt;%</span> arrange(Count) <span class="org-ess-XopX">%&gt;%</span> as.data.frame()
</pre>
</div>
<pre class="example">
Keyword Count
1 Gradient 1
2 LaTeX 1
3 Orange 1
4 PF 1
5 twitter 2
6 WP1 2
7 WP6 2
8 Epistemology 3
9 BULL 4
10 Vulgarization 4
11 Workload 4
12 GameTheory 5
13 noexport 5
14 autotuning 7
15 Python 7
16 Stats 7
17 WP0 7
18 SG 8
19 git 9
20 HACSPECIS 10
21 Blog 12
22 BOINC 12
23 HOME 12
24 WP3 12
25 OrgMode 14
26 Argonne 15
27 Europe 18
28 Seminar 28
29 WP8 28
30 INRIA 30
31 WP7 36
32 Teaching 38
33 LIG 40
34 R 48
35 POLARIS 56
36 WP4 77
</pre>
<p>
OK, par la suite, je me restraindrai probablement à ceux qui
apparaissent au moins trois fois.
</p>
</div>
</div>
<div id="outline-container-org1db0ff8" class="outline-2">
<h2 id="org1db0ff8"><span class="section-number-2">3</span> Représentations graphiques</h2>
<div class="outline-text-2" id="text-3">
<p>
Pour bien faire, il faudrait que je mette une sémantique et une
hiérarchie sur ces mots-clés mais je manque de temps là. Comme
j'enlève les mots-clés peu fréquents, je vais quand même aussi
rajouter le nombre total de mots-clés pour avoir une idée de ce que
j'ai perdu. Tentons une première représentation graphique :
</p>
<div class="org-src-container">
<pre class="src src-R"><span class="org-constant">library</span>(ggplot2)
df_summarized <span class="org-ess-XopX">%&gt;%</span> filter(Count &gt; 3) <span class="org-ess-XopX">%&gt;%</span>
ggplot(aes(x=Year, y=Count)) +
geom_bar(aes(fill=Keyword),stat=<span class="org-string">"identity"</span>) +
geom_point(data=df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Year) <span class="org-ess-XopX">%&gt;%</span> summarize(Count=sum(Count))) +
theme_bw()
</pre>
</div>
<div class="figure">
<p><img src="barchart1.png" alt="barchart1.png" />
</p>
</div>
<p>
Aouch. C'est illisible avec une telle palette de couleurs mais vu
qu'il y a beaucoup de valeurs différentes, difficile d'utiliser une
palette plus discriminante. Je vais quand même essayer rapidement
histoire de dire&#x2026; Pour ça, j'utiliserai une palette de couleur
("Set1") où les couleurs sont toutes bien différentes mais elle n'a
que 9 couleurs. Je vais donc commencer par sélectionner les 9
mots-clés les plus fréquents.
</p>
<div class="org-src-container">
<pre class="src src-R"><span class="org-constant">library</span>(ggplot2)
frequent_keywords = df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Keyword) <span class="org-ess-XopX">%&gt;%</span>
summarize(Count=sum(Count)) <span class="org-ess-XopX">%&gt;%</span> arrange(Count) <span class="org-ess-XopX">%&gt;%</span>
as.data.frame() <span class="org-ess-XopX">%&gt;%</span> tail(n=9)
df_summarized <span class="org-ess-XopX">%&gt;%</span> filter(Keyword <span class="org-ess-XopX">%in%</span> frequent_keywords$Keyword) <span class="org-ess-XopX">%&gt;%</span>
ggplot(aes(x=Year, y=Count)) +
geom_bar(aes(fill=Keyword),stat=<span class="org-string">"identity"</span>) +
geom_point(data=df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Year) <span class="org-ess-XopX">%&gt;%</span> summarize(Count=sum(Count))) +
theme_bw() + scale_fill_brewer(palette=<span class="org-string">"Set1"</span>)
</pre>
</div>
<div class="figure">
<p><img src="barchart2.png" alt="barchart2.png" />
</p>
</div>
<p>
OK. Visiblement, la part liée à l'administration (<code>Inria</code>, <code>LIG</code>, <code>POLARIS</code>)
et à l'enseignement (<code>Teaching</code>) augmente. L'augmentation des parties
sur <code>R</code> est à mes yeux signe d'une amélioration de ma maîtrise de
l'outil. L'augmentation de la partie <code>Seminar</code> ne signifie pas grand
chose car ce n'est que récemment que j'ai commencé à étiqueter
systématiquement les notes que je prenais quand j'assiste à un
exposé. Les étiquettes sur <code>WP</code> ont trait à la terminologie d'un ancien
projet ANR que j'ai continué à utiliser (<code>WP4</code> = prédiction de
performance HPC, <code>WP7</code> = analyse et visualisation, <code>WP8</code> = plans
d'expérience et moteurs d'expérimentation&#x2026;). Le fait que <code>WP4</code>
diminue est plutôt le fait que les informations à ce sujet sont
maintenant plutôt les journaux de mes doctorants qui réalisent
vraiment les choses que je ne fais que superviser.
</p>
<p>
Bon, une analyse de ce genre ne serait pas digne de ce nom sans un
<i>wordcloud</i> (souvent illisible, mais tellement sexy! &#9786;). Pour ça, je
m'inspire librement de ce post :
<a href="http://onertipaday.blogspot.com/2011/07/word-cloud-in-r.html">http://onertipaday.blogspot.com/2011/07/word-cloud-in-r.html</a>
</p>
<div class="org-src-container">
<pre class="src src-R"><span class="org-constant">library</span>(wordcloud) <span class="org-comment-delimiter"># </span><span class="org-comment">&#224; installer via install.package("wordcloud")</span>
<span class="org-constant">library</span>(RColorBrewer)
pal2 <span class="org-constant">&lt;-</span> brewer.pal(8,<span class="org-string">"Dark2"</span>)
df_summarized <span class="org-ess-XopX">%&gt;%</span> group_by(Keyword) <span class="org-ess-XopX">%&gt;%</span> summarize(Count=sum(Count)) <span class="org-constant">-&gt;</span> df_summarized_keyword
wordcloud(df_summarized_keyword$Keyword, df_summarized_keyword$Count,
random.order=<span class="org-type">FALSE</span>, rot.per=.15, colors=pal2, vfont=c(<span class="org-string">"sans serif"</span>,<span class="org-string">"plain"</span>))
</pre>
</div>
<div class="figure">
<p><img src="wordcloud.png" alt="wordcloud.png" />
</p>
</div>
<p>
Bon&#x2026; voilà, c'est "joli" mais sans grand intérêt, tout
particulièrement quand il y a si peu de mots différents.
</p>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Auteur: Arnaud Legrand</p>
<p class="date">Created: 2018-09-05 mer. 07:41</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Analyse du risque de défaillance des joints toriques de la navette Challenger</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Konrad Hinsen, Arnaud Legrand, Christophe Pouzat" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2018 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script type="text/javascript">
function rpl(expr,a,b) {
var i=0
while (i!=-1) {
i=expr.indexOf(a,i);
if (i>=0) {
expr=expr.substring(0,i)+b+expr.substring(i+a.length);
i+=b.length;
}
}
return expr
}
function show_org_source(){
document.location.href = rpl(document.location.href,".php",".org");
}
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
displayAlign: "center",
displayIndent: "0em",
"HTML-CSS": { scale: 100,
linebreaks: { automatic: "false" },
webFont: "TeX"
},
SVG: {scale: 100,
linebreaks: { automatic: "false" },
font: "TeX"},
NativeMML: {scale: 100},
TeX: { equationNumbers: {autoNumber: "AMS"},
MultLineWidth: "85%",
TagSide: "right",
TagIndent: ".8em"
}
});
</script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body>
<div id="content">
<h1 class="title">Analyse du risque de défaillance des joints toriques de la navette Challenger</h1>
<p>
<b>Préambule :</b> Les explications données dans ce document sur le contexte
de l'étude sont largement reprises de l'excellent livre d'Edward
R. Tufte intitulé <i>Visual Explanations: Images and Quantities, Evidence
and Narrative</i>, publié en 1997 par <i>Graphics Press</i> et réédité en 2005,
ainsi que de l'article de Dalal et al. intitulé <i>Risk Analysis of the
Space Shuttle: Pre-Challenger Prediction of Failure</i> et publié en 1989
dans <i>Journal of the American Statistical Association</i>.
</p>
<div id="outline-container-orgc84b2f3" class="outline-2">
<h2 id="orgc84b2f3"><span class="section-number-2">1</span> Contexte</h2>
<div class="outline-text-2" id="text-1">
<p>
Dans cette étude, nous vous proposons de revenir sur <a href="https://fr.wikipedia.org/wiki/Accident_de_la_navette_spatiale_Challenger">l'accident de la
navette spatiale Challenger</a>. Le 28 Janvier 1986, 73 secondes après son
lancement, la navette Challenger se désintègre (voir Figure <a href="#org22bba0b">1</a>)
et entraîne avec elle, les sept astronautes à son bord. Cette
explosion est due à la défaillance des deux joints toriques
assurant l'étanchéité entre les parties hautes et basses des
propulseurs (voir Figure <a href="#orgc01ded2">2</a>). Ces joints ont perdu de leur
efficacité en raison du froid particulier qui régnait au moment du
lancement. En effet, la température ce matin là était juste en dessous
de 0°C alors que l'ensemble des vols précédents avaient été effectués
à une température d'au moins 7 à 10°C de plus.
</p>
<div id="org22bba0b" class="figure">
<p><img src="challenger5.jpg" alt="challenger5.jpg" />
</p>
<p><span class="figure-number">Figure&nbsp;1&nbsp;: </span>Photos de la catastrophe de Challenger.</p>
</div>
<div id="orgc01ded2" class="figure">
<p><img src="o-ring.png" alt="o-ring.png" />
</p>
<p><span class="figure-number">Figure&nbsp;2&nbsp;: </span>Schéma des propulseurs de la navette challenger. Les joints toriques (un joint principale et un joint secondaire) en caoutchouc de plus de 11 mètres de circonférence assurent l'étanchéité entre la partie haute et la partie basse du propulseur.</p>
</div>
<p>
Le plus étonnant est que la cause précise de cet accident avait été
débattue intensément plusieurs jours auparavant et était encore
discutée la veille même du décollage, pendant trois heures de
télé-conférence entre les ingénieurs de la Morton Thiokol
(constructeur des moteurs) et de la NASA. Si la cause immédiate de
l'accident (la défaillance des joints toriques) a rapidement été
identifiée, les raisons plus profondes qui ont conduit à ce désastre
servent régulièrement de cas d'étude, que ce soit dans des cours de
management (organisation du travail, décision technique malgré des
pressions politiques, problèmes de communication), de statistiques
(évaluation du risque, modélisation, visualisation de données), ou de
sociologie (symptôme d'un historique, de la bureaucratie et du
conformisme à des normes organisationnelles).
</p>
<p>
Dans l'étude que nous vous proposons, nous nous intéressons
principalement à l'aspect statistique mais ce n'est donc qu'une
facette (extrêmement limitée) du problème et nous vous invitons à lire
par vous même les documents donnés en référence dans le
préambule. L'étude qui suit reprend donc une partie des analyses
effectuées cette nuit là et dont l'objectif était d'évaluer
l'influence potentielle de la température et de la pression à laquelle
sont soumis les joints toriques sur leur probabilité de
dysfonctionnement. Pour cela, nous disposons des résultats des
expériences réalisées par les ingénieurs de la NASA durant les 6
années précédant le lancement de la navette Challenger.
</p>
<p>
Dans le répertoire <code>module2/exo5/</code> de votre espace <code>gitlab</code>, vous
trouverez les données d'origine ainsi qu'une analyse pour chacun des
différents parcours proposés. Cette analyse comporte quatre étapes :
</p>
<ol class="org-ol">
<li>Chargement des données</li>
<li>Inspection graphique des données</li>
<li>Estimation de l'influence de la température</li>
<li>Estimation de la probabilité de dysfonctionnement des joints
toriques</li>
</ol>
<p>
Les deux premières étapes ne supposent que des compétences de base en
R ou en Python. La troisième étape suppose une familiarité avec la
régression logistique (généralement abordée en L3 ou M1 de stats,
économétrie, bio-statistique&#x2026;) et la quatrième étape des bases de
probabilités (niveau lycée). Nous vous présentons donc dans la
prochaine section une introduction à la régression logistique qui ne
s'attarde pas sur les détails du calcul, mais juste sur le sens donné
aux résultats de cette régression.
</p>
</div>
</div>
<div id="outline-container-org2b7fcc8" class="outline-2">
<h2 id="org2b7fcc8"><span class="section-number-2">2</span> Introduction à la régression logistique</h2>
<div class="outline-text-2" id="text-2">
<p>
Imaginons que l'on dispose des données suivantes qui indiquent pour
une cohorte d'individus s'ils ont déclaré une maladie particulière ou
pas. Je montre ici l'analyse avec R mais le code Python n'est pas forcément
très éloigné. Les données sont stockées dans une data frame dont voici
un bref résumé :
</p>
<div class="org-src-container">
<pre class="src src-R">summary(df)
str(df)
</pre>
</div>
<pre class="example">
Age Malade
Min. :22.01 Min. :0.000
1st Qu.:35.85 1st Qu.:0.000
Median :50.37 Median :1.000
Mean :50.83 Mean :0.515
3rd Qu.:65.37 3rd Qu.:1.000
Max. :79.80 Max. :1.000
'data.frame': 400 obs. of 2 variables:
$ Age : num 75.1 76.4 38.6 70.2 59.2 ...
$ Malade: int 1 1 0 1 1 1 0 0 1 1 ...
</pre>
<p>
Voici une représentation graphique des données qui permet de mieux
percevoir le lien qu'il peut y avoir entre l'âge et le fait de
contracter cette maladie ou pas :
</p>
<div class="org-src-container">
<pre class="src src-R">ggplot(df,aes(x=Age,y=Malade)) + geom_point(alpha=.3,size=3) + theme_bw()
</pre>
</div>
<div class="figure">
<p><object type="image/svg+xml" data="fig1.svg" class="org-svg">
Sorry, your browser does not support SVG.</object>
</p>
</div>
<p>
Il apparaît clairement sur ces données que plus l'on est âgé, plus la
probabilité de développer cette maladie est importante. Mais comment
estimer cette probabilité à partir uniquement de ces valeurs binaires
(malade/pas malade) ? Pour chaque tranche d'âge (par exemple de 5 ans),
on pourrait regarder la fréquence de la maladie (le code qui suit est
un peu compliqué car le calcul de l'intervalle de confiance pour ce
type de données nécessite un traitement particulier via la fonction
<code>binconf</code>).
</p>
<div class="org-src-container">
<pre class="src src-R">age_range=5
df_grouped = df <span class="org-ess-XopX">%&gt;%</span> mutate(Age=age_range*(floor(Age/age_range)+.5)) <span class="org-ess-XopX">%&gt;%</span>
group_by(Age) <span class="org-ess-XopX">%&gt;%</span> summarise(Malade=sum(Malade),N=n()) <span class="org-ess-XopX">%&gt;%</span>
rowwise() <span class="org-ess-XopX">%&gt;%</span>
do(data.frame(Age=.$Age, binconf(.$Malade, .$N, alpha=0.05))) <span class="org-ess-XopX">%&gt;%</span>
as.data.frame()
ggplot(df_grouped,aes(x=Age)) + geom_point(data=df,aes(y=Malade),alpha=.3,size=3) +
geom_errorbar(data=df_grouped,
aes(x=Age,ymin=Lower, ymax=Upper, y=PointEst), color=<span class="org-string">"darkred"</span>) +
geom_point(data=df_grouped, aes(x=Age, y=PointEst), size=3, shape=21, color=<span class="org-string">"darkred"</span>) +
theme_bw()
</pre>
</div>
<div class="figure">
<p><object type="image/svg+xml" data="fig1bis.svg" class="org-svg">
Sorry, your browser does not support SVG.</object>
</p>
</div>
<p>
L'inconvénient de cette approche est que ce calcul est effectué
indépendemment pour chaque tranches d'âges, que la tranche d'âge est
arbitraire, et qu'on n'a pas grande idée de la façon dont ça
évolue. Pour modéliser cette évolution de façon plus continue, on
pourrait tenter une régression linéaire (le modèle le plus simple
possible pour rendre compte de l'influence d'un paramètre) et ainsi
estimer l'effet de l'âge sur la probabilité d'être malade :
</p>
<div class="org-src-container">
<pre class="src src-R">ggplot(df,aes(x=Age,y=Malade)) + geom_point(alpha=.3,size=3) +
theme_bw() + geom_smooth(method=<span class="org-string">"lm"</span>)
</pre>
</div>
<div class="figure">
<p><object type="image/svg+xml" data="fig2.svg" class="org-svg">
Sorry, your browser does not support SVG.</object>
</p>
</div>
<p>
La ligne bleue est la régression linéaire au sens des moindres carrés
et la zone grise est la zone de confiance à 95% de cette
estimation (avec les données dont on dispose et cette hypothèse de
linéarité, la ligne bleue est la plus probable et il y a 95% de chance
que la vraie ligne soit dans cette zone grise).
</p>
<p>
Mais on voit clairement dans cette représentation graphique que cette
estimation n'a aucun sens. Une probabilité doit être comprise entre 0
et 1 et avec une régression linéaire on arrivera forcément pour des
valeurs un peu extrêmes (jeune ou âgé) à des prédictions aberrantes
(négative ou supérieures à 1). C'est tout simplement dû au fait qu'une
régression linéaire fait l'hypothèse que \(\textsf{Malade} =
\alpha.\textsf{Age} + \beta + \epsilon\), où \(\alpha\) et \(\beta\) sont des nombres réels et \(\epsilon\)
est un bruit (une variable aléatoire de moyenne nulle), et estime \(\alpha\)
et \(\beta\) à partir des données.
</p>
<p>
Cette technique n'a pas de sens pour estimer une probabilité et il
convient donc d'utiliser ce que l'on appelle une <a href="https://fr.wikipedia.org/wiki/R%C3%A9gression_logistique">régression
logistique</a> :
</p>
<div class="org-src-container">
<pre class="src src-R">ggplot(df,aes(x=Age,y=Malade)) + geom_point(alpha=.3,size=3) +
theme_bw() +
geom_smooth(method = <span class="org-string">"glm"</span>,
method.args = list(family = <span class="org-string">"binomial"</span>)) + xlim(20,80)
</pre>
</div>
<div class="figure">
<p><object type="image/svg+xml" data="fig3.svg" class="org-svg">
Sorry, your browser does not support SVG.</object>
</p>
</div>
<p>
Ici, la bibliothèque <code>ggplot</code> fait tous les calculs de régression
logistique pour nous et nous montre uniquement le résultat "graphique"
mais dans l'analyse que nous vous proposerons pour Challenger, nous
réalisons la régression et la prédiction à la main (en <code>R</code> ou en <code>Python</code>
selon le parcours que vous choisirez) de façon à pouvoir effectuer si
besoin une inspection plus fine. Comme avant, la courbe bleue indique
l'estimation de la probabilité d'être malade en fonction de l'âge et
la zone grise nous donne des indications sur l'incertitude de cette
estimation, i.e., "sous ces hypothèses et étant donné le peu de
données qu'on a et leur variabilité, il y a 95% de chances pour que la
vraie courbe se trouve quelque part (n'importe où) dans la zone
grise".
</p>
<p>
Dans ce modèle, on suppose que \(P[\textsf{Malade}] = \pi(\textsf{Age})\) avec
\(\displaystyle\pi(x)=\frac{e^{\alpha.x + \beta}}{1+e^{\alpha.x + \beta}}\). Cette
formule (étrange au premier abord) a la bonne propriété de nous donner
systématiquement une valeur comprise entre 0 et 1 et de bien tendre
rapidement vers \(0\) quand l'âge tend vers \(-\infty\) et vers \(1\) quand l'âge
tend vers \(+\infty\) (mais ce n'est pas bien sûr pas la seule motivation).
</p>
<p>
En conclusion, lorsque l'on dispose de données évènementielles
(binaires) et que l'on souhaite estimer l'influence d'un paramètre sur
la probabilité d'occurrence de l'évènement (maladie, défaillance&#x2026;),
le modèle le plus naturel et le plus simple est celui de la
régression logistique. Notez, que même en se restreignant à une petite
partie des données (par exemple, uniquement les patients de moins de
50 ans), il est possible d'obtenir une estimation assez raisonnable,
même si, comme on pouvait s'y attendre, l'incertitude augmente
singulièrement.
</p>
<div class="org-src-container">
<pre class="src src-R">ggplot(df[df$Age&lt;50,],aes(x=Age,y=Malade)) + geom_point(alpha=.3,size=3) +
theme_bw() +
geom_smooth(method = <span class="org-string">"glm"</span>,
method.args = list(family = <span class="org-string">"binomial"</span>),fullrange = <span class="org-type">TRUE</span>) + xlim(20,80)
</pre>
</div>
<div class="figure">
<p><object type="image/svg+xml" data="fig4.svg" class="org-svg">
Sorry, your browser does not support SVG.</object>
</p>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="date">Date: Juin 2018</p>
<p class="author">Auteur: Konrad Hinsen, Arnaud Legrand, Christophe Pouzat</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>
<div id="content">
<h1 class="title">Emacs/org-mode</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org945f839">Installing emacs, org-mode, ess, and auctex.</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orge325516">Linux (Debian, Ubuntu)</a></li>
<li style="margin-bottom:0;"><a href="#org95706b9">macOS</a></li>
<li style="margin-bottom:0;"><a href="#orgb87390f">Windows</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org69f7d5a">Directory naming conventions</a></li>
<li style="margin-bottom:0;"><a href="#orgfe267c7">Making R and Python available to the console</a></li>
<li style="margin-bottom:0;"><a href="#orgc458b5a">Installing and configuring Matplotlib (graphic python library)</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org47ff448">All platforms: pretty code in HTML export</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org98a8b7e">A simple "<i>reproducible research</i>" emacs configuration</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgd0815e9">Step 0: Backup and download our configuration</a></li>
<li style="margin-bottom:0;"><a href="#org9008837">Step 1: Prepare your journal</a></li>
<li style="margin-bottom:0;"><a href="#orgd3b10f7">Step 2: Set up Emacs configuration</a></li>
<li style="margin-bottom:0;"><a href="#org73ef313">Step 3: Adapt the configuration to your specific needs if required</a></li>
<li style="margin-bottom:0;"><a href="#orgc85363f">Step 4: Check whether the installation is working or not</a></li>
<li style="margin-bottom:0;"><a href="#orgadd0750">Step 5: Open and play with your journal:</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org7b9442b">A stub of a replicable article</a></li>
<li style="margin-bottom:0;"><a href="#orgdde4be6">Emacs tips and tricks</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org152ca8a">Cheat-sheets</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org8a94d36">Emacs</a></li>
<li style="margin-bottom:0;"><a href="#org1765514">Org-mode</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org4cc7124">Video tutorials</a></li>
<li style="margin-bottom:0;"><a href="#orgd5c8443">Additional useful emacs packages</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgb58b5a8">Company-mode</a></li>
<li style="margin-bottom:0;"><a href="#orgc20d2e9">Magit</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org9260c82">Other resources</a></li>
</ul>
</li>
</ul>
</div>
</div>
<p>
<b>Disclaimer:</b> The two sections <span class="underline">A simple "<i>reproducible research</i>" emacs
configuration</span> and <span class="underline">A stub of replicable article</span> explain how to set up
emacs/org-mode for this MOOC. These are very important sections in the
context of this MOOC. <b>These sections are illustrated in two
out of the <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4">three video tutorials of this sequence</a>, and</b> <b>which you
really should follow carefully</b>. <b>Otherwise, you may have trouble doing
the exercises later on</b>. Likewise, I strongly encourage you to watch
the <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4">"emacs and git" video tutorial available at the same place</a>.
</p>
<p>
The next section provides information on how to install emacs.
</p>
<div id="outline-container-org945f839" class="outline-2">
<h2 id="org945f839">Installing emacs, org-mode, ess, and auctex.</h2>
<div class="outline-text-2" id="text-org945f839">
</div>
<div id="outline-container-orge325516" class="outline-3">
<h3 id="orge325516">Linux (Debian, Ubuntu)</h3>
<div class="outline-text-3" id="text-orge325516">
<p>
We provide here only instructions for Debian-based distributions. Feel
free to contribute to this document to provide up-to-date information
for other distributions (e.g.n redhat, fedora).
</p>
<p>
Today, the stable versions of the most common distributions provide
recent enough versions of emacs and org-mode:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Debian (stretch) ships with <a href="https://packages.debian.org/stretch/emacs25">emacs 25.1</a> and <a href="https://packages.debian.org/stretch/org-mode">org-mode 9.0.3</a></li>
<li style="margin-bottom:0;">Ubuntu (bionic 18.04) ships with <a href="https://packages.ubuntu.com/bionic/emacs25">emacs 25.2</a> and <a href="https://packages.ubuntu.com/bionic/org-mode">org-mode 9.1.6</a></li>
<li style="margin-bottom:0;">Ubuntu (artful 17.04) ships with <a href="https://packages.ubuntu.com/artful/emacs25">emacs 25.2</a> and <a href="https://packages.ubuntu.com/artful/org-mode">org-mode 9.0.9</a></li>
</ul>
<p>
If your distribution is older than this, well, it may be a good time
for upgrading&#x2026;
</p>
<p>
Simply run (as root):
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">apt-get update ; apt-get install emacs25 org-mode ess r-base auctex
</pre>
</div>
<p>
Then make sure you have a sufficiently recent version of emacs.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">emacs --version 2&gt;&amp;1 | head -n 1
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
GNU Emacs 25.2.2
</pre>
<p>
Likewise, you'll want to check you have a recent version of org-mode:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">emacs -batch --funcall <span style="font-style: italic;">"org-version"</span> 2&gt;&amp;1 | grep version
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Org mode version 9.1.11 (9.1.11-dist @ /usr/share/emacs/25.2/site-lisp/elpa/org-9.1.11/)
</pre>
<p>
The version numbers you get will depend on the distribution you are
running. <span class="underline">You really want to make sure you do not rely on org-mode 8</span>,
which is now deprecated.
</p>
</div>
</div>
<div id="outline-container-org95706b9" class="outline-3">
<h3 id="org95706b9">macOS</h3>
<div class="outline-text-3" id="text-org95706b9">
<p>
<b>Note:</b> macOS comes with a prehistoric command-line-only version of Emacs located at <code>/usr/bin/emacs</code>. It's best to forget about it.
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><p>
<b>Option 1</b>: Install the <code>.dmg</code> file from <a href="http://vgoulet.act.ulaval.ca/">Vincent Goulet</a>:
<a href="https://vigou3.gitlab.io/emacs-modified-macos/">https://vigou3.gitlab.io/emacs-modified-macos/</a>. It ships with recent
versions:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Emacs 26.1</li>
<li style="margin-bottom:0;">Org-mode 9.1.13</li>
<li style="margin-bottom:0;">ESS 17.11</li>
</ul>
<p>
If you install this version of Emacs, or in fact any other version of
Emacs distributed as a clickable application in a <code>.dmg</code> file,
you must type the full path to the executable if you want to run
Emacs from a terminal. For example, if your clickable application
is at <code>/Applications/Emacs.app</code>, then the executable is at
<code>/Applications/Emacs.app/Contents/MacOS/Emacs</code>
</p></li>
<li style="margin-bottom:0;"><p>
<b>Option 2</b>: If you use <a href="https://docs.brew.sh/">Homebrew</a>, do the following:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">brew update
brew install emacs --with-cocoa
brew linkapps emacs
brew install wget
brew tap dunn/emacs
brew install auctex
brew tap brewsci/science
brew install ess
</pre>
</div>
<p>
This provides an <code>emacs</code> command for use from the command line, plus a clickable application at <code>Cellar/emacs/26.1_1/Emacs.app</code> inside your Homebrew directory. If
you installed Homebrew at the default location <code>/usr/local</code>, then this is <code>/usr/local/Cellar/emacs/26.1_1/Emacs.app</code>.
If you installed Homebrew on an account with administrator privileges, you can add
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">brew linkapps emacs
</pre>
</div>
<p>
in order to make Emacs accessible directly from <code>/Applications</code>.
</p></li>
</ul>
</div>
</div>
<div id="outline-container-orgb87390f" class="outline-3">
<h3 id="orgb87390f">Windows</h3>
<div class="outline-text-3" id="text-orgb87390f">
<p>
Install the <code>.exe</code> file from <a href="http://vgoulet.act.ulaval.ca/">Vincent Goulet</a>:
<a href="https://vigou3.gitlab.io/emacs-modified-windows/">https://vigou3.gitlab.io/emacs-modified-windows/</a>. It ships with recent
versions:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Emacs 26.1</li>
<li style="margin-bottom:0;">Org-mode 9.1.13</li>
<li style="margin-bottom:0;">ESS 17.11</li>
</ul>
</div>
<div id="outline-container-org69f7d5a" class="outline-4">
<h4 id="org69f7d5a">Directory naming conventions</h4>
<div class="outline-text-4" id="text-org69f7d5a">
<p>
In the following instructions, we refer to your home
directory through the (UNIX) <code>~/</code> notation. On Windows, your home
directory should be something like <code>C:\Users\yourname</code>. Therefore,
whenever we mention the <code>~/org/</code> (resp. the <code>~/.emacs.d/</code>) directory this
means we are referring to <code>C:\Users\yourname\org</code> (resp.
<code>C:\Users\yourname\.emacs.d\</code>).
</p>
</div>
</div>
<div id="outline-container-orgfe267c7" class="outline-4">
<h4 id="orgfe267c7">Making R and Python available to the console</h4>
<div class="outline-text-4" id="text-orgfe267c7">
<p>
When running a command, Windows will look for the command in the
directories indicated in the <code>PATH</code> environment variable. If none of
these directories contains the command, Windows will stop and indicate
the command does not exist. To make sure R (which may be in
something like <code>C:/Program Files/R/R-3.5.1/bin/x64/</code>) and Python (which may be in something like <code>C:/Program Files/Python/Python37/</code>) can
easily be run from Emacs, you should thus configure the <code>PATH</code> variable
accordingly.
</p>
<p>
This requires to go through the "Environment Variable" editor as
explained <a href="http://sametmax.com/ajouter-un-chemin-a-la-variable-denvironnement-path-sous-windows/">here</a>.
</p>
</div>
</div>
<div id="outline-container-orgc458b5a" class="outline-4">
<h4 id="orgc458b5a">Installing and configuring Matplotlib (graphic python library)</h4>
<div class="outline-text-4" id="text-orgc458b5a">
<p>
Open an DOS console and type the following command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">python -m pip install -U matplotlib
</pre>
</div>
<div class="figure">
<p><img src="data:image/png;base64,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" alt="install_matplotlib.png" /></p>
</div>
<p>
Then you will want to deactivate interactive plots in matplotlib. To
this end, you first need to know where the matplotlib configuration is
located. Open a python console the type the following code:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python"><span style="font-weight: bold;">import</span> matplotlib
matplotlib.matplotlib_fname()
</pre>
</div>
<div class="figure">
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlQAAADOCAIAAAB3mAtyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAC0uSURBVHhe7Z35v61HVebPz91Ndyttd9ODbXczQ0JUUDkKCfMo5sK9KqBM4lHIQAKEAyQhlykBAuQkuXAJEMhEghAZjB6TEG4SAgoO3aBRbAMEbMUEevoPbq9Vq4ZVVav2W3s+Z+/n+3mSW3u9VWutqvfd79q1h3s37v76VyEIgiBofXTKKadw8TsOAAAArAeHDx9OxS/WQwiCIAhaYaH4QRAEQWsno/j9kwe/ekr904ecJvpnDyWdTnrAw0RnPODhZ/xz0SPO/BeiR575Lx/5GtajWD/yqLN+5NGsH3302T96AuuBrNc+8ETWvyI95nWkHyOdRHr9vyb9pOicf/NTXv/2p98getBjSdukf/c40htZP/PGf896E+k//Kzozf/x54Ief+6PizbP/U+b57F+/ryfYJ3/E7/A+s+kJ7yF9F9IT7yA9F9JJ5MOkx5MOoX01oeQnsR66JPe9tAnsx5GesrbRQ9/KukdpEc8jfRO0iOfLrrwkc+48FGiZ1706KATnvUur2e/68Rnv5v1nHc/hvWexzz3PSeJfvFi0k+Snvde0k+Rfon0vp8mncp67Knvf+wBr8c9/xLRz5BesEP6WdJB0qWknzskuuzxvyy6fPNXgn71yM+LXnjkF174AdaLPvAE1gef8GLWE1lHn/hrR08W/fqHThG95IoniV5K+vCTSS9jPeVlH3nKy1lPJb3io6Kn/QbpStLTXyn62DNIvyn6+DO3RFc967e8nv3bV3u96urnvOoa1quveS7r2ueedu0vik6/7nmiM0if+CXRmZ849czrWa+5/sBrbmCdxXr+WZ98/tmsF5Be+zukg6TXkT5FOvR60ad/+RyvX3nDjVG/uv27ohe+8TOiF72J9FnSi98s+tyLz/3cr4nO+/yvi87//EvO/z3WW1gvfctNL72A9bILfv9lh1kvZ/3By9/KegXpbbuk3yC9nfSHryS9Q3Tzb77Ta+vCW0S/dRHpVtJvv4v0Bda7v/Aq1m2kV79H9MXTLg5677HTRe87dsb7bme9//YzWXeceQnrNaSdO0lnkS79Euls0mWku0ivJV1O+vLrSEdYrz/yldd/gHUO6YN/JHrDUdIfk7Y/RPoq6Y1XiL72xg9/7U2ij/zJm4PO/eifel35p+dd+Wesj/3Z+aw/P//jf/4W0VX/jXQB6er/TjpMuob09beSrmW97dpvvO06r7d/4i9E7yBd/5ekd5JuIN1NuvCTor+66HdEf/2uTwV9+pvvFt34zffc+Des3/2bi1n/4+LPsN7L+tv3fvZv3yf63D3vF33+W5eIfo/07R3STaxLb/rOpb/Puoz0B/eKLt8lfZd05A9F3/sA6WbR333wFtH/PHqr14e+8Pdet/39Fbf9A+uL//Bh1vc/fOz7HxHd/o8fFd1Buu9K0Z33fezO+1lfuv/jX/oB6y7WVXf98Kovs64mfeV/ka4h/RHpf5Ou/WPR/7nuq16f+Nr/FV3/J/9vj2ug+NEBstSQ/Y477pA+LaH4ofih+KH4ofih+O1NDRc/KnJS8DRkl0PSzRSKH4ofih+KH4rfOhc/XzD6oCLkW31Q/8miyKjh4kfIGA0ZqfLJ/6VnLRQ/FD8UPxQ/FL81L35SUAZF1USKX2FvSfpPFkVGact4b3vGRqv+TVL83vQNdnr7Nfus+L3jrzntL396uPhd+E3u+ZXPPuwi30DxQ/FD8UPxQ/GTIhT7b7TR/SeLIqO0ZYy3PTWUjXROesPX/THh3ltObhW/h199C/f4xumzLX4v+uK32VHgzut18XvQ4bu9PfDtay7Nit9b/8ofOH78trdVxe/t6SjxnU98AMUPxQ/FD8UPxW8vFD/dp7boUdpiFz+CjCOgDtI5SYof1Tza+W279rGrFl387rzebfsu+eD32OWtF5g7v0uPuqNfOKx2fi+5/Ttk+t4dz3n8ZVfw0R9c8VJV/KTy3fUp7PxQ/FD8UPxQ/OZX/OIhLbOMFVFcsfPddJukR2mLXfzIUkPbQWJj4zDJNfLNny5+p97yLW5//eZ76Y/7Lnu+K34vEOMtlx/jjoFvnC7F7977+Cjx3Vuf6orfUz92nxiIb33sYi5+5/8lP/ju/X6H993bnqaLX3rbU4rf/UdfbBW/w66Sfe/2Z/Obn774PfuaH5DtO9de9uOPP/c510r78lj8nnuds1x3xCh+3/shV01ufOnUJ7niJ6VO+Lu7DqD4ofih+KH4ofhZkiIU++uKpRXtuozVUbjiBbRdj9IWu/hRbSNjgZQ9pWbxO/kj/0jNb330wgeELSAVv5Ov5GJ2y5saO797b33Ko84643Zu3nLu2Q889y+4dce1tPM7w+Vyy3mx+N32tJNe9xoxnl8Wv7PuZDtN6Gz7M78dte3rLX7Ve55HVPG789STD7/hy9z84oWHH/zKL1G5v/f6D/HOz9W8e2+4AsUPxQ/FD8UPxa+WFKHYvyhaUdGuy5gZhete5USP0ha7+BFkjMQNn9bhwxvZ/q/4zO/Yx/k9z4dedTM/+PppD7voMt4FfuO0kW97xuLnCx5VwRNe+8DzpBBe54vfHdf9WLv4ybddpAQab3vKJ39+29dd/PgLL5+6jUcGvvxp/bZnLH6nXv9Dbmm+8hkUPxQ/FD8UPxS/WlRFZlj8uO4FtF2P0ha7+JFFU5Q9EpU9Kn4kOiqjsrc91bc9T/4ob/huPsYV7ltXXjT6M79ZFb9nXHU/Hf321Tu6+D2o3PaNVfzCtz1fcaf7dPDO57WLn9/54TM/FD8UPxQ/FL+2pAjF/kXRiop2XcaKKK7k+W66TdKjtMUufsXbnrHg+cduL9hZ/B7wfPdRH3Pf5S8Y+MJL19uejeL39Kvu//ZV71ef+fHO75lX+yrIxS9s+54Vfurga941lw584UUXv3e4t0AbO78HS507/s1tFD8UPxQ/FL+1L35ShzTxEEmKUOxfHI2Kdl3G6ijxYWHRo7SFD0cvUsboAEHGSLHb06KjMqpZ/B52+mnyDZdjV/lvez7izCe7z/8c4QsvefEb9YWXdvFjU+DWC/gzv1j8HvS4T97q7LTti7/zS8WP9n/tnzq8/i5vF7LP/Irid8pbH+I+9ovgMz8UPxQ/FD8Uv0g8RKJCUxS/Frp/HWW09ChtsYsfWTRU9qj4FWWP5OzZ117kF+558bvQfdp3/Gb+qosvfvgbXlD8UPxQ/FD88LanLn6Dkv6TRZFR2mIXP/0OZ6SofIIMiTKKn7ztSTtCqXwofih+KH4ofih+K138qIh0IsXPP+hAFz9v6qC3+Ml+joyCPKT/E1L2pF1XPpJR/OofuaP4ofih+KH4ofitaPGjujJXJosiowaKH4n3dDlilHJIiKUWih+KH4ofih+K3zoXv72s4eI3sVD8UPxQ/FD8UPxQ/PammsUPgiAIglZbKH4QBEHQ2gnFD4IgCFo7ofhBEARBaycUPwiCIGjtNEXxu+nsk048e7cwzkSz9dzjTfrMfEbzW6KV1BKXC2cKgtZMHcWP7gvuR36BA0flTjHN/aL0ecL2TflR7X/cQMr5Sefc2DW8iDgoFYI4dKTqIOp3OJF2zznBZyAzrTp4xTTmmo92zusTz+klh+I1I0dbmkd6hc9WiHmEhiBoD6uv+M38fjF6bHF0vEB0q1W33YOXdA2XPv2BdE9qt+pfv8PxxZUvOadZt+vfPNNQckXOtSm3k048wa/JZKs6KxU+WyEWtEQQBO0VTVT8xBLt1PDbj3wDN0LmvSb52eDbuu9z4/aJ3jZqc5OUbsFezs/2Qe8k3ZG9weUssXxENbalomd8aLg9cMjnrwI1R7mJy9EB6RrvJN6yiDJZtYAHD1QR3Vq5scUSpW1lb0pfPXrQp3T04IGjRw748yWNlN6IcxFiWekFu5xcmlR+lluKY4uHKURxARSrB0HQamr6tz1VsfGWfLipwqf3o+6Gyf84bp2Oyr2V9nxicbG85yMHQqw85yLioMqe4tByG0qU36jpgb5dTVyOjpbR00VXEXmykk/sXEXkrGRzXCwRW/xcuJK5xqB4w8cF78btgy6KC0qngz1L6DqQMf0qPZmae3jo4AF3yDuXuKPkImb4ENWZkv/XqwdB0Cpq6p0f3y80ffeLlk/djpa6c4/45uVKoOnZ5RoY/1PMsqe7mbbcxiG1pQiq26Nl9Aw5JDtZ1LaGLNLQfahtZsVj3RTE2CkaKwvOFUs2Z2GLJm7rQIMWl4PsKbkMkyWFCHFHSHuLD9mtJqxA1jmsXhwLQdAKaRbFrzjao5ZP3Y6WyUKwqnpQeI5q2Vsqeo52G9tmMn4DVPUfUHVrlrGZh2mKX/TgaoN/OCi34Edkc0YbtQPbN4Utmhm6x+Ki857viLhy1TSEGJb2Fh8WRtterTAEQSuk6T/z4/tj750oqvap7jX8Zlfy7zr333+pc9wTiAcdy7ernOueo5X1jN4abl3bv4NHljAXP0018dztgMJwecih00drYoxlNQb1R1OeKas4Sto3nX3If8JKxWaMGkBbtJNi/yMHqO0/+Qtuy0Bq+mpB8vRc50PBFdXUQweprDong9IR08MUIrPrzvpFCQRBK6fZfuGl+8sRegjjbn/yRmX8XoaKKx/j+dvogOhm7bwwzq3yk9pFzmLXPUdLD4+lq7CLQ/8grQzf0B3p6ydh4kxnAk7RFeFv5Vli6RWDX8CRX3jxcX2by4PQt+xeoYC5hy5KSozsRqDqvIeBjjiFVCPHK0s6on6YQuQXgDcRafUgCFo9dRQ/aGGi23rnR1ktFfd6aCxh9SBobdRV/PxLYUXRYQJ5R4qiw4I1bg7Sv6Do0yn/9VRmjN2GH1GxxNu3z6BB0Xlh8uFzij5eKH4QtDbCzg+CIAhaO6H4QRAEQWsnFD8IgiBo7YTiB0EQBK2djOJ3BQAAALAf+P73vy+Vq1NU8KRhFz9qAwAAAHscKX7+wRBS8KTSofgBAADYr8TiJ/VrtFD8AAAArAIofgAAANYOFD8AAABrx7yL3+6W/2uhHFu73tyHGzzmmD5CWps793iLxXjJh969Cd+zszk6PLHUPKVj6razyYn4BwU0GeeUiLkGU++CaJS/bPJm8magvqVrohOYbAoV8TTFlKLFMRCkHs5YCyK2wl3o2DqDQ1iBGLdQw+vTGh6Wefg05YGCP0GZxzrfEt2Ndg7V4vAheZguhU2iOnebOzvjBW0jPltLpO12T2LM06ETVzNqzyYtSw3HHg49GvIRw8d1Zya9bkfQKn5U2woLaaKdH80mLAit7qi1UT0jhmlq+CSL14GE+Jnkm1ZumnTee59+A7GJ5eYpHXN3KlBOHZYs3v/wRA3ScIWZvBmoe+mG6D2bw8TcOSW/jGOcOGu4vSDWieNB8thc2EHMQA5+PJB6eziZu5MpAvFD38yWbrzznWVOLjfDY9VOC8bTkDZFCWHY2D+LUcgiFYtJ7r1zNTOzp6NYJZuUfeWTIWPjae5QKz9Idmp6UAkFulyMHYgxix8VNkEbxT5V8XPrdg9PMFby2JZGJAyhwVv+iLrA3AWnjc5Al2tmHMZYapvBtS0m6ZsjSKHDzN2o8CCPNv88ZUXrsbk/d/7C2scD8WQwwaecaiELGvrReQ0dDCNFqc+imXwjUKB76WyCd5eicyTJuuhuKca/6pxT3wwMnjhFGm4uiFD4S6s0TqRIK5A4Kzy6ZclW3R6ecsqohxNmIKGYEJ2f/jORDaV8tkhsoKsvNLld+mtkXhEubDfl8MCYgqaYow5VHKpXY8Qq2VBORl91jgxcRtVNwJhdMHl6krLy0dNxcatnXCNQTLL13KyLn6t6iWiXQ1MVv9jUZzS1Vc8I5x/GhFlRSw1R1qpnG78wg/08g9eT7jDYmVBzYJrDF5WnxKkH5w55jeWZXMygPnVk8Yd5kG+ms8XxRhklHyF6NpM3AzHeRRoyCepKVdHT3YFjiplafaEor7qjZbPRw/WowkPpMC2oWqJu7EBu6TOLQ0Jpkzn8nh16qeOT0p3r4a1AQmnsPhFENtbf1bd20/+cXRJi/NKlQx3ovj3jij4Uy0ctLu/am+tKf3Zl5ydl9ByaHedBiYT2UEoduURKd47CBYcXA7XikTpQWI2yrSiKn6t3JXJIjk5U/HiVHTobyVUnrdsBZQp3HHU/IuIgZU73pgH08o3ASqxA9xjuzX3yyDH7fHaeZeap++R5qFStyHyVylknuKOZ3nDOKajuqtpVIE3n0ml0SmqOhTW1/PFkHAH5Ts+CyPAieIrhjQVhiodUaWKeu12hMsxAce5FrJrGcDpl0h44SaMC1UtHzjqf/oVDCRPSMs4Jrz7buk+XI2YfGyOx5iOUl3fRs/90JKqFLy4wi3xMPqky9HgrRcON66A1TWlKqw7EE8kw1r7e+Ym9QA5NWvys+csLmuyg1VOZwlTz5Y6D7EUZwk6uII9oYuQ5kuo0+0uqlc/y8tRxm9d94yR7/EGz0+iRjthDdbWTN30NByjQKak5mtHVcTslDd/GzD7Kywjq4SMWpJh11jM70oUZKLu9jJx7Y+nSDWn0AowKVI90fn17iGyVgit5dWBemL7L6HRL/LPG8mcwoltxqHroV4iZaAWa12eGn44nX4oy+Y5nt6a6KzKFCxWQm9IyAnWco9YXXkzNsvi55PhrUv4hQT39Qz4LMkgNjlNVc1Yd1GSzDhXuySE9XdO1GIpPl02drPLsqXumV9bqNfYIVBIeXqctHWmhebZ85ieP8khpy8sXgZOvxgp0yBwSp2cZ1dzdeNdSKVuLrAKp4a7pWgw9smZZkIbTqsTe0T0vVfDZfdW5UY3I9YmrMYePWJDihKiKlxW/vgUZWPkiVn0t2cPVmdU51cMj9VVmLB1NyRxskTnMfVEafEwlScT+6VrrCMiusqc205pmPUfBJZJ5aPVs2QPp8pama9GonguB4EsmZlIkVYZOq8ejBt2rzBKFT/sZZwSixkDAeRc/TsVTZULLXUw19ha7f8izCkecE7luBOkZLHQ462mTxmfxxVyNU0scMHo2fDahNMtIlWmBedY9Yz8HH2ELf5fMm8L4sOBCyEHHEQuTrCrYgFHlaRmHAulpulSz5WgQh+vOYaL8os0dCr2oUzjWcp7yEXK/1YkraQ23ppl3DT3VWVKxx1+QbD2JtCjeEPpmXhvDk1n1NoYzRiBz6ahfz4SEdGONqThDCrYbU2Ssy65nAY2k6mlmkcKRFEfN1OzpMFepQjuVCenpMM0pcb/Bm0A0qwPZiW+Rr1OWk5tRSJM6BcehvxEoS8qY0fx3fm2GXqGsNvl5BguAnzpdz8F1YQUXZLyn1XrfgvYgC70rSvGjStbJTIqfqshrfO3RnQd34oWC1xsFq7cgvBUc4zklGwlcFHuHRd4VqfhRDRuL6YsfAAAAsEz02579/yeh+AEAANivUPGj/8cS1vN/EYofAACA/Qp2fgAAANYO7PwAAACsHXPf+YVvdubfqDK/lOW7Lu+7V/zN767oYVJ6EsGGL9MDAMCeZ0E7v+r3NM0vWe/9X95wlZMc1SRS2STj6F+YAgAAWDYL+syvLmmuRhhbpK7ix1u0bJvlDJsd/7gMV67UwfvhiHJA7zuHfarip+j4CzsAAAAslWXt/FqVo6f4qbqp3qjk6iXNhmdP8Y5r/rCI3vSpqmYBHRkRHAAAwF5gaTs/LifWDmm4duTlKhYbZR6595IBXNa4dhWlsIg+4LOqslwTse0DAIA9z1J3fkspftKRRrl/7r8IVzwc9Kn7cz1F5QMAgP3AUnd+lY0wepZkdSj2HyxUkd2tLflnIXfozzxaR/FzRVuMqn7z26CDiQMAANgbzHvnx9shRawlfMAsFh3Fz727GBCPwUJjQ8S2m/jmJDVUHdOwuekzhQ+jk0UYngIAAIAlsqCdX0Wr9nUVPwAAAGAaFvSZX4l6PzHh91cofgAAAObLsnZ+AAAAwNJY0s4PAAAAWB7Y+QEAAFg7sPMDAACwdmDnBwAAYO2Y786v/P2b+p3fzJFYW7vuO6NL+cYoZzAQeKzkppzRXBekdNox9xYLO3FmIPdAPY5MMaNZQSmkJ4z1Benxlk56O+b4PJwT/adjudPszxMsm/nu/OhKcBeC/+tRzB84zAy+A1A0/mMvP7ftHzKGlcqYckZzXpCBX2SaMzKZc56JdqDuXBcJ5amzKh462jOq6T8h+5oFTXNNVnOlWcxnfvHvBnPwU5WfrLrNr9Y2d+QREa8rusa8afDZTV2dz/ylV3S5ubW15T0kp96nHd3KM7V2xUnWVyXuCFaaH7fcQXrSbEWz5BO6eaIPe0bd9C6IPSN75eNo9deiBpsVRIhHklP1N8v1TzMNjynZydu0AxV3MmNGTJxVupbqVXIW61/CSl3T3OvhCYqWxydD2ak9o4IUh3BDmBR+3PWMS8FdXNfgodvnqLnnhGApGTfWWOTkkhhvms0Z6dFubDZ7JuRV58lU0VvJgwWzmM/88uInj8MpD2135fjLhtrOSJeJvoJzJz3QZeZd8hUXA4XobJTjVnRuhZ5lO1y12lrcQ5Nz95wMyXM7xozdqbMaOj9STmlBmHJGdLReeTUjvV5COQFrRmm1eHx1eAAaE4arTIgy+fExV78wGksXV0aMoZ0mR63gw5h7Y7igZhtQ3iaAIuSjVQQ6plxzgoPrGYb4tfA9u33q+ep2myJ9digGaqkj5CzrN1ZKxozo6K4McWmKIyNMJD9gR28lDxbJMnZ+RLx00jWUXwXuyuOrJSNde12YF2i8ph2hixGdG0aeTO4joTtlI+hBWAFlVsuS+58X7SjFjKijX3IPH81Hl8/a0rUZi5/0nkYibewTx7RORz/mumRGazrmKhEqH3WKq7m3hgvpThkhDx1FokU5gynXMwzwf8iYbp+j527STp+b0iImn6Y5ozzVNKAMk8gONKIrMzelBRbMcnZ+hLyKUpdQ3keuDnWNTIJ5geY+QxcruqPKk2nlpXtlQ+hB8K/MKqiZ6sxpRylnZM0wHz1R8YuoBeklT0m7b52OfsxcM6M5nUZgZeamtBJx7iPzXu3i1xcjo50+N6VFTD5Nc0ZkjOdBDyjDJLIDjejKzE1pgQWzpJ0fwbYdZecXxtkVwc3yDjsuUroEd+ugB1ky6Wo0ojvKPJmsgyK77ulKD6PEu7RVH5VJ6sx9R8+Ze0y6LNaCSLuYER2sQugnfJVmNnfCmJHyqRanG7VcebjW6einTN5RGK2ls1YpyyfmbM7dHi6EEIpR3YfRZ88x3XoGd/4PP6bf59iTKdJXDrOgk0/TnJFyR2UwDSB7OonZTPL4dnQVOutAXid/boMxmfvOjy+NQHFSs4vJXQTu1DtiVz1+gqtCriYhjNa2kEAjuiPLUw/Ww71B8ObUd2tLLnHfj9thSIgVXag1MXEdx18JT70g9oyKOfl4yrbFn9jriXgMB+YqTTAD48S1ku/FTL4xo3rpiGpOoRe1wzE2N+beMDN0aMDQTxaGJiTWKdbTO6QOPIAcOgOlN4bPLKkRM8uTdw6CSxoVjrKDvOd40/Rjqc3H1IyiU/mOSkw02f2M8uhWKDE1kk+dYwgwVxaz87MZ8RJp4YyKnuc5EXRRz+qK5udHeLqBVYbujPkTBHdFAGbHYj7zK1AvkcLTOb48WsrzuxHdyHM8koPZlSvcA9cGep2Trht+eYaXPADMjGXu/AAAAIClsJSdHwAAALBMsPMDAACwdmDnBwAAYO3Azg8AAMDasW93fvfvHN/e8u0VJXxXdMIvdzaH848lkpG/6brMH5kAAMASmPPO756dnY3NY8U3tPuNS4dK7A2z/l3BmL/56+rd9tkxfLm/sAQAgCUw/50fV7WN7eIO3G80uWHj+DYp7vx23UMnqlU71Ng8fj/d+DeO71D1Cofu9r3drlGMrhsjHjaP3y2HnOe7t0I3p2YVzH4O6H4y6H+RxVssIVYX1Zdxk5W9VzxSLEBZvbRTea1g+YwUw63toPsFWfBaRAcAgJVkQZ/53b21sV1t7PqNNjvqbc/4LigVPBpMdYtduJLmixa1pdTFRvXeKZdJd8gP7975cengqkF/cEWKv0fu/cdQXEnyRmqnvkTeWx0NQX279OkxD1Q+Y3kuowMAwEqywM/8Zr4FLIqfVCkxpuKn+ogxFjbhGO32fPP4DXEjGOgvfi5b/0coflyeAkPFT5nyv8sj650fSp6mLX7NEAAAsJIsaOdH99QbjP1cv9Gip/jtqE+zFlz8uPSFoqIriln89KduefnJeueHUPwAAGAyFrHzu39nc3tjoygi/cYmXTs/9y6o4GtbXhG1E7P4+c7OVSyTBa3iF2qKfztUIHt6j1HKDjdih6L6lIVKlcl0yPDpyYd7Sp8qun6DFgAAVpU57/zkDUy9rSH6jTauDiVRxQoWqnPyJRcqfvTwblfn+PsvTrGo0m5PLCQpjVTkoiUahfh9GW3M4OIhb2zy25w0BWeg8uIPkG3wH0Mx/kGl2EvwfV0Mjy5Thk9vEMRsGCXn6FX7BACAVWWBn/ktgXyTt3fJ9nMAAADmzcI+81sGcc/XertybxB3XcYblAAAAObAau/8AAAAAIOV3vkBAAAAFtj5AQAAWDuw8wMAALB2YOcHAABg7cDOzxN+ATfhNy6bw/l3eckoP6rzD5bBHp2m+vXiAn5oSNFSlOLvFAAArAdz3vnxT9erv6us3zg9dJ8b5z7f1bvts2P4fH7St8+nOWb6U0IVXEcrHgIA1oL57/zkr24pbi/9xpKw9yBW+d8PWpNpMjE24yblBsrfiuNM4SVRNfeOVVLDPTQoT4gMVScAwIqzoM/8ZvlPGvGNje9e9Affs+LbViv27wetyTQddSgeLyZqxWP13EPC2Sq5w66j7+rbDiMbHQIAsB4s8DO/WW0Bw53S/xGqAt8GA+nuFjor8ltdLCqOrHd+KHkyfHrMA7lxVPSMNZmmow6lRnBTWsbcw0j/hxumuzmy4HSwiMXJ5gUSALDyLGjnRzeYmf2TRtb9zt0Xwz1N32pDZ0W6mTK6c3EHzw8lT4ZPj3kgN05X/FZvmo46lBoRJmLOPYz0f4h9ZDgUPwAAsYid34z/SSPzfqdun3R3S/c+svv7Gt3h5K7HjdihuE8mLwwf9E19yPDpyYd7Sp8qenz3jiCvtElJXVd0miZqWh6VcEjPnHsw+j/8MIpe+EvQsTKbUd0BAKvJnHd+8gamurcy/UYDvqvKO1lcLKi/M9C9yx8g2/7894MkVkjbj6UOMkQMKzDNiny4uwBCPmq6Lv+Uj5+7N5B/iSg9uG/mNS6Sgw4NGAAAq88CP/PbK4SdxIqzJtOcgKLYofYBsI4s7DO/vULcjqz2DW9NpjkZtE9Mm1H/TikAYL1Yw50fWAb6rVUFajMAYCms3c4PAAAAwM4PAADA2oGdHwAAgLUDOz8AAABrxyJ2fvfsHN/YOK6/2rC1wZakTW8vuef4Zn3INBY+t7xxD9KcO81r47j+/sfulu8zyZdCFrV0kuTkX1vZL3k64hmJ3w8dK6V6OBE9eOM4C9K8Qqi/Mu5sWk+xcQI1yQMtHV7MBTz3Z7J0U9A8730s/7KpmGBGMmSaa28hO79dzjL7Xh8tlrpGt9oLRzOsvxBoGrVPu8MeoXvuAl2Ck01lLkuXJy9MnKGwj/L0N1a6noPzdPqsiBpzOKXkZ0HG4GqMBXH0zMu8zMYN1MXQOsyXRUXfC0vXdT23fe6ty8Yx7jN0oP/Qei7kMz9KIn+1G9MqFrfeI3LP+gS0jHGqu8flF97ysnqHHuqXFS4fesiHYlauQpNoYHz9aA6XJFkhh/jinUbR+aBGNtkCa+506YiH+lwWJzhF11HUjGhl0jQnXjpZDekZ22GJvMIQynAr5G+mJEbJnKIbPfdFnhHyH9MI0KjeJ781nMjqaOeCOIorxLyWyHm8clKe/YHUKtFRcWAEaqy8fdFW8HOHnAe3Mc80PE8sPu/otHq3lKcL6p24/vbwkKp+vtt5WnPvXLrWncFIyVq61oIIxXnXefrkG6dDmPdlY859vBmZxEk5t9K/cz0LFvSZHy1ENqt4nvL1kjkUK0IrlS7EgGEkn2GG5Cc6kYXmzqoi+rEuDe4YG+GCi9TDqSE9KYq3hOE0Vu7I3m7SmDthnvvMSGPjKNVOq+FOeew/zdLpbqmtekZ4xcRI0cNRY5Gdn7onsV/ylD56hSPmuStpD9dXLNG7II7hy0buROFqSVPuDpQs+QVGlNHrlSeLddGacJ71qamfcS6uXzG3qr5niE490xTaT1iC/PiVaeTZmnvX0oVAFCW7M1gzislr7AVx1KfYH1WzM30K5Ylz1D4nv2wac++fkYGaGoVLp6N7PTUL2fnVhLSKnZ+NOYfa6NaFloOl3JanJK9MtFj0FJL/e8jPiOFuiI/iXjY6k0/Gn7zB4teY++DlqEOLfG7uaSnS91BjlYjaSJboM2YVu+n+lkOdoZ+UtciEXsxs+pZbw0iW5eYpFBWRKELHJJ2K66cezqe1iGLlbxs7LhuC7jLpoZ51Z6DWBVZHr8baFy11q42NPLUHn3ljKcROKen1rIfHE83QENfZzpOY5skVHvpVGjEjwnLYPHHFyjeuZDtJR3niHIVxqsumMffeGdHwsEQiOh3ZiVOu+tdTs6CdX8lQWgV1BSJKY8Nn2c26SrI1JT/qmWNEiScvugqhi9Ns05778OU42jORJ09Ms3QUmrqVi1P11BlOXFT2S55CdlKIwfOSo4dTrLLyOboWxFEm4yiMI+44/YGY6gIro9crP87iZKstA8lh+xlX4jrTHTClZA23n++DecaegeGlC3n6VRoxIyJ01hgLEshWPj+UJmj5FOZ+2Zhz75+RRXbiYnrjrKdmyTu/ApobXbh6ep76tTZRGBs+65OkV98vN40NRuqvb0blcBWFxvqFDsbiNNs08iTMc18Ys8sxkIxqIp4plo660USyi1X5p6BypnSGsbOxyPliZm6JPZ8n+fFGykrHyvu3MIdTRGPWQs+COPS8IoWRosdrkg5l2XYEouHeW3WBldGtlU/Dh9B5+lVVJ51imbOgnt4undUK28NVkjQ2djbzHDF3DjR66UJ0v0pyZzBTIpR/vXSxQ3GZeZ8B80o2fQrFcKH0Oc1lY859nBkZqKXjWHJqxllPzXJ2fpSKbFGL5WsWv3rpHdpo+KTJR6NacYnSNG6Fy6gxnJ8tYqE7l8tWQlMHyoefSO6smLMgzLkno5NMyjSK8ygJonvWcSdZugB1SxeTI03f2f1Dt2Lej3NSL3K0UIK6Z2Sv56muhyJPfd9pUg/PLzBScerGWBAnsddGGkIT5/87S7FQxFiB4gVmRieKlWesi9aEVjLmGc9ychiecYxevdCTU6J2CCc9zeHG852Y9ZNLxtI68KTUncGekU41LJ25IObK11eyYPgM3UQ6VW2UnGN07VOI09REY2vu/TMyidMh8eq5c9e/npol7fwmgNYurFTCNE4JPalm7nO5TLF0dJlWz/e5sV/yXBhTLMh4LCzQEF0vI2bLlM/3OS/dEhakn4nmvndmtKTP/PYgdM7CC4oRrzvWh/RabEZP4zmxX/IEg8QNQb3Bmj374fm+0AVZCHtqRvtn5wcAAADMCOz8AAAArB3Y+QEAAFg7sPMDAACwdmDnBwAAYO1Yxs7vHv41RolpnA/xxx+TfeGoOdz98Cga+XtNU89IfruzMt/1AgCAPcJydn5UP+obumkcgzF/r9P1y7C2z57hM/hFi/tCNoofAADMlrnv/NLfO6ArQd/mT/+ES34gIr/IMXyqX+2wXMWSvVfcqBUlpKxebt8mPf3vfiyfkWK4uR2k4hdTjdFlUuW/sqQmm/59FsJlhd8dAgDAbJn/zs/8xyZctajv6aXR3fppOFUaHhv+djjbJ3WudmlcUYKR2tp5Ub3S0RDUt8fZ+dU+Y3nW0aVS8sMwIxroq2NV7WhgHQgAAMA0LHDnV/wFa2ZdKYzhoS8qoVTYPi2HWeWItdORFar8EPlPpWi64meGMGp8IwoAAIB5MOedH93WYwHICwwxvPkzi1/Lp1VCsk/d8gRQ/AAAYG2Z885P3dapMOgCw+xafx+jNobhZfEzfZJdvcco1YsarZJTFipVJtMhy6dQDBdKnyo6HYrR66pfHC0XCgAAwEyZ+2d+dCv370+6b6zo+kHom34kGql4yBubZOEPz8JXH1s+kz0UDyppPNYZ9Yd/3uIksVpvzxo+QzeRTlUbJecY3Q+naqq6pUDaXr8gAAAAMFPm/pnfAIObv+mYwY8NAAAArBxz3/ktkbjrKrabAAAA1pxl7/wAAACAhbPPdn4bDv8AAAAAmIh9tvND8QMAADA92PkBAABYO7DzAwAAsHZg5wcAAGDtmPPO756dnY3NY8XP2PuNFSh+AAAApmf+Oz+uahvbxU/t+o05KH4AAACmZ0Gf+d29tbFdbez6jREUPwAAANOzwM/8ZrEFRPEDAAAwPQva+R0/vnuDsZ/rN3pQ/AAAAEzPInZ+9+9sbm9s3JBv5PqNGhQ/AAAA0zPnnZ+8gan/iSCi31iB4gcAAGB6FviZ3yxA8QMAADA9C/vMbzag+AEAAJge7PwAAACsHfts5wcAAABMzz7b+QEAAADTg50fAACAtQM7PwAAAGsHdn4AAADWDuz8AAAArB3Y+QEAAFg7ZOfXLyp40kDxAwAAsF+Jb3v2IAVPKh2KHwAAgP2K/sxvUCh+AAAAVgEUPwAAAGsHih8AAIC1A8UPAADA2lEUPyppNXJIjqL4AQAA2PfUOz9X7xLSLR5C8QMAALDvMd/2dFWPkT7ajuIHAABg39P6zK+ufGJE8QMAALDvGfGFl9qI4gcAAGAVGFH8aqH4AQAAWAVQ/AAAAKwdKH4AAADWDil+VMk6GVX8yBcAAACwL6AaNhbN4nc7AAAAsKI0ix8EQRAErbZQ/CAIgqC1E4ofBEEQtHZC8YMgCIL2lW46+6QTz94tjGMKxQ+CIAga0jT15siBDcdJ59xYHjIV+jMHLymPkvqSOXpwY6PdDcUPgiAIGtLExY8r2YGjhbGt3XNO0P2PHrTGdiRDle+kgwdGdEPxgyAIgoZU1Bv3cJu2Vo5DR4Jx44Ttm0Ifp6MHS8tI3bh9otWfPQuuFsZkrIgkqqC8y4zdLKH4QRAEQUMqComrRr7m0d6uWYouOeSLFuP7jxB7qLd67ETG8r7w4CUpGSNiqHxyFMUPgiAImlxFIdEPR9UYqluhmHGhst7D1DJdFbHIyaiItHf0tdbT6IniB0EQBA2pqDdFQWqWIlX8Wm9pZqL+VZ8i1kDxUxrZDcUPgiAIGlJRSIqCJG1qGJ/5hS958tGhnZ/9hZfx3vZMit0sofhBEARBQ+IyE8n3XgOlKL4PObjt83L1LyA/dUjRXV0ciBgUu1lC8YMgCILWTih+EARB0NoJxQ+CIAhaO6H4QRAEQWsnFD8IgiBo7ZSKH7UAAACANYGLH/0HAAAArBGnnPL/ATzHw5EXyX9fAAAAAElFTkSuQmCC" alt="matplotlib.png" /></p>
</div>
<p>
Open the <code>matplotlibrc</code> file and add a <code>#</code> at the beginning of the line
starting with <code>backend</code>, which amounts to use the default <code>Agg</code> value.
</p>
</div>
</div>
</div>
<div id="outline-container-org47ff448" class="outline-3">
<h3 id="org47ff448">All platforms: pretty code in HTML export</h3>
<div class="outline-text-3" id="text-org47ff448">
<p>
To have code pretty printing when exporting to HTML, you should
install the <code>htmlize</code> package, which is done by opening emacs and
typing the following command:
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
M-x package-install RET htmlize RET # where M-x means pressing the "Esc" key then the "x" key
</pre>
</div>
</div>
</div>
<div id="outline-container-org98a8b7e" class="outline-2">
<h2 id="org98a8b7e">A simple "<i>reproducible research</i>" emacs configuration</h2>
<div class="outline-text-2" id="text-org98a8b7e">
<p>
This section is illustrated in a <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4">video tutorial</a> (<i>"Mise en place
Emacs/Orgmode"</i> in French). Watching it before following the
instructions given in this section may help.
</p>
<p>
Emacs comes with very basic default configuration and it appears like
everyone has its own taste. You will for example find <a href="https://www.emacswiki.org/emacs/StarterKits">here</a> several
default Emacs configurations that reflect the preferences of their
creators. Likewise the configuration of Org-Mode is incredibly
flexible (see for example <a href="https://orgmode.org/worg/org-configs/index.html">the org-mode website</a> for more
references). In the context of this MOOC, we propose you a relatively
minimalist one that is rather "<i>reproducible research</i>" oriented by
adding a few org-mode specific configurations.
</p>
</div>
<div id="outline-container-orgd0815e9" class="outline-3">
<h3 id="orgd0815e9">Step 0: Backup and download our configuration</h3>
<div class="outline-text-3" id="text-orgd0815e9">
<p>
The procedure we propose will wipe your already existing custom Emacs
configuration if you have one. <b>You should thus beforehand make a
backup</b> of <code>~/.emacs</code> and of <code>~/.emacs.d/init.el</code> (if these files exist).
</p>
<p>
Then download <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/rr_org_archive.tgz">this archive</a> and uncompress it. It contains the
following files and we will refer to them in the following:
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
rr_org/init.el
rr_org/journal.org
</pre>
<p>
Alternatively, <a href="rr_org/">the files you are looking for are available here</a>.
</p>
</div>
</div>
<div id="outline-container-org9008837" class="outline-3">
<h3 id="org9008837">Step 1: Prepare your journal</h3>
<div class="outline-text-3" id="text-org9008837">
<p>
Create an <code>org/</code> directory in the top of your home:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">mkdir -p ~/org/
</pre>
</div>
<p>
Then copy <code>rr_org/journal.org</code> file in your <code>~/org/</code> directory. This
file will be your laboratory notebook and all the notes you will
capture with <code>C-c c</code> will go automatically go in this file. The first
entry of this notebook is populated with <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org">many Emacs shortcuts</a> that you
should give a try.
</p>
</div>
</div>
<div id="outline-container-orgd3b10f7" class="outline-3">
<h3 id="orgd3b10f7">Step 2: Set up Emacs configuration</h3>
<div class="outline-text-3" id="text-orgd3b10f7">
<p>
Copy <code>rr_org/init.el</code> in your <code>~/.emacs.d/</code> directory.
</p>
<p>
Alternatively, if you do not want to mess with your already existing
emacs configuration, you may launch emacs with this specific
configuration with the following command: <code>emacs -q -l rr_org/init.el</code>.
</p>
</div>
</div>
<div id="outline-container-org73ef313" class="outline-3">
<h3 id="org73ef313">Step 3: Adapt the configuration to your specific needs if required</h3>
<div class="outline-text-3" id="text-org73ef313">
<p>
There are two situations in which it might be necessary to modify
<code>init.el</code>:
</p>
<ol class="org-ol">
<li style="margin-bottom:0;">Your network environment forces you to use a proxy for access
to Web sites (HTTP(S) protocol).</li>
<li style="margin-bottom:0;"><p>
You have multiple installations of Python or R on your computer,
or they are in unusual places and not fully configured.
If you can run
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">"python3" and "R" under Linux and macOS</li>
<li style="margin-bottom:0;">"Python" and "R" under Windows</li>
</ul>
<p>
in a terminal without getting an error message, then you should
not have to do anything.
</p></li>
</ol>
<p>
If you do have to modify <code>init.el</code>, check the comments at the
beginning of the file for instructions.
</p>
</div>
</div>
<div id="outline-container-orgc85363f" class="outline-3">
<h3 id="orgc85363f">Step 4: Check whether the installation is working or not</h3>
<div class="outline-text-3" id="text-orgc85363f">
<p>
Open a new instance of Emacs and open a <code>foo.org</code> file. Copy the
following lines in this file:
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
#+begin_src shell :session foo :results output :exports both
ls -la # or dir under windows
#+end_src
</pre>
<p>
Put your cursor inside this code block and execute it with the
following command: <code>C-c C-c</code> (If you are not familiar with Emacs
commands, this one means '<code>Ctrl + C</code>' twice)
</p>
<p>
A <code>#+RESULTS:</code> block with the result of the command should appear if it
worked.
</p>
<p>
In the video, we already have demonstrated the main features and
shortcuts of emacs/org-mode that will help you maintain a document and
benefit from literate programming. The list of features and shortcuts
is demonstrated in the <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org">first entry of your labbook</a>.
</p>
</div>
</div>
<div id="outline-container-orgadd0750" class="outline-3">
<h3 id="orgadd0750">Step 5: Open and play with your journal:</h3>
<div class="outline-text-3" id="text-orgadd0750">
<p>
In step 1, you were told to create an journal in
<code>~org/journal.org</code>. First you probably want to make sure this file is
stored in a version control system like git. We leave it up to you
to set this up but if you have any trouble, feel free to ask on the
FUN forums.
</p>
</div>
</div>
</div>
<div id="outline-container-org7b9442b" class="outline-2">
<h2 id="org7b9442b">A stub of a replicable article</h2>
<div class="outline-text-2" id="text-org7b9442b">
<p>
This section is illustrated in a <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4">video tutorial</a> (<i>"Écrire un article
réplicable avec Emacs/Orgmode"</i> in French). Watching it before
following the instructions given in this section may help.
</p>
<p>
Remember, you need a working LaTeX and R environment. If you can't
open a terminal and run the commands <code>R</code>, <code>pdflatex</code>, and <code>python</code>, you will not be
able to generate this document. When being compiled, the article downloads the
corresponding LaTeX packages so you also need to have a working <code>wget</code>
command (alternatively, it uses <code>curl</code>). Once downloaded, you may still read the
source (<a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.org">article.org</a>) and understand how it works though.
</p>
<p>
Download the following <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/replicable_article.tgz">archive</a>, uncompress it and simply <code>make</code> to generate the
article. You should then be able to open the <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.pdf">resulting article</a>. This
is summarized in the following command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">wget --no-check-certificate -O replicable_article.tgz https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/raw/master/module2/ressources/replicable_article.tgz
tar zxf replicable_article.tgz; <span style="font-weight: bold;">cd</span> replicable_article; make ; evince article.pdf
</pre>
</div>
<p>
<b>Possible issues</b>:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><p>
If the <code>make</code> command fails (especially on Mac), it may be because
Emacs or something else is not correctly installed. In that case,
open the article directly with the following command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">emacs -q --eval <span style="font-style: italic;">"(setq enable-local-eval t)"</span> --eval <span style="font-style: italic;">"(setq enable-local-variables t)"</span> article.org
</pre>
</div>
<p>
and export it to pdf with the following shortcut: <code>C-c C-e l o</code>
</p></li>
<li style="margin-bottom:0;">If it still doesn't work and emacs complains about not finding ESS,
it may be because you installed ESS in your home instead of
system-wide. In that case, try to remove the <code>-q</code> in the previous
command line to load your personal emacs configuration.</li>
</ul>
<p>
Finally, when you'll be tired of always re-executing all the source
code when exporting, just look for the following line in <a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/replicable_article/article.org">article.org</a>:
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
# #+PROPERTY: header-args :eval never-export
</pre>
<p>
If you remove the <code></code> in the beginning of the line, it will not be a
comment anymore and will indicate org-mode to stop evaluating every
chunk of code when exporting.
</p>
</div>
</div>
<div id="outline-container-orgdde4be6" class="outline-2">
<h2 id="orgdde4be6">Emacs tips and tricks</h2>
<div class="outline-text-2" id="text-orgdde4be6">
</div>
<div id="outline-container-org152ca8a" class="outline-3">
<h3 id="org152ca8a">Cheat-sheets</h3>
<div class="outline-text-3" id="text-org152ca8a">
<p>
Learning Emacs and Org-Mode can be difficult as there is an inordinate
amount of shortcuts. Many people have thus come up with
cheat-sheats. Here is a selection in case it helps:
</p>
</div>
<div id="outline-container-org8a94d36" class="outline-4">
<h4 id="org8a94d36">Emacs</h4>
<div class="outline-text-4" id="text-org8a94d36">
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org">Common and step-by-step Emacs shortcuts for our <i>reproducible research</i> configuration</a></li>
<li style="margin-bottom:0;"><a href="https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf">The official GNU emacs refcard</a></li>
<li style="margin-bottom:0;">Two graphical cheat-sheats by Sacha Chua on <a href="http://sachachua.com/blog/wp-content/uploads/2013/05/How-to-Learn-Emacs-v2-Large.png">how to learn Emacs</a> and on
<a href="http://sachachua.com/blog/wp-content/uploads/2013/08/20130830-Emacs-Newbie-How-to-Learn-Emacs-Keyboard-Shortcuts.png">how to learn Emacs shortcuts</a>.</li>
</ul>
</div>
</div>
<div id="outline-container-org1765514" class="outline-4">
<h4 id="org1765514">Org-mode</h4>
<div class="outline-text-4" id="text-org1765514">
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://app-learninglab.inria.fr/gitlab/learning-lab/mooc-rr-ressources/blob/master/module2/ressources/rr_org/journal.org">Common and step-by-step org-mode shortcuts for our <i>reproducible research</i> configuration</a></li>
<li style="margin-bottom:0;"><a href="https://orgmode.org/worg/orgcard.html">The official org-mode refcard</a></li>
<li style="margin-bottom:0;"><a href="https://orgmode.org/worg/dev/org-syntax.html">The official description of the org-mode syntax</a> and a <a href="https://gist.github.com/hoeltgman/3825415">relatively concise description of the org-mode syntax</a>.</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-org4cc7124" class="outline-3">
<h3 id="org4cc7124">Video tutorials</h3>
<div class="outline-text-3" id="text-org4cc7124">
<p>
For those of you who prefer video explanations, here is a <a href="https://www.youtube.com/playlist?list=PL9KxKa8NpFxIcNQa9js7dQQIHc81b0-Xg">Youtube
channel with many step by step emacs tutorials</a>.
</p>
</div>
</div>
<div id="outline-container-orgd5c8443" class="outline-3">
<h3 id="orgd5c8443">Additional useful emacs packages</h3>
<div class="outline-text-3" id="text-orgd5c8443">
</div>
<div id="outline-container-orgb58b5a8" class="outline-4">
<h4 id="orgb58b5a8">Company-mode</h4>
<div class="outline-text-4" id="text-orgb58b5a8">
<p>
<a href="http://company-mode.github.io/">Company-mode</a> is a text completion framework for Emacs. It allows to
have smart completion in emacs for the most common languages. If you
feel this is needed, you should follow the instructions from the
official Web page: <a href="http://company-mode.github.io/">http://company-mode.github.io/</a>
</p>
</div>
</div>
<div id="outline-container-orgc20d2e9" class="outline-4">
<h4 id="orgc20d2e9">Magit</h4>
<div class="outline-text-4" id="text-orgc20d2e9">
<p>
<a href="https://magit.vc/">Magit</a> is an Emacs interface for Git. Its usage is briefly illustrated
in the context of this MOOC in a <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/9cfc7500f0ef46d288d2317ec7b037b4">video tutorial</a> (<i>"Utilisation
Emacs/git"</i> in French).
</p>
<p>
It is very powerful and we use it on a daily basis but you should
definitely understand what git does behind the scenes beforehand. If
you feel this would be useful for you, you should follow <a href="https://magit.vc/screenshots/">this visual
walk-through</a> or <a href="https://www.emacswiki.org/emacs/Magit">this really short "crash course"</a>. If you installed the
previous "<i>reproducible research</i>" emacs configuration, you can easily
invoke magit by using <code>C-x g</code>.
</p>
</div>
</div>
</div>
<div id="outline-container-org9260c82" class="outline-3">
<h3 id="org9260c82">Other resources</h3>
<div class="outline-text-3" id="text-org9260c82">
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://orgmode.org/orgguide.pdf">The compact Org-mode Guide</a></li>
<li style="margin-bottom:0;"><a href="https://github.com/dfeich/org-babel-examples">Many examples illustrating the use of different languages in org-mode</a></li>
</ul>
</div>
</div>
</div>
</div>
This source diff could not be displayed because it is too large. You can view the blob instead.
<div id="content">
<h1 class="title">Jupyter</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgd37ebcc">1. Jupyter tips and tricks</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orge426487">Creating or importing a notebook</a></li>
<li style="margin-bottom:0;"><a href="#org6607533">Running R and Python in the same notebook</a></li>
<li style="margin-bottom:0;"><a href="#orgd909163">Other languages</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org9176019">2. Installing and configuring Jupyter on your computer</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org51b3378">2.1 Installing Jupyter</a></li>
<li style="margin-bottom:0;"><a href="#orgc0d2a71">2.2 Making sure Jupyter allows you to use R</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org608c96e">• Installing IRKernel (R package)</a></li>
<li style="margin-bottom:0;"><a href="#org076acd5">• Installing rpy2 (Python package)</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org524a8ac">2.3 Additional tips</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org814c076">• Exporting a notebook</a></li>
<li style="margin-bottom:0;"><a href="#orga5ae744">• Improving notebook readability</a></li>
<li style="margin-bottom:0;"><a href="#orgab0846a">• Interacting with GitLab and GitHub</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-orgd37ebcc" class="outline-2">
<h2 id="orgd37ebcc">1. Jupyter tips and tricks</h2>
<div class="outline-text-2" id="text-orgd37ebcc">
<p>
The following <a href="https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/">webpage</a> lists several Jupyter tricks (in particular, it
illustrates many <code>IPython magic</code> commands) that should improve your
efficiency (note that this blog post is about two years old so some of
the tricks may have been integrated in the default behavior of Jupyter
now).
</p>
</div>
<div id="outline-container-orge426487" class="outline-3">
<h3 id="orge426487">Creating or importing a notebook</h3>
<div class="outline-text-3" id="text-orge426487">
<p>
Using the Jupyter environment we deployed for this MOOC will allow to
easily access any file from your default GitLab project. There are
situations however where you may want to play with other notebooks.
</p>
<dl class="org-dl">
<dt>Adding a brand new notebook in a given directory</dt><dd>Simply follow
the following steps:
<ol class="org-ol">
<li style="margin-bottom:0;">From the menu: <code>File -&gt; Open</code>. You're now in the Jupyter file manager.</li>
<li style="margin-bottom:0;">Navigate to the directory where you want your notebook to be created.</li>
<li style="margin-bottom:0;">Then from the top right button: <code>New -&gt; Notebook: Python 3</code>.</li>
<li style="margin-bottom:0;"><p>
Give your notebook a name from the menu: <code>File -&gt; Rename</code>.
</p>
<p>
N.B.: If you create a file by doing <code>File -&gt; New Notebook -&gt;
Python 3</code>, the new notebook will be created in the current
directory. Moving it afterward is possible but a bit cumbersome
(you'll have to go through the Jupyter file manager by following
the menu <code>File -&gt; Open</code>, then select it, <code>Shut</code> it <code>down</code>, and <code>Move</code>
and/or <code>Rename</code>).
</p></li>
</ol></dd>
<dt>Importing an already existing notebook</dt><dd>If your notebook is
already in your GitLab project, then simply synchronize by using
the <code>Git pull</code> button and use the <code>File -&gt; Open</code> menu. Otherwise,
imagine, you want to import the <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/src/Python3/challenger.ipynb">following notebook</a> from someone
else's repository to re-execute it.
<ol class="org-ol">
<li style="margin-bottom:0;">Download the file on your computer. E.g., for this <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/src/Python3/challenger.ipynb">GitLab hosted
notebook</a>, click on <code>Open raw</code> (a small <code>&lt;/&gt;</code> within a document icon)
and save (<code>Ctrl-S</code> on most browsers) the content (a long Json text
file).</li>
<li style="margin-bottom:0;">Open the Jupyter file manager from the menu <code>File -&gt; Open</code> and
navigate to the directory where you want to upload your notebook.</li>
<li style="margin-bottom:0;">Then from the top right button, <code>Upload</code> the previously downloaded
notebook and confirm the upload.</li>
<li style="margin-bottom:0;">Open the freshly uploaded notebook through the Jupyter file
manager.</li>
</ol></dd>
</dl>
</div>
</div>
<div id="outline-container-org6607533" class="outline-3">
<h3 id="org6607533">Running R and Python in the same notebook</h3>
<div class="outline-text-3" id="text-org6607533">
<p>
<code>rpy2</code> package allows to use both languages in the same notebook by:
</p>
<ol class="org-ol">
<li style="margin-bottom:0;"><p>
Loading <code>rpy2</code>:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python">%load_ext rpy2.ipython
</pre>
</div></li>
<li style="margin-bottom:0;"><p>
Using the <code>%R</code> Ipython magic:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python">%%R
summary(cars)
</pre>
</div>
<p>
Python objects can then even be passed to R as follows (assuming <code>df</code>
is a pandas dataframe):
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python">%%R -i df
plot(df)
</pre>
</div></li>
</ol>
<p>
Note that this <code>%%R</code> notation indicates that R should be used for the whole cell but
an other possibility is to use <code>%R</code> to have a single line of R within a
python cell.
</p>
</div>
</div>
<div id="outline-container-orgd909163" class="outline-3">
<h3 id="orgd909163">Other languages</h3>
<div class="outline-text-3" id="text-orgd909163">
<p>
Jupyter is not limited to Pytyhon and R. Many other languages are available:
<a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels">https://github.com/jupyter/jupyter/wiki/Jupyter-kernels</a>, including
non-free languages like SAS, Mathematica, Matlab&#x2026; Note that the maturity of these kernels differs widely.
</p>
<p>
None of these other languages have been deployed in the context of our
MOOC but you may want to read the next sections to learn how
to set up your own Jupyter on your computer and benefit from these extensions.
</p>
<p>
Since the question was asked several times, if you really need to stay
with SAS, you should know that SAS can be used within Jupyter using
either the <a href="https://sassoftware.github.io/sas_kernel/">Python SASKernel</a> or the <a href="https://sassoftware.github.io/saspy/">Python SASPy</a> package (step by step
explanations about this are given <a href="https://app-learninglab.inria.fr/gitlab/85bc36e0a8096c618fbd5993d1cca191/mooc-rr/blob/master/documents/tuto_jupyter_windows/tuto_jupyter_windows.md">here</a>).
</p>
<p>
Since proprietary software such as SAS cannot easily be inspected, we discourage its use as it hinders reproducibility by
essence. But perfection does not exist anyway and using Jupyter
literate programming approach allied with systematic control version
and environment control will certainly help anyway.
</p>
</div>
</div>
</div>
<div id="outline-container-org9176019" class="outline-2">
<h2 id="org9176019">2. Installing and configuring Jupyter on your computer</h2>
<div class="outline-text-2" id="text-org9176019">
<p>
In this section, we explain how to set up a Jupyter environment on
your own computer similar to the one deployed for this MOOC.
</p>
<p>
Note that Jupyter notebooks are only a small part of the picture and
that Jupyter is now part of a bigger project: <a href="https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906">JupyterLab</a>, which allows
you to mix various components (including notebooks) in your
browser. In the context of this MOOC, our time frame was too short to
benefit from JupyterLab which was still under active development. You may, however, prefer JupyterLab when doing an installation on your own computer.
</p>
</div>
<div id="outline-container-org51b3378" class="outline-3">
<h3 id="org51b3378">2.1 Installing Jupyter</h3>
<div class="outline-text-3" id="text-org51b3378">
<p>
Follow these instructions if you wish to have a Jupyter environment on
your own computer similar to the one we set up for this MOOC.
</p>
<p>
First, download and install the <a href="https://conda.io/miniconda.html">latest version of Miniconda</a>. We use
Miniconda version <code>4.5.4</code> and Python version <code>3.6</code> on our server.
</p>
<p>
Miniconda is a light version of Anaconda, which includes Python, the Jupyter Notebook, and other commonly used packages for scientific computing and data science.
</p>
<p>
Then download the <a href="https://gist.github.com/brospars/4671d9013f0d99e1c961482dab533c57">mooc<sub>rr</sub> environment file</a> and create the environment using conda:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">conda env create -f environment.yml
<span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">Windows activate the environment</span>
activate mooc_rr
<span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">Linux and MacOS activate the environment</span>
<span style="font-weight: bold;">source</span> activate mooc_rr
<span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">Linux, MacOS and Windows: launch the notebook</span>
jupyter notebook
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc0d2a71" class="outline-3">
<h3 id="orgc0d2a71">2.2 Making sure Jupyter allows you to use R</h3>
<div class="outline-text-3" id="text-orgc0d2a71">
<p>
The environment described in the last section should include R, but if
you proceeded otherwise and only have Python available in Jupyter, you
may want to read the following section.
</p>
</div>
<div id="outline-container-org608c96e" class="outline-4">
<h4 id="org608c96e">• Installing <a href="https://github.com/IRkernel/IRkernel">IRKernel</a> (R package)</h4>
<div class="outline-text-4" id="text-org608c96e">
<p>
Do the following in R console:
</p>
<p>
Install the <code>devtools</code> package:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">install.packages(<span style="font-style: italic;">'devtools'</span>,dep=<span style="font-weight: bold; text-decoration: underline;">TRUE</span>)
</pre>
</div>
<p>
Define a proxy if needed:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R"><span style="font-weight: bold; text-decoration: underline;">library</span>(httr)
set_config(use_proxy(url=<span style="font-style: italic;">"proxy"</span>, port=80, username=<span style="font-style: italic;">"username"</span>, password=<span style="font-style: italic;">"password"</span>))
</pre>
</div>
<p>
Install the <code>IRkernel</code> package:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">devtools::install_github(<span style="font-style: italic;">'IRkernel/IRkernel'</span>)
IRkernel::installspec() <span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">to register the kernel in the current R installation</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org076acd5" class="outline-4">
<h4 id="org076acd5">• Installing rpy2 (Python package)</h4>
<div class="outline-text-4" id="text-org076acd5">
<p>
On Linux, the rpy2 package is available in standard distributions
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">sudo apt-get install python3-rpy2 python3-tzlocal
</pre>
</div>
<p>
An alternative (not really recommended if the first one is available)
consists in going through the python package manager with
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python">pip3 install rpy2
</pre>
</div>
<p>
<b>Windows</b>
</p>
<p>
Download the <code>rpy2</code> <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2">binary file</a> by choosing the right operating system.
</p>
<p>
Open a DOS console and type the following command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">python -m pip install rpy2&#8209;2.9.4&#8209;cp37&#8209;cp37m&#8209;win_amd64.whl <span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">adapt filename</span>
</pre>
</div>
<p>
Install also <code>tzlocal</code>:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">python -m pip install tzlocal
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org524a8ac" class="outline-3">
<h3 id="org524a8ac">2.3 Additional tips</h3>
<div class="outline-text-3" id="text-org524a8ac">
</div>
<div id="outline-container-org814c076" class="outline-4">
<h4 id="org814c076">• Exporting a notebook</h4>
<div class="outline-text-4" id="text-org814c076">
<p>
Here is what we had to install on a recent Debian computer to make sure
the notebook export via LaTeX works:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">sudo apt-get install texlive-xetex wkhtmltopdf
</pre>
</div>
<p>
Obviously, you can convert to html or pdf using the using the <code>File &gt; Download as &gt; HTML</code> (or <code>PDF</code>) menu option. This can also be done from
the command line with the following command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">ipython3 nbconvert --to pdf Untitled.ipynb
</pre>
</div>
<p>
If you want to use a specific style, then the <code>nbconvert</code> exporter
should be customized. This is discussed and demoed <a href="http://markus-beuckelmann.de/blog/customizing-nbconvert-pdf.html">here</a>. We encourage
you to simply read the <a href="https://nbconvert.readthedocs.io/en/latest/">doc of nbconvert</a>.
</p>
<p>
Instead of going directly through LaTeX and playing too much with the
<code>nbconvert</code> exporter, an other option consists in exporting to Markdown
and playing with <a href="https://pandoc.org/">pandoc</a>. Both approaches work, it's rather a matter of
taste.
</p>
<p>
<b>Windows</b>
</p>
<p>
Download and install MiKTeX from the <a href="https://miktex.org/download">MiKTeX webpage</a> by choosing the
right operating system. You will be prompted to install some specific
packages when exporting to pdf.
</p>
</div>
</div>
<div id="outline-container-orga5ae744" class="outline-4">
<h4 id="orga5ae744">• Improving notebook readability</h4>
<div class="outline-text-4" id="text-orga5ae744">
<p>
Here are a few extensions that can ease your life:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><p>
<a href="https://stackoverflow.com/questions/33159518/collapse-cell-in-jupyter-notebook">Code folding</a> to improve readability when browsing the notebook.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip3 install jupyter_contrib_nbextensions
<span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">jupyter contrib nbextension install --user # not done yet</span>
</pre>
</div></li>
<li style="margin-bottom:0;"><p>
<a href="https://github.com/kirbs-/hide_code">Hiding code</a> to improve readability when exporting.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-sh">sudo pip3 install hide_code
sudo jupyter-nbextension install --py hide_code
jupyter-nbextension enable --py hide_code
jupyter-serverextension enable --py hide_code
</pre>
</div></li>
</ul>
</div>
</div>
<div id="outline-container-orgab0846a" class="outline-4">
<h4 id="orgab0846a">• Interacting with GitLab and GitHub</h4>
<div class="outline-text-4" id="text-orgab0846a">
<p>
To ease your experience, we added pull/push buttons that allow
you to commit and sync with GitLab. This development was specific to
the MOOC but inspired from a previous <a href="https://github.com/Lab41/sunny-side-up">proof of concept</a>. We have
recently discovered that someone else developed about at the same time
a <a href="https://github.com/sat28/githubcommit">rather generic version of this Jupyter plugin</a>. Otherwise, remember
that it is very easy to insert a shell cell in Jupyter in which you
can easily issue git commands. This is how we work most of the time.
</p>
<p>
This being said, you may have noticed that Jupyter keeps a perfect
track of the sequence in which cells have been run by updating the
"output index". This is a very good property from the reproducibility
point of view but depending on your usage, you may find it a bit
painful when committing. Some people have thus developed <a href="https://gist.github.com/pbugnion/ea2797393033b54674af">specific git
hooks</a> to ignore these numbers when committing Jupyter notebooks. There
is a long an interesting discussion about various options on
<a href="https://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control">StackOverflow</a>.
</p>
<p>
For those who use <a href="https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906">JupyterLab</a> rather than the plain Jupyter, a specific <a href="https://github.com/jupyterlab/jupyterlab-git">JupyterLab git plugin</a> has been developed to offer a nice version control experience.
</p>
</div>
</div>
</div>
</div>
</div>
<div id="content">
<h1 class="title">Maintaining a journal</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgc95598e">Some examples of LabBooks provided for inspiration</a></li>
<li style="margin-bottom:0;"><a href="#org51674f0">How to report efficiently (by Martin Quinson)</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org976cc9a">Reporting</a></li>
<li style="margin-bottom:0;"><a href="#org5ff6009">Reporting Logistics</a></li>
<li style="margin-bottom:0;"><a href="#org50f88a2">Reporting Document Organization</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-orgc95598e" class="outline-2">
<h2 id="orgc95598e">Some examples of LabBooks provided for inspiration</h2>
<div class="outline-text-2" id="text-orgc95598e">
<p>
Since a few years, we systematically require any or our students to
have a laboratory notebook in org-mode. Most of the time, they start
in private repositories but often end up being fully opened. Here are
a few ones:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">Luka Stanisic (a former PhD student advised by Arnaud Legrand) starting
using this methodology during his Msc and developed further
throughout his PhD. Part of his <a href="http://mescal.imag.fr/membres/luka.stanisic/thesis/thesis.pdf">PhD thesis</a> was actually about
designing a methodology for reproducible experiments in large scale
distributed systems. You may want to have a look at <a href="http://starpu-simgrid.gforge.inria.fr/">his postdoc
LabBook</a> and to the <a href="https://framagit.org/lvgx/pfe/blob/master/doc/labbook.org">report of Léo Villeveygoux</a> whom he advised.</li>
<li style="margin-bottom:0;">Tom Cornebize is currently a PhD student advised by Arnaud Legrand
and during his MSc, he also heavily <a href="https://github.com/Ezibenroc/simulating_mpi_applications_at_scale">loged his activity on Github</a>.</li>
<li style="margin-bottom:0;"><a href="https://github.com/schnorr">Lucas Schnorr</a>'s students usually also maintain their journal in a
very nice way: <a href="https://github.com/taisbellini/aiyra/blob/master/LabBook.org">Tais Bellini's BSc.</a>, <a href="https://github.com/mittmann/hpc/blob/master/LabBook.org">Arthur Krause's LabBook</a>, <a href="http://www.inf.ufrgs.br/~llnesi/memory_report/MemoryReport.html">Luca
Nesi's LabBook</a>.</li>
<li style="margin-bottom:0;"><a href="https://people.irisa.fr/Martin.Quinson/Research/Students/Methodo/">Martin Quinson</a>'s students also follow such conventions:
<ul class="org-ul">
<li style="margin-bottom:0;">Ezequiel Torti Lopez, M2R 2014. <a href="https://github.com/mquinson/simgrid-simpar/blob/master/report.org">Report</a>, with both the data
provenance and the data analysis included in the appendix.</li>
<li style="margin-bottom:0;">Betsegaw Lemma, M2R 2017. <a href="https://github.com/betsegawlemma/internship/blob/master/intern_report.org">LabBook</a></li>
<li style="margin-bottom:0;">Gabriel Corona, engineer on SimGrid, 2015-2016. <a href="https://github.com/randomstuff/simgrid-journal/blob/master/journal.org">Journal</a>, <a href="http://www.gabriel.urdhr.fr/tags/simgrid/">Blog (findings)</a>.</li>
<li style="margin-bottom:0;">Matthieu Nicolas, engineer on PLM, 2014-2016, <a href="https://github.com/MatthieuNICOLAS/PLM-reporting/blob/master/activity-report.org">Journal</a>.</li>
</ul></li>
</ul>
<p>
Org-mode is obviously not the only option and many of our students use
am mixture of org-mode, rstudio and jupyter depending on what is more
convenient.
</p>
</div>
</div>
<div id="outline-container-org51674f0" class="outline-2">
<h2 id="org51674f0">How to report efficiently (by Martin Quinson)</h2>
<div class="outline-text-2" id="text-org51674f0">
<p>
My friend Martin has gathered <a href="https://people.irisa.fr/Martin.Quinson/Research/Students/Methodo/">an excellent compendium of information
and references on his webpage to explain his students what he expects
from them</a>. <b>I'll therefore simply paraphrase him here</b> with the most
important aspects related to reporting but feel free to read <a href="https://people.irisa.fr/Martin.Quinson/Research/Students/Methodo/">the
original version</a>:
</p>
</div>
<div id="outline-container-org976cc9a" class="outline-3">
<h3 id="org976cc9a">Reporting</h3>
<div class="outline-text-3" id="text-org976cc9a">
<p>
I ask you to write a little reporting regularly. Depending on the
situation, it may be every day, every week or every month. In any
case, your reporting is very important for the following reasons:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">It forces you to think about what you are doing, which may help you
to unblock your problem by your own. Writing down the problems in a
clear way is often sufficient to see the solution appearing.</li>
<li style="margin-bottom:0;">It helps me following your progress even between the meetings. I
cannot unblock you if I don't detect that you are on a wrong lead or
otherwise blocked.</li>
<li style="margin-bottom:0;">It keeps a track of the steps in your work. That's good for the day
where you want to write your final report (even if a final report
should never be presented in the chronological order). That's good
for the next after you who will be supposed to continue you effort,
or to build upon it.</li>
<li style="margin-bottom:0;">That person may be yourself (if you go for a PhD program), another
intern, myself or even someone else on the Internet: that's what we
call Open Science, an effort where everyone can build upon the
scientific work of everyone.</li>
</ul>
<p>
I want you to write your reporting in an org file (yep, you don't have
a choice here). [..]
</p>
</div>
</div>
<div id="outline-container-org5ff6009" class="outline-3">
<h3 id="org5ff6009">Reporting Logistics</h3>
<div class="outline-text-3" id="text-org5ff6009">
<p>
Once you're setup with all software installed and somehow configured,
you need to create a reporting file in a place where I can see it and
where it won't get lost if your disk crashes or something. Open a
dedicated git repository (on github, gitorious, gitlab, &#x2026;) for
that. After your internship, your report should be archived directly
in the source tree of the software that you are working on, if
any. But having your reporting located in the source tree may
complicate things during your work.
</p>
<p>
Yes, it means that your file will be public at some point, but that's
why we call it "Open Science", after all. Also, you should write it in
English if possible. The part of your reporting that is called
"Journal" (see below) may be written in French if you are more
efficient this way but the rest must be in English. Don't make your
tone too formal because the file is public. Make it efficient. Nobody
will ever blame you for the work you did during an internship a long
time ago. If you really want, we can even make this file
anonymous. Just speak to me.
</p>
<p>
You want to write your reporting before leaving work. Weekly reporting
should be written on Friday, one or two hours before leaving. That's
the best solution to have a nice week end without thinking about work,
and still lose no information that you would need on Monday morning.
</p>
</div>
</div>
<div id="outline-container-org50f88a2" class="outline-3">
<h3 id="org50f88a2">Reporting Document Organization</h3>
<div class="outline-text-3" id="text-org50f88a2">
<p>
Your reporting document should have four main parts:
</p>
<dl class="org-dl">
<dt>Findings</dt><dd>This section summarizes the general information that you
gathered during your work. It is empty at the beginning
of your internship, and gets fleshed with the important
things that you find on your way. That's where
bibliographical information go, for example. But that's
definitely not where TODO notes go (see below).</dd>
<dt>Development</dt><dd>This section presents the technical sides of your
work. Don't write anything in there yet. Put it all
in the Journal part for now.</dd>
<dt>Journal</dt><dd>Describe the day-to-day work done for each period (day,
week or month) of your internship. That's the most
important part of your reporting, and we come back to it
below.</dd>
<dt>Conclusion</dt><dd><p>
That's what you write in the next week of your
internship. You can see it as a letter to the next
guy, explaining the current state of your work, a few
words about its technical organization, and what
should be done next on that topic. Keep this part
highly technical, the overall organization of your
internship will be seen in your final report.
</p>
<p>
The Journal part is the only part that you may write
in French on need. You want to add one subsection per
period to your journal. Don't make it too long, or you
would waste time writing long texts that very few will
ever read. Don't make it too short or it will be
impossible to understand it on Monday morning (or
three months after). Finding the good balance is
sometimes difficult, but I will provide feedback on
your first entries, so don't worry.
</p></dd>
</dl>
<p>
Each of section describing a period should contain three subsubsections:
</p>
<dl class="org-dl">
<dt>Things done</dt><dd>a few words about what you've done. Something like 2
or 4 items with a few words describing what you've
done. You can omit the title of that section and put
the items directly in the upper section (see the
example below).</dd>
<dt>Blocking points and questions</dt><dd>try to explain clearly the things
that block you or slow you down. If you found the solution
already, then it should be part of the previous subsection (but
you should say a few words nevertheless). Also ask every question
that you may have for me in that section. If the question are
personal (e.g., about the logistics of your internship such as
salary or so), please prefer emails that are not publicly
visible. If this section is empty for a given period, skip it
all together (no empty subsubsections).</dd>
<dt>Planned work</dt><dd>A few items about what you plan to work on during
the next period.</dd>
</dl>
<p>
A template of reporting file is given at the end of this section. This
is just a strong advice: If you really feel better with another file
organization, then give it a try for one period, and ask for my
feedback. I can adapt, and I do not pretend that my advice is the
definitive answer. It's just the result of my experience so far.
</p>
<p>
Notice how TODO items are written: they are given as items in the
Planned work sections of the journal. As explained in the
<a href="http://orgmode.org/manual/Checkboxes.html">documentation</a>, you simply have to write "[ ]" in front of items that
you plan to do in the future.
</p>
<p>
You should add a <code>[1/]</code> on the "Planned work" line, so that emacs keeps
track of what is done and what is still to do. Once they are done, you
type C-c C-C on their lines to change the blank box [ ] into a checked
box [X]. Also, the <code>[1/]</code> will be changed to denote the amount of work
that is still to be done.
</p>
<p>
At any point, you can see all ongoing TODO items with the following
keystrokes: "C-c / t". More information on TODOs in orgmode's
<a href="http://orgmode.org/manual/TODO-basics.html">documentation</a>. The important thing here is that most TODO items must
only be written in the <i>Journal</i> part (so that we know when they
occurred).
</p>
<p>
<b>Do not edit past entries of your journal</b>, unless you have very good
reasons. If you must, make sure that you don't lose information about
the path that you took (remember the Open Science thingy). You should
always <b>add</b> information to past entries, such as:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">- *edit* This hypothesis does not hold; see the entry of [the day where you found it] for more information.
</pre>
</div>
<p>
The only exception are TODO entries, that should clearly be rewritten
to DONE entries. If you need to adapt your TODO entry (because the
initial goal was poorly stated or otherwise), change the initial entry
from TODO to CANCELED (or check the box after stating in a subitem
that it was not done but canceled, and why), and create a new TODO
entry in the current period section.
</p>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
* Introduction
This file contains the reporting for my beloved internship done on
this topic on that year. For now, just add the official title of
your internship (check the convention signed between your
university and my lab). After a few weeks, once you really
understand your internship, you should write a few paragraphs about
the context, problem and motivation of your work, with some
possible use cases. But don't do that right now.
* Bibliography
* Journal
** Week 2 feb
- read the doc about writing my reporting
*** Questions
- do I really have to use emacs?
*** Work Planed [1/2]
- [X] install emacs and setup orgmode
- [ ] read the provided articles
** Week 9 feb
- Installed emacs
(omit the Questions section if no question)
*** Work Planed
- do some useful work
</pre>
</div>
</div>
</div>
</div>
This source diff could not be displayed because it is too large. You can view the blob instead.
<div id="outline-container-orgc50e61e" class="outline-2">
<h2 id="orgc50e61e">Exercice 1 : Ré-exécuter n'est pas répliquer&#x2026;</h2>
<div class="outline-text-2" id="text-orgc50e61e">
<p>
Même si la terminologie peut varier d'un auteur ou d'une communauté à
l'autre, il est important de comprendre que l'on peut distinguer
différents niveaux de "réplication" selon que l'on s'est contenté de
vérifier que l'on pouvait ré-exécuter le code et obtenir exactement les
mêmes résultats ou bien que l'on arrivait à reproduire des résultats
similaires en suivant une approche similaire (éventuellement avec un
autre langage, une autre méthode de calcul, etc.). À ce sujet, vous
pourrez vouloir par exemple lire <a href="https://arxiv.org/abs/1708.08205">https://arxiv.org/abs/1708.08205</a>.
</p>
<p>
Le diable se cache souvent dans des endroits auxquels on n'aurait jamais
pensé et nous sommes nous-mêmes allés de surprise en surprise en
préparant ce MOOC, notamment avec l'exercice du module 2 sur
Challenger. C'est pourquoi nous vous proposons dans cet exercice, de
refaire une partie de l'analyse des données de Challenger, comme l'ont
fait Siddhartha Dallal et ses co-auteurs il y a presque 30 ans dans
leur article <i>Risk Analysis of the Space Shuttle: Pre-Challenger
Prediction of Failure</i> et publié dans le <i>Journal of the American
Statistical Association</i> (Vol. 84, No. 408, Déc., 1989) mais dans un autre langage de votre choix (Python, R, Julia, SAS&#x2026;).
</p>
<p>
Nous savons d'expérience que si les estimations de pente et
d'intercept sont généralement les mêmes, on peut avoir des différences
lorsque l'on regarde les estimateurs de variance et le R<sup>2</sup> un peu plus
dans les détails. Il peut également y avoir des surprises dans le
graphique final selon les versions de bibliothèques utilisées.
</p>
<p>
L'ensemble des calculs à effectuer est décrit ici avec les
indications sur comment contribuer :
<a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/">https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/</a>
</p>
<p>
Vous y trouverez notre réplication des calculs de Dallal <i>et al.</i> (en
R), une mise en œuvre en Python et une en R (très similaires à ce que
vous avez pu utiliser dans le module 2). Cet exercice peut donc se
faire à deux niveaux :
</p>
<ol class="org-ol">
<li>un niveau facile pour ceux qui repartiront du code dans le langage
qu'ils n'auront initialement pas utilisé et se contenteront de le
ré-exécuter. Pour cela, nul besoin de maîtriser la régression
logistique, il suffit de bien inspecter les sorties produites et de
vérifier qu'elles correspondent bien aux valeurs attendues. Pour
ceux qui ré-exécuteraient le notebook Python dans l'environnement
Jupyter du MOOC, n'hésitez pas à consulter <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/4ab5bb42ca1e45c8b0f349751b96d405">les ressources de la
section 4A du module 2</a> qui expliquent comment y importer un
notebook.</li>
<li>un niveau plus difficile pour ceux qui souhaiteront le réécrire
complètement (éventuellement dans un autre langage que R ou Python,
l'expérience peut être d'autant plus intéressante que nous n'avons
pas testé ces variations). Là, si les fonctions de calcul d'une
régression logistique ne sont pas présentes, il y a par contre
intérêt à en savoir un minimum pour pouvoir les
implémenter. L'exercice en est d'autant plus instructif.</li>
</ol>
<p>
Vous pourrez alors discuter sur le forum des succès et des échecs que
vous aurez pu rencontrer. Pour cela :
</p>
<ul class="org-ul">
<li><b>Vous publierez auparavant dans votre dépôt les différents notebooks</b>
en prenant bien soin d'enrichir votre document des informations
(numéros de version, etc.) sur votre système et sur les
bibliothèques installées.</li>
<li>Vous indiquerez votre résultat (que ça soit un succès ou échec à
obtenir les mêmes résultats) en <b>remplissant ce <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">tableau</a></b> (vous avez
les droits d'édition donc il vous suffit d'éditer les fichiers via
l'interface GitLab). Vous vérifierez les valeurs obtenues pour :
<ol class="org-ol">
<li>les coefficients de la pente et de l'intercept</li>
<li>les estimations d'erreur de ces coefficients</li>
<li>le goodness of fit</li>
<li>la figure</li>
<li>la zone de confiance</li>
</ol></li>
<li><p>
Pour chacun vous indiquerez si le résultat est :
</p>
<ul class="org-ul">
<li>identique</li>
<li>proche à moins de trois décimales</li>
<li>très différent</li>
<li>non fonctionnel (pas de résultat obtenu)</li>
</ul>
<p>
Vous indiquerez également dans ce tableau :
</p>
<ul class="org-ul">
<li>un lien vers votre espace gitlab contenant les différents notebooks</li>
<li>le nom du système d'exploitation utilisé</li>
<li>le langage utilisé et son numéro de version</li>
<li>les numéros des principales bibliothèques utilisées
<ul class="org-ul">
<li>Python : numpy, pandas, matplotlib, statsmodels&#x2026;</li>
<li>R : BLAS, ggplot, dplyr si chargées</li>
</ul></li>
</ul></li>
</ul>
<p>
Ne vous inquiétez pas si ces consignes vous semblent peu claires sur l'instant,
elles sont rappelées en haut du <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">tableau</a> et vous vous rendrez vite
compte s'il vous manque quelque chose quand vous essaierez de remplir
ce tableau.
</p>
<p>
Nous effectuerons une synthèse illustrant les principales divergences
observées et nous vous l'enverrons à la fin du MOOC.
</p>
</div>
</div>
<div id="outline-container-org55f722b" class="outline-2">
<h2 id="org55f722b" style="color: #b62567;">Re-execution is not replication&#x2026;</h2>
<div class="outline-text-2" id="text-org55f722b">
<p style="color: #b62567;">
Unfortunately terminology varies a lot between authors and
communities, but it is important to understand the distinction between
different levels of "replication". You can be satisfied with
re-running the code and get exactly the same results, but you can also
try to obtain similar results using a similar approach, changing for
example the programming language, computational method, etc. An
article we recommend on this topic is
<a href="https://arxiv.org/abs/1708.08205">https://arxiv.org/abs/1708.08205</a>.
</p>
<p style="color: #b62567;">
Often the devil is in the details that one would have never thought
about, and we have had our share of surprises while preparing this
MOOC, in particular with the exercise on the Challenger catastrophe
from module 2. We therefore propose in this exercise that you re-do a
part of this analysis, following the example of Siddhartha Dallal and
co-authors almost 30 years ago in their article <i>Risk Analysis of the
Space Shuttle: Pre-Challenger Prediction of Failure</i>, published in the
<i>Journal of the American Statistical Association</i> (Vol. 84, No. 408,
Déc., 1989), but using a different language of your choosing (Python,
R, Julia, SAS&#x2026;).
</p>
<p style="color: #b62567;">
Our experience shows that the estimations of slope and intercept are
generally the same, but there can be differences when looking at
variance estimators and R<sup>2</sup> in more detail. Another source of
surprises is the final graphical presentation, depending on the
versions of the libraries that are used.
</p>
<p style="color: #b62567;">
The computations to be done are described at
<a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/">https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/</a>
together with instructions for contributing.
</p>
<p style="color: #b62567;">
You will find there our replications of the computations by Dallal <i>et
al.</i> (in R), one in Python and one in R (very similar to what you have
used in module 2). This exercise can be done at two levels:
</p>
<ol class="org-ol">
<li style="color: #b62567;">an easy level at which you start from the code in the language that you did not use initially, and content yourself with re-executin it. This doesn't require mastering logistic regression, it is sufficien to inspect the outputs produced and check that they correspond to the expected values. For those who want to re-execute the Python notebook in our MOOC's Jupyter environment, check <a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/4ab5bb42ca1e45c8b0f349751b96d405">the resources for sequence 4A of module 2</a> that explain how to import a notebook.</li>
<li style="color: #b62567;">a more difficult level at which you rewrite the analysis completely, possibly in a different language than Python or R, which makes the exercise more interesting because we have not tested such variants. If logistic regression is not already implemented for your language, you will need a good understanding of it in order to write the code yourself, which of course makes the exercise even more instructive.</li>
</ol>
<p style="color: #b62567;">
You can discuss your successes or failures on the forum, after following these instructions:
</p>
<ul class="org-ul">
<li style="color: #b62567;"><b>First, publish your notebooks in your repository</b>, taking care to enrich your document with information about your system and your libraries (version numbers etc.).</li>
<li style="color: #b62567;">Indicate your result by adding to this <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">table</a> (you have write permissions, so you can simply edit it via the GitLab interface). Check the values obtained for:
<ol class="org-ol">
<li style="color: #b62567;">the slope and intercept coefficients</li>
<li style="color: #b62567;">the error estimates for these coefficients</li>
<li style="color: #b62567;">the goodness of fit</li>
<li style="color: #b62567;">the plot</li>
<li style="color: #b62567;">the confidence region</li>
</ol></li>
<li><p style="color: #b62567;">
For each of these values, specify if your result is
</p>
<ul class="org-ul">
<li style="color: #b62567;">identical</li>
<li style="color: #b62567;">close, to three decimal places</li>
<li style="color: #b62567;">very different</li>
<li style="color: #b62567;">non functional (no result obtained)</li>
</ul>
<p style="color: #b62567;">
Also provide in this table:
</p>
<ul class="org-ul">
<li style="color: #b62567;">a link to your GitLab workspace with your notebook(s)</li>
<li style="color: #b62567;">your operating system</li>
<li style="color: #b62567;">the language you used, with the version number</li>
<li style="color: #b62567;">version numbers for the main libraries
<ul class="org-ul">
<li style="color: #b62567;">Python: numpy, pandas, matplotlib, statsmodels&#x2026;</li>
<li style="color: #b62567;">R: BLAS, ggplot, dplyr if used</li>
</ul></li>
</ul></li>
</ul>
<p style="color: #b62567;">
Don't worry if these instructions seem confusing, they are reproduced above the <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">table</a> and you will quickly notice if something is missing when you try to add your data.
</p>
<p style="color: #b62567;">
We will compile a synthesis of the principal divergences observes and make it available at the end of the MOOC.
</p>
</div>
</div>
</div>
<h2 id="org1f802ba">Exercice 2 : L'importance de l'environnement</h2>
<div class="outline-text-2" id="text-org1f802ba">
<p>
Dans cet exercice, nous vous proposons de reprendre l'exercice
précédent mais en mettant à jour l'environnement de calcul. En effet,
nous avons rencontré des surprises en préparant ce MOOC puisqu'il nous
est arrivé d'avoir des résultats différents entre nos machines et
l'environnement Jupyter que nous avions mis en place pour le MOOC. Ça
sera peut-être également votre cas !
</p>
<ol class="org-ol">
<li>Pour ceux qui ont suivi le parcours Jupyter, recréez
l'environnement du MOOC sur votre propre machine en suivant les
instructions données
<a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/4ab5bb42ca1e45c8b0f349751b96d405">dans les ressources de la section 4A du module 2</a>.</li>
<li>Vérifiez si vous obtenez bien les mêmes résultats que ceux
attendus.</li>
<li>Mettez à jour (vers le haut ou vers la bas) cet environnement et
vérifiez si vous obtenez les mêmes résultats.</li>
</ol>
<p>
Comme précédemment, vous mettrez à jour le <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">tableau</a> et vous discuterez
sur le forum des succès et des échecs que vous aurez rencontrés.
</p>
</div>
</div>
<div id="outline-container-org1a24dbb" class="outline-2">
<h2 id="org1a24dbb"><span style="color: #b62567;">The importance of the environment</span></h2>
<div class="outline-text-2" id="text-org1a24dbb">
<p style="color: #b62567;">
In this exercise, we ask you to redo the preceding exercise after
updating the computational environment. When preparing this MOOC, we
had a few surprises due to different results on our own computers and
on the Jupyter environment that we had installed for the MOOC. Maybe
that will happen to you as well!
</p>
<ol class="org-ol">
<li style="color: #b62567;">For those you followed the Jupyter path, re-create the MOOC's Jupyter environment on your own computer by following the instructions given
<a href="https://www.fun-mooc.fr/courses/course-v1:inria+41016+session01bis/jump_to_id/4ab5bb42ca1e45c8b0f349751b96d405">in the resource section of sequence 4A of module 2</a>.</li>
<li style="color: #b62567;">Check if you get the same results as in the MOOC environment.</li>
<li style="color: #b62567;">Update this environment, increasing or decreasing some package's version numbers, and check if the results are still the same.</li>
</ol>
<p style="color: #b62567;">
As before, you can add your observations to the <a href="https://app-learninglab.inria.fr/gitlab/moocrr-session1/moocrr-reproducibility-study/blob/master/results.md">table</a> and discuss your successes and failures on the forum.
</p>
</div>
<div id="outline-container-org5b10dc4" class="outline-2">
<h2 id="org5b10dc4">Exercice 3 : Répliquer un papier de ReScience</h2>
<div class="outline-text-2" id="text-org5b10dc4">
<p>
ReScience (<a href="http://rescience.github.io/">http://rescience.github.io/</a>) est un journal de sciences
computationnelles entièrement ouvert dont l'objectif est d'encourager
la réplication de travaux déjà publiés en s'assurant que l'ensemble du
code et des données soit disponible. Pour chacun des articles publiés
dans ReScience, nous avons la garantie qu'au moins two chercheurs
indépendants ont réussi à suivre les indications, à ré-exécuter le
code et à ré-obtenir les mêmes résultats que ceux décrits par les
auteurs. Cela ne veut pas dire que cela soit parfaitement automatique
pour autant et il peut être intéressant de voir comment ils ont
procédé.
</p>
<p>
Nous vous proposons donc de choisir l'un de ces articles (celui avec
lequel vous avez le plus d'affinité) et d'essayer de réexécuter les
codes et les calculs décrits dans l'article. N'hésitez pas à indiquer
vos difficultés éventuelles sur le forum où nous répondrons à vos questions.
</p>
</div>
</div>
<div id="outline-container-org60c7839" class="outline-2">
<h2 id="org60c7839" style="color: #b62567;">Replicate a paper from ReScience</h2>
<div class="outline-text-2" id="text-org60c7839">
<p style="color: #b62567;">
ReScience (<a href="http://rescience.github.io/">http://rescience.github.io/</a>) is a scientific journal for
computational science that is completely open and has the goal of
encouraging the replication of already published work while providing
a complete set of code and data. For each article published in
ReScience, we know that at least two independent researchers (the
reviewers) have been able to follow the instructions, re-execute the
code, and obtain the same results as those described by the
authors. This doesn't mean that the process is fully automatic, and
therefore it is of interest to see how they have proceeded.
</p>
<p style="color: #b62567;">
We ask you to choose one of the articles (the one that you like most)
and to try to re-execute the code as described in the article. Don't
hesitate to indicate any difficulties you might encounter in the
forum, where we will reply to your questions&#x2026;
</p>
</div>
<div id="content">
<h1 class="title">Tracking environment information</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org54d219c">Getting information about your Git repository</a></li>
<li style="margin-bottom:0;"><a href="#orgd1774c3">Getting information about Python(3) libraries</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org7283a87">Getting information about your system</a></li>
<li style="margin-bottom:0;"><a href="#orgfa4dc3a">Getting the list of installed packages and their version</a></li>
<li style="margin-bottom:0;"><a href="#org31cde5f">How to list imported modules?</a></li>
<li style="margin-bottom:0;"><a href="#orgcea179c">Saving and restoring an environment with pip</a></li>
<li style="margin-bottom:0;"><a href="#org849fdbb">Installing a new package or a specific version</a></li>
</ul>
</li>
<li style="margin-bottom:0;"><a href="#org4f45b1e">Getting information about R libraries</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgc583ee9">Getting the list imported modules and their version</a></li>
<li style="margin-bottom:0;"><a href="#orgdffc6a5">Getting the list of installed packages and their version</a></li>
<li style="margin-bottom:0;"><a href="#orgb52d0ce">Installing a new package or a specific version</a>
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#orgaf558a0">Installing a pre-compiled version</a></li>
<li style="margin-bottom:0;"><a href="#org7d8a9f0">Using devtools</a></li>
<li style="margin-bottom:0;"><a href="#org4509fba">Installing from source code</a></li>
<li style="margin-bottom:0;"><a href="#org9d64d25">Potential issues</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org54d219c" class="outline-2">
<h2 id="org54d219c">Getting information about your Git repository</h2>
<div class="outline-text-2" id="text-org54d219c">
<p>
When taking notes, it may be difficult to remember which version of
the code or of a file was used. This is what version control is useful
for. Here are a few useful commands that we typically insert at the
top of our notebooks in shell cells
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">git log -1
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
commit 741b0088af5b40588493c23c46d6bab5d0adeb33
Author: Arnaud Legrand &lt;arnaud.legrand@imag.fr&gt;
Date: Tue Sep 4 12:45:43 2018 +0200
Fix a few typos and provide information on jupyter-git plugins.
</pre>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">git status -u
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add &lt;file&gt;..." to update what will be committed)
(use "git checkout -- &lt;file&gt;..." to discard changes in working directory)
modified: resources.org
Untracked files:
(use "git add &lt;file&gt;..." to include in what will be committed)
../../module2/ressources/replicable_article/IEEEtran.bst
../../module2/ressources/replicable_article/IEEEtran.cls
../../module2/ressources/replicable_article/article.bbl
../../module2/ressources/replicable_article/article.tex
../../module2/ressources/replicable_article/data.csv
../../module2/ressources/replicable_article/figure.pdf
../../module2/ressources/replicable_article/logo.png
.#resources.org
no changes added to commit (use "git add" and/or "git commit -a")
</pre>
<p>
<i>Note: the -u indicates that git should also display the contents of
new directories it did not previously know about.</i>
</p>
<p>
Then, we often include commands at the end of our notebook indicating
how to commit the results (adding the new files, committing with a
clear message and pushing). E.g.,
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">git add resources.org;
git commit -m <span style="font-style: italic;">"Completing the section on getting Git information"</span>
git push
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
[master 514fe2c1 ] Completing the section on getting Git information
1 file changed, 61 insertions(+)
Counting objects: 25, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (25/25), 7.31 KiB | 499.00 KiB/s, done.
Total 25 (delta 11), reused 0 (delta 0)
To ssh://app-learninglab.inria.fr:9418/learning-lab/mooc-rr-ressources.git
6359f8c..1f8a567 master -&gt; master
</pre>
<p>
Obviously, in this case you need to save the notebook before running
this cell, hence the output of this final command (with the new git
hash) will not be stored in the cell. This is not really a problem and
is the price to pay for running git from within the notebook itself.
</p>
</div>
</div>
<div id="outline-container-orgd1774c3" class="outline-2">
<h2 id="orgd1774c3">Getting information about Python(3) libraries</h2>
<div class="outline-text-2" id="text-orgd1774c3">
</div>
<div id="outline-container-org7283a87" class="outline-3">
<h3 id="org7283a87">Getting information about your system</h3>
<div class="outline-text-3" id="text-org7283a87">
<p>
This topic is discussed on <a href="https://stackoverflow.com/questions/3103178/how-to-get-the-system-info-with-python">StackOverflow</a>.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python"><span style="font-weight: bold;">import</span> platform
<span style="font-weight: bold;">print</span>(platform.uname())
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
uname_result(system='Linux', node='icarus', release='4.15.0-2-amd64', version='#1 SMP Debian 4.15.11-1 (2018-03-20)', machine='x86_64', processor='')
</pre>
</div>
</div>
<div id="outline-container-orgfa4dc3a" class="outline-3">
<h3 id="orgfa4dc3a">Getting the list of installed packages and their version</h3>
<div class="outline-text-3" id="text-orgfa4dc3a">
<p>
This topic is discussed on <a href="https://stackoverflow.com/questions/20180543/how-to-check-version-of-python-modules">StackOverflow</a>. When using <code>pip</code> (the Python
package installer) within a shell command, it is easy to query the
version of all installed packages (note that on your system, you may
have to use either <code>pip</code> or <code>pip3</code> depending on how it is named and which
versions of Python are available on your machine
</p>
<p>
Here is for example how I get this information on my machine:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip3 freeze
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
asn1crypto==0.24.0
attrs==17.4.0
bcrypt==3.1.4
beautifulsoup4==4.6.0
bleach==2.1.3
...
pandas==0.22.0
pandocfilters==1.4.2
paramiko==2.4.0
patsy==0.5.0
pexpect==4.2.1
...
traitlets==4.3.2
tzlocal==1.5.1
urllib3==1.22
wcwidth==0.1.7
webencodings==0.5
</pre>
<p>
In a Jupyter notebook, this can easily be done by using the <code>%%sh</code>
magic. Here is for example what you could do and get on the Jupyter
notebooks we deployed for the MOOC (note that here, you should simply
use the <code>pip</code> command):
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python">%%sh
pip freeze
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
alembic==0.9.9
asn1crypto==0.24.0
attrs==18.1.0
Automat==0.0.0
...
numpy==1.13.3
olefile==0.45.1
packaging==17.1
pamela==0.3.0
pandas==0.22.0
...
webencodings==0.5
widgetsnbextension==3.2.1
xlrd==1.1.0
zope.interface==4.5.0
</pre>
<p>
In the rest of this document, I will assume the correct command is <code>pip</code>
and I will not systematically insert the <code>%%sh</code> magic.
</p>
<p>
Once you know which packages are installed, you can easily get
additional information about a given package and in particular check
whether it was installed "locally" through pip or whether it is
installed system-wide. Again, in a shell command:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip show pandas
<span style="font-weight: bold;">echo</span> <span style="font-style: italic;">" "</span>
pip show statsmodels
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Name: pandas
Version: 0.22.0
Summary: Powerful data structures for data analysis, time series,and statistics
Home-page: http://pandas.pydata.org
Author: None
Author-email: None
License: BSD
Location: /usr/lib/python3/dist-packages
Requires:
Name: statsmodels
Version: 0.9.0
Summary: Statistical computations and models for Python
Home-page: http://www.statsmodels.org/
Author: None
Author-email: None
License: BSD License
Location: /home/alegrand/.local/lib/python3.6/site-packages
Requires: patsy, pandas
</pre>
</div>
</div>
<div id="outline-container-org31cde5f" class="outline-3">
<h3 id="org31cde5f">How to list imported modules?</h3>
<div class="outline-text-3" id="text-org31cde5f">
<p>
Without resorting to pip (that will list all available packages), you
may want to know which modules are loaded in a Python session as well
as their version. Inspired by <a href="https://stackoverflow.com/questions/4858100/how-to-list-imported-modules">StackOverflow</a>, here is a simple
function that lists loaded package (that have a <code>__version__</code> attribute,
which is unfortunately not completely standard).
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-python"><span style="font-weight: bold;">def</span> <span style="font-weight: bold;">print_imported_modules</span>():
<span style="font-weight: bold;">import</span> sys
<span style="font-weight: bold;">for</span> name, val <span style="font-weight: bold;">in</span> <span style="font-weight: bold;">sorted</span>(sys.modules.items()):
<span style="font-weight: bold;">if</span>(<span style="font-weight: bold;">hasattr</span>(val, <span style="font-style: italic;">'__version__'</span>)):
<span style="font-weight: bold;">print</span>(val.<span style="font-weight: bold;">__name__</span>, val.__version__)
<span style="font-weight: bold;">else</span>:
<span style="font-weight: bold;">print</span>(val.<span style="font-weight: bold;">__name__</span>, <span style="font-style: italic;">"(unknown version)"</span>)
<span style="font-weight: bold;">print</span>(<span style="font-style: italic;">"**** Package list in the beginning ****"</span>);
print_imported_modules()
<span style="font-weight: bold;">print</span>(<span style="font-style: italic;">"**** Package list after loading pandas ****"</span>);
<span style="font-weight: bold;">import</span> pandas
print_imported_modules()
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
**** Package list in the beginning ****
**** Package list after loading pandas ****
_csv 1.0
_ctypes 1.1.0
decimal 1.70
argparse 1.1
csv 1.0
ctypes 1.1.0
cycler 0.10.0
dateutil 2.7.3
decimal 1.70
distutils 3.6.5rc1
ipaddress 1.0
json 2.0.9
logging 0.5.1.2
matplotlib 2.1.1
numpy 1.14.5
numpy.core 1.14.5
numpy.core.multiarray 3.1
numpy.core.umath b'0.4.0'
numpy.lib 1.14.5
numpy.linalg._umath_linalg b'0.1.5'
pandas 0.22.0
_libjson 1.33
platform 1.0.8
pyparsing 2.2.0
pytz 2018.5
re 2.2.1
six 1.11.0
urllib.request 3.6
zlib 1.0
</pre>
</div>
</div>
<div id="outline-container-orgcea179c" class="outline-3">
<h3 id="orgcea179c">Saving and restoring an environment with pip</h3>
<div class="outline-text-3" id="text-orgcea179c">
<p>
The easiest way to go is as follows:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip3 freeze &gt; requirements.txt <span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">to obtain the list of packages with their version</span>
pip3 install -r requirements.txt <span style="font-weight: bold; font-style: italic;"># </span><span style="font-weight: bold; font-style: italic;">to install the previous list of packages, possibly on an other machine</span>
</pre>
</div>
<p>
If you want to have several installed Python environments, you may
want to use <a href="https://docs.pipenv.org/">Pipenv</a>. I doubt it allows to track correctly FORTRAN or C
dynamic libraries that are wrapped by Python though.
</p>
</div>
</div>
<div id="outline-container-org849fdbb" class="outline-3">
<h3 id="org849fdbb">Installing a new package or a specific version</h3>
<div class="outline-text-3" id="text-org849fdbb">
<p>
The Jupyter environment we deployed on our servers for the MOOC is
based on the version 4.5.4 of Miniconda and Python 3.6. In this
environment you should simply use the <code>pip</code> command (remember on your
machine, you may have to use <code>pip3</code>).
</p>
<p>
If I query the current version of <code>statsmodels</code> in a shell command,
here is what I will get.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip show statsmodels
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Name: statsmodels
Version: 0.8.0
Summary: Statistical computations and models for Python
Home-page: http://www.statsmodels.org/
Author: Skipper Seabold, Josef Perktold
Author-email: pystatsmodels@googlegroups.com
License: BSD License
Location: /opt/conda/lib/python3.6/site-packages
Requires: scipy, patsy, pandas
</pre>
<p>
I can then easily upgrade <code>statsmodels</code>:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip install --upgrade statsmodels
</pre>
</div>
<p>
Then the new version should then be:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip show statsmodels
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
Name: statsmodels
Version: 0.9.0
Summary: Statistical computations and models for Python
Home-page: http://www.statsmodels.org/
Author: Skipper Seabold, Josef Perktold
Author-email: pystatsmodels@googlegroups.com
License: BSD License
Location: /opt/conda/lib/python3.6/site-packages
Requires: scipy, patsy, pandas
</pre>
<p>
It is even possible to install a specific (possibly much older) version, e.g.,:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">pip install <span style="font-weight: bold; font-style: italic;">statsmodels</span>==0.6.1
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org4f45b1e" class="outline-2">
<h2 id="org4f45b1e">Getting information about R libraries</h2>
<div class="outline-text-2" id="text-org4f45b1e">
</div>
<div id="outline-container-orgc583ee9" class="outline-3">
<h3 id="orgc583ee9">Getting the list imported modules and their version</h3>
<div class="outline-text-3" id="text-orgc583ee9">
<p>
The best way seems to be to rely on the <code>devtools</code> package (if this
package is not installed, you should install it first by running in <code>R</code>
the command <code>install.packages("devtools")</code>).
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">sessionInfo()
devtools::session_info()
</pre>
</div>
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="example">
R version 3.5.1 (2018-07-02)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux buster/sid
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.8.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.8.0
locale:
[1] LC_CTYPE=fr_FR.UTF-8 LC_NUMERIC=C
[3] LC_TIME=fr_FR.UTF-8 LC_COLLATE=fr_FR.UTF-8
[5] LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8
[7] LC_PAPER=fr_FR.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.5.1
Session info ------------------------------------------------------------------
setting value
version R version 3.5.1 (2018-07-02)
system x86_64, linux-gnu
ui X11
language (EN)
collate fr_FR.UTF-8
tz Europe/Paris
date 2018-08-01
Packages ----------------------------------------------------------------------
package * version date source
base * 3.5.1 2018-07-02 local
compiler 3.5.1 2018-07-02 local
datasets * 3.5.1 2018-07-02 local
devtools 1.13.6 2018-06-27 CRAN (R 3.5.1)
digest 0.6.15 2018-01-28 CRAN (R 3.5.0)
graphics * 3.5.1 2018-07-02 local
grDevices * 3.5.1 2018-07-02 local
memoise 1.1.0 2017-04-21 CRAN (R 3.5.1)
methods * 3.5.1 2018-07-02 local
stats * 3.5.1 2018-07-02 local
utils * 3.5.1 2018-07-02 local
withr 2.1.2 2018-03-15 CRAN (R 3.5.0)
</pre>
<p>
Some actually advocate that <a href="https://github.com/ropensci/rrrpkg">writing a reproducible research compendium
is best done by writing an R package</a>. Those of you willing to have a
clean R dependency management should thus have a look at <a href="https://rstudio.github.io/packrat/">Packrat</a>.
</p>
</div>
</div>
<div id="outline-container-orgdffc6a5" class="outline-3">
<h3 id="orgdffc6a5">Getting the list of installed packages and their version</h3>
<div class="outline-text-3" id="text-orgdffc6a5">
<p>
Finally, it is good to know that there is a built-in R command
(<code>installed.packages</code>) allowing to retrieve and list the details of all
packages installed.
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">head(installed.packages())
</pre>
</div>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-right" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Package</th>
<th scope="col" class="org-left">LibPath</th>
<th scope="col" class="org-right">Version</th>
<th scope="col" class="org-left">Priority</th>
<th scope="col" class="org-left">Depends</th>
<th scope="col" class="org-left">Imports</th>
<th scope="col" class="org-left">LinkingTo</th>
<th scope="col" class="org-left">Suggests</th>
<th scope="col" class="org-left">Enhances</th>
<th scope="col" class="org-left">License</th>
<th scope="col" class="org-left">License<sub>is</sub><sub>FOSS</sub></th>
<th scope="col" class="org-left">License<sub>restricts</sub><sub>use</sub></th>
<th scope="col" class="org-left">OS<sub>type</sub></th>
<th scope="col" class="org-left">MD5sum</th>
<th scope="col" class="org-left">NeedsCompilation</th>
<th scope="col" class="org-left">Built</th>
<th scope="col" class="org-right">&#xa0;</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">BH</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">1.66.0-1</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">BSL-1.0</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">no</td>
<td class="org-left">3.5.1</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">Formula</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">1.2-3</td>
<td class="org-left">nil</td>
<td class="org-left">R (&gt;= 2.0.0), stats</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">GPL-2</td>
<td class="org-left">GPL-3</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">no</td>
<td class="org-right">3.5.1</td>
</tr>
<tr>
<td class="org-left">Hmisc</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">4.1-1</td>
<td class="org-left">nil</td>
<td class="org-left">lattice, survival (&gt;= 2.40-1), Formula, ggplot2 (&gt;= 2.2)</td>
<td class="org-left">methods, latticeExtra, cluster, rpart, nnet, acepack, foreign,</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">gtable, grid, gridExtra, data.table, htmlTable (&gt;= 1.11.0),</td>
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">viridis, htmltools, base64enc</td>
<td class="org-left">nil</td>
<td class="org-right">chron, rms, mice, tables, knitr, ff, ffbase, plotly (&gt;=</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">4.5.6)</td>
<td class="org-left">nil</td>
<td class="org-right">GPL (&gt;= 2)</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">yes</td>
<td class="org-left">3.5.1</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">Matrix</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">1.2-14</td>
<td class="org-left">recommended</td>
<td class="org-left">R (&gt;= 3.2.0)</td>
<td class="org-left">methods, graphics, grid, stats, utils, lattice</td>
<td class="org-left">nil</td>
<td class="org-left">expm, MASS</td>
<td class="org-left">MatrixModels, graph, SparseM, sfsmisc</td>
<td class="org-left">GPL (&gt;= 2)</td>
<td class="org-left">file LICENCE</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">yes</td>
<td class="org-right">3.5.1</td>
</tr>
<tr>
<td class="org-left">StanHeaders</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">2.17.2</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">RcppEigen, BH</td>
<td class="org-left">nil</td>
<td class="org-left">BSD<sub>3</sub><sub>clause</sub> + file LICENSE</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">yes</td>
<td class="org-left">3.5.1</td>
<td class="org-right">&#xa0;</td>
</tr>
<tr>
<td class="org-left">acepack</td>
<td class="org-left">/home/alegrand/R/x86<sub>64</sub>-pc-linux-gnu-library/3.5</td>
<td class="org-right">1.4.1</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">testthat</td>
<td class="org-left">nil</td>
<td class="org-left">MIT + file LICENSE</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">nil</td>
<td class="org-left">yes</td>
<td class="org-left">3.5.1</td>
<td class="org-right">&#xa0;</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="outline-container-orgb52d0ce" class="outline-3">
<h3 id="orgb52d0ce">Installing a new package or a specific version</h3>
<div class="outline-text-3" id="text-orgb52d0ce">
<p>
This section is mostly a cut and paste from the <a href="https://support.rstudio.com/hc/en-us/articles/219949047-Installing-older-versions-of-packages">recent post by Ian
Pylvainen</a> on this topic. It comprises a very clear explanation of how
to proceed.
</p>
</div>
<div id="outline-container-orgaf558a0" class="outline-4">
<h4 id="orgaf558a0">Installing a pre-compiled version</h4>
<div class="outline-text-4" id="text-orgaf558a0">
<p>
If you're on a Debian or a Ubuntu system, it may be difficult to
access a specific version without breaking your system. So unless you
are moving to the latest version available in your Linux distribution,
<b>we strongly recommend you to build from source</b>. In this case, you'll
need to make sure you have the necessary toolchain to build packages
from source (e.g., gcc, FORTRAN, etc.). On Windows, this may require
you to install <a href="https://cran.r-project.org/bin/windows/Rtools/">Rtools</a>.
</p>
<p>
If you're on Windows or OS X and looking for a package for an <b>older
version of R</b> (R 2.1 or below), you can check the <a href="https://cran-archive.r-project.org/bin/">CRAN binary
archive</a>. Once you have the URL, you can install it using a command
similar to the example below:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">packageurl <span style="font-weight: bold; text-decoration: underline;">&lt;-</span> <span style="font-style: italic;">"https://cran-archive.r-project.org/bin/windows/contrib/2.13/BBmisc_1.0-58.zip"</span>
install.packages(packageurl, repos=<span style="font-weight: bold; text-decoration: underline;">NULL</span>, type=<span style="font-style: italic;">"binary"</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org7d8a9f0" class="outline-4">
<h4 id="org7d8a9f0">Using devtools</h4>
<div class="outline-text-4" id="text-org7d8a9f0">
<p>
The simplest method to install the version you need is to use the
<code>install_version()</code> function of the <code>devtools</code> package (obviously, you
need to install <code>devtools</code> first, which can be done by running in <code>R</code> the
command <code>install.packages("devtools")</code>). For instance:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R"><span style="font-weight: bold; text-decoration: underline;">require</span>(devtools)
install_version(<span style="font-style: italic;">"ggplot2"</span>, version = <span style="font-style: italic;">"0.9.1"</span>, repos = <span style="font-style: italic;">"http://cran.us.r-project.org"</span>)
</pre>
</div>
</div>
</div>
<div id="outline-container-org4509fba" class="outline-4">
<h4 id="org4509fba">Installing from source code</h4>
<div class="outline-text-4" id="text-org4509fba">
<p>
Alternatively, you may want to install an older package from source If
devtools fails or if you do not want to depend on it, you can install
it from source via <code>install.packages()</code> directed using the right
URL. This URL can be obtained by browsing the <a href="https://cran.r-project.org/src/contrib/Archive">CRAN Package Archive</a>.
</p>
<p>
Once you have the URL, you can install it using a command similar to
the example below:
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-R">packageurl <span style="font-weight: bold; text-decoration: underline;">&lt;-</span> <span style="font-style: italic;">"http://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_0.9.1.tar.gz"</span>
install.packages(packageurl, repos=<span style="font-weight: bold; text-decoration: underline;">NULL</span>, type=<span style="font-style: italic;">"source"</span>)
</pre>
</div>
<p>
If you know the URL, you can also install from source via the command
line outside of R. For instance (in bash):
</p>
<div class="org-src-container">
<pre style="padding-left: 30px; background-color: #f6f8fa;" class="src src-shell">wget http://cran.r-project.org/src/contrib/Archive/ggplot2/ggplot2_0.9.1.tar.gz
R CMD INSTALL ggplot2_0.9.1.tar.gz
</pre>
</div>
</div>
</div>
<div id="outline-container-org9d64d25" class="outline-4">
<h4 id="org9d64d25">Potential issues</h4>
<div class="outline-text-4" id="text-org9d64d25">
<p>
There are a few potential issues that may arise with installing older
versions of packages:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">You may be losing functionality or bug fixes that are only present
in the newer versions of the packages.</li>
<li style="margin-bottom:0;">The older package version needed may not be compatible with the
version of R you have installed. In this case, you will either need
to downgrade R to a compatible version or update your R code to work
with a newer version of the package.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="content">
<h1 class="title">Additional references</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul style="margin:0 0;">
<li style="margin-bottom:0;"><a href="#org3b8ed57">"Thoughts" on language/software stability</a></li>
<li style="margin-bottom:0;"><a href="#org1d2d532">Controlling your software environment</a></li>
<li style="margin-bottom:0;"><a href="#org50da419">Preservation/Archiving</a></li>
<li style="margin-bottom:0;"><a href="#org5d2f9e5">Workflows</a></li>
<li style="margin-bottom:0;"><a href="#orgad41259">Numerical and statistical issues</a></li>
<li style="margin-bottom:0;"><a href="#org7321a51">Publication practices</a></li>
<li style="margin-bottom:0;"><a href="#orge4adad6">Experimentation</a></li>
</ul>
</div>
</div>
<div id="outline-container-org3b8ed57" class="outline-2">
<h2 id="org3b8ed57">"Thoughts" on language/software stability</h2>
<div class="outline-text-2" id="text-org3b8ed57">
<p>
As we explained, the programming language used in an analysis has a
clear influence on the reproducibility of your analysis. It is not a
characteristic of the language itself but rather a consequence of the
development philosophy of the underlying community. For example C is a
very stable language with a <a href="https://en.wikipedia.org/wiki/C_(programming_language)#ANSI_C_and_ISO_C">very clear specification designed by a
committee</a> (even though some compilers may not respect this norm).
</p>
<p>
On the other end of the spectrum, <a href="https://en.wikipedia.org/wiki/Python_(programming_language)">Python</a> had a much more organic
development based on a readability philosophy and valuing continuous
improvement over backwards-compatibility. Furthermore, Python is
commonly used as a wrapping language (e.g., to easily use C or FORTRAN
libraries) and has its own packaging system. All these design choices
tend to make reproducibility often a bit painful with Python, even
though the community is slowly taking this into account. The transition from Python 2 to the not fully backwards compatible Python 3 has been a particularly painful process, not least because the two languages are so similar that is it not always easy to figure out if a given script or module is written in Python 2 or Python 3. It isn't even rare to see Python scripts that work under both Python 2 and Python 3, but produce different results due to the change in the behavior of integer division.
</p>
<p>
<a href="https://en.wikipedia.org/wiki/R_(programming_language)">R</a>, in comparison is much closer (in terms of developer community) to
languages like <a href="https://en.wikipedia.org/wiki/SAS_(software)">SAS</a>, which is heavily used in the pharmaceutical
industry where statistical procedures need to be standardized and rock
solid/stable. R is obviously not immune to evolutions that break old
versions and hinder reproducibility/backward compatibility. Here is a
relatively recent <a href="http://members.cbio.mines-paristech.fr/~thocking/HOCKING-reproducible-research-with-R.html">true story about this</a> and some colleagues who worked
on the <a href="https://www.fun-mooc.fr/courses/UPSUD/42001S06/session06/about">statistics introductory course with R on FUN</a> reported us
several issues with a few functions (<code>plotmeans</code> from <code>gplots</code>,
<code>survfit</code> from <code>survival</code>, or <code>hclust</code>) whose default parameters had
changed over the years. It is thus probably good practice to give
explicit values for all parameters (which can be cumbersome) instead
of relying on default values, and to restrict your dependencies as much
as possible.
</p>
<p>
This being said, the R development community is generally quite
careful about stability. We (the authors of this MOOC) believe that open
source (which allows to inspect how computation is done and to
identify both mistakes and sources of non-reproducibility) is more
important than the rock solid stability of SAS, which is proprietary
software. Yet, if you really need to stay with SAS (similar solutions
probably exist for other languages as well), you should know that SAS
can be used within Jupyter using either the <a href="https://sassoftware.github.io/sas_kernel/">Python SASKernel</a> or the
<a href="https://sassoftware.github.io/saspy/">Python SASPy</a> package (step by step explanations about this are given
<a href="https://app-learninglab.inria.fr/gitlab/85bc36e0a8096c618fbd5993d1cca191/mooc-rr/blob/master/documents/tuto_jupyter_windows/tuto_jupyter_windows.md">here</a>). Using such literate programming approach allied with systematic
version and environment control will always help.
</p>
</div>
</div>
<div id="outline-container-org1d2d532" class="outline-2">
<h2 id="org1d2d532">Controlling your software environment</h2>
<div class="outline-text-2" id="text-org1d2d532">
<p>
As we mentioned in the video sequences, there are several solutions to
control your environment:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;">The easy (preserve the mess) ones: <a href="http://www.pgbovine.net/cde.html">CDE</a> or <a href="https://vida-nyu.github.io/reprozip/">ReproZip</a></li>
<li style="margin-bottom:0;">The more demanding (encourage cleanliness) where you start with a
clean environment and install only what's strictly necessary (and document it):
<ul class="org-ul">
<li style="margin-bottom:0;">The very well known <a href="https://www.docker.io/">Docker</a></li>
<li style="margin-bottom:0;"><a href="https://singularity.lbl.gov/">Singularity</a> or <a href="https://spack.io/">Spack</a>, which are more targeted toward the specific
needs of high performance computing users</li>
<li style="margin-bottom:0;"><a href="https://www.gnu.org/software/guix/">Guix</a>, <a href="https://nixos.org/">Nix</a> that are very clean (perfect?) solutions to this
dependency hell and which we recommend</li>
</ul></li>
</ul>
<p>
It may be hard to understand the difference between these different
approaches and decide which one is better in your context.
</p>
<p>
Here is a webinar where some of these tools are demoed in a
reproducible research context: <a href="https://github.com/alegrand/RR_webinars/blob/master/2_controling_your_environment/index.org">Controling your environment (by Michael
Mercier and Cristian Ruiz)</a>
</p>
<p>
You may also want to have a look at <a href="http://falsifiable.us/">the Popper conventions</a> (<a href="https://github.com/alegrand/RR_webinars/blob/master/11_popper/index.org">webinar by
Ivo Gimenez through google hangout</a>) or at the <a href="https://github.com/alegrand/RR_webinars/blob/master/7_publications/index.org">presentation of Konrad
Hinsen on Active Papers</a> (<a href="http://www.activepapers.org/">http://www.activepapers.org/</a>).
</p>
</div>
</div>
<div id="outline-container-org50da419" class="outline-2">
<h2 id="org50da419">Preservation/Archiving</h2>
<div class="outline-text-2" id="text-org50da419">
<p>
Ensuring software is properly archived, i.e, is safely stored so that
it can be accessed in a perennial way, can be quite tricky. If you
have never seen <a href="https://github.com/alegrand/RR_webinars/blob/master/5_archiving_software_and_data/index.org">Roberto Di Cosmo presenting the Software Heritage
project</a>, this is a must see. <a href="https://www.softwareheritage.org/">https://www.softwareheritage.org/</a>
</p>
<p>
For regular data, we highly recommend using <a href="https://www.zenodo.org/">https://www.zenodo.org/</a>
whenever the data is not sensitive.
</p>
</div>
</div>
<div id="outline-container-org5d2f9e5" class="outline-2">
<h2 id="org5d2f9e5">Workflows</h2>
<div class="outline-text-2" id="text-org5d2f9e5">
<p>
In the video sequences, we mentioned workflow managers (original application domain in parenthesis):
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://galaxyproject.org/">Galaxy</a> (genomics), <a href="https://kepler-project.org/">Kepler</a> (ecology), <a href="https://taverna.apache.org/">Taverna</a> (bio-informatics), <a href="https://pegasus.isi.edu/">Pegasus</a>
(astronomy), <a href="http://cknowledge.org/">Collective Knowledge</a> (compiling optimization) ,
<a href="https://www.vistrails.org">VisTrails</a> (image processing)</li>
<li style="margin-bottom:0;">Light-weight: <a href="http://dask.pydata.org/">dask</a> (python), <a href="https://ropensci.github.io/drake/">drake</a> (R), <a href="http://swift-lang.org/">swift</a> (molecular biology),
<a href="https://snakemake.readthedocs.io/">snakemake</a> (like <code>make</code> but more expressive and in <code>python</code>) &#x2026;</li>
<li style="margin-bottom:0;">Hybrids: <a href="https://vatlab.github.io/sos-docs/">SOS-notebook</a>, &#x2026;</li>
</ul>
<p>
You may want to have a look at this webinar: <a href="https://github.com/alegrand/RR_webinars/blob/master/6_reproducibility_bioinformatics/index.org">Reproducible Science in
Bio-informatics: Current Status, Solutions and Research Opportunities
(by Sarah Cohen Boulakia, Yvan Le Bras and Jérôme Chopard).</a>
</p>
</div>
</div>
<div id="outline-container-orgad41259" class="outline-2">
<h2 id="orgad41259">Numerical and statistical issues</h2>
<div class="outline-text-2" id="text-orgad41259">
<p>
We have mentioned these topics in our MOOC but we could by no way
cover them properly. We only suggest here a few interesting talks
about this.
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://github.com/alegrand/RR_webinars/blob/master/10_statistics_and_replication_in_HCI/index.org">In this talk, Pierre Dragicevic provides a nice illustration of the
consequences of statistical uncertainty and of how some concepts
(e.G. p-values) are commonly badly understood.</a></li>
<li style="margin-bottom:0;"><a href="https://github.com/alegrand/RR_webinars/blob/master/3_numerical_reproducibility/index.org">Nathalie Revol, Philippe Langlois and Stef Graillat present the main
challenges encountered when trying to achieve numerical
reproducibility and present recent research work on this topic.</a></li>
</ul>
</div>
</div>
<div id="outline-container-org7321a51" class="outline-2">
<h2 id="org7321a51">Publication practices</h2>
<div class="outline-text-2" id="text-org7321a51">
<p>
You may want to have a look at the following two webinars:
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://github.com/alegrand/RR_webinars/blob/master/8_artifact_evaluation/index.org">Enabling open and reproducible research at computer systems’
conferences (by Grigori Fursin)</a>. In particular, this talk discusses
<i>artifact evaluation</i> that is becoming more and more popular.</li>
<li style="margin-bottom:0;"><a href="https://github.com/alegrand/RR_webinars/blob/master/7_publications/index.org">Publication Modes Favoring Reproducible Research (by Konrad Hinsen
and Nicolas Rougier)</a>. In this talk, the motivation for the <a href="http://rescience.github.io/">ReScience
journal</a> initiative are presented.</li>
<li style="margin-bottom:0;"><a href="https://www.youtube.com/watch?v=HuJ2G8rXHMs">Simine Vazire - When Should We be Skeptical of Scientific Claims?</a>,
which is discussing publication practices in social sciences and in
particular HARKing (Hypothesizing After the Results are Known),
p-hacking, etc.</li>
</ul>
</div>
</div>
<div id="outline-container-orge4adad6" class="outline-2">
<h2 id="orge4adad6">Experimentation</h2>
<div class="outline-text-2" id="text-orge4adad6">
<p>
Experimentation was not covered in this MOOC, although it is an
essential part of science. The main reason is that practices and
constraints can vary so wildly from one domain to another that it could
not be properly covered in a first edition. We would be happy to
gather references you consider as interesting in your domain so do not
hesitate to provide us with such references by using the forum and we
will update this page.
</p>
<ul class="org-ul">
<li style="margin-bottom:0;"><a href="https://github.com/alegrand/RR_webinars/blob/master/9_experimental_testbeds/index.org">A recent talk by Lucas Nussbaum on Experimental Testbeds in Computer
Science</a>.</li>
</ul>
</div>
</div>
</div>
Hello world ! It works
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment