Skip to content

Commit 20672a4

Browse files
authored
Quelques correctifs supplémentaires sur Git et mercator (#566)
* close #564 * change docker image * Exo git * Webmercator
1 parent 084715f commit 20672a4

File tree

4 files changed

+98
-8
lines changed

4 files changed

+98
-8
lines changed

content/git/exogit.qmd

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,97 @@ Régler le conflit et valider (`add` et `commit`). Pousser le résultat. Le main
308308

309309
Il n'est absolument pas obligatoire que chaque projet collaboratif choisisse ce mode de collaboration. Pour de nombreux projets, où on édite pas le même bout de fichier en même temps, passer directement par `main` est suffisant. Le mode ci-dessus est important pour des projets conséquents, où la branche `main` se doit d'être irréprochable parce que, par exemple, elle entraîne une série de tests automatisés et le déploiement automatisé d'un livrable. Mais pour des projets plus modestes, il n'est pas indispensable d'aller dans un formalisme extrême. Le bon usage de `Git` est un usage pragmatique où celui-ci est utilisé pour ses avantages et où l'organisation du travail s'adapte à ceux-ci.
310310

311+
# Les enjeux spécifiques liés à l'interaction difficile entre `Git` et les _notebooks_
312+
313+
Le format _notebook_ est très intéressant pour l'expérimentation et la diffusion finale de résultats. Néanmoins, la structure complexe d'un _notebook_ rend compliquée le contrôle de version. En effet, l'ouverture dans un éditeur adapté (`Jupyter` ou `VSCode`) offre une mise en forme qui ne correspond pas à la structure brute du fichier, tel qu'il est stocké sur le disque. En arrière plan, les _notebooks_ sont des JSON qui embarquent de nombreux éléments: code, résultats d'exécution, métadonnées annexes... Le suivi fin des modifications du fichier permis par `Git` est compliqué sur un fichier ayant une telle structure. L'objectif de cet exercice est d'illustrer ces enjeux et évoque quelques solutions possibles.
314+
315+
::: {.exercise}
316+
## Exercice 4 : Contrôle de version et _notebooks_, un ménage difficile
317+
318+
Cet exercice se fait toujours en équipe. Lorsqu'il est demandé de faire un _commit_,
319+
lui donner un nom signifiant pour s'y retrouver facilement quand il est demandé de regarder l'historique.
320+
Ne pas faire de _push_ ou _pull_ avant d'en arriver
321+
à la partie où cela est demandé.
322+
323+
1. Tous les membres de l'équipe reviennent à leur branche `main` sur leur copie de travail
324+
325+
Chaque membre de l'équipe fait les questions suivantes.
326+
327+
2. Mesurer le poids de l'ensemble de l'historique en ligne de commande avec la commande
328+
329+
```python
330+
du -sh .git
331+
```
332+
333+
3. Télécharger le _notebook_ servant à cet exercice avant la commande suivante, en ligne de commande:
334+
335+
```python
336+
curl "https://minio.lab.sspcloud.fr/lgaliana/python-ENSAE/inputs/git/exemple.ipynb" -o "notebook.ipynb"
337+
```
338+
339+
* Ne pas ouvrir ce fichier (objet de la prochaine question).
340+
341+
* Faire un _commit_ de ce _notebook_ puis refaire
342+
343+
```python
344+
du -sh .git
345+
```
346+
347+
* Observez le premier changement de poids de notre historique
348+
349+
4. Ouvrir le _notebook_, exécuter ses cellules en les réordonnant si nécessaire pour débugger
350+
le fichier.
351+
352+
* Faire un _commit_ de ce _notebook_ quand il fonctionne puis refaire
353+
354+
```python
355+
du -sh .git
356+
```
357+
358+
5. Maintenant, faire les modifications suivantes du fichier:
359+
* Modifier la cellule `df.head(3)` en `df.head(20)`
360+
* Créer une nouvelle cellule avec le code `df["TYPEQU"].value_counts().plot(kind = "bar")`
361+
* Modifier la variable `zoom_start` dans la cellule produisant la carte interactive. Fixer sa valeur à 13 plutôt que 15.
362+
363+
* Faire un _commit_ de ce _notebook_ quand il fonctionne puis refaire
364+
365+
```python
366+
du -sh .git
367+
```
368+
369+
6. Changer la couleur du _barplot_ avec l'argument `color`. Sauvegarder, committer puis refaire
370+
371+
```python
372+
du -sh .git
373+
```
374+
375+
7. Regarder l'historique depuis l'extension `VSCode`. Observer la manière dont évolue votre fichier à chaque _commit_.
376+
377+
Maintenant, nous pouvons passer à l'étape collaborative.
378+
379+
8. Chaque membre de l'équipe _push_:
380+
* Si le _push_ fonctionne (personne la plus rapide), modifier à nouveau à nouveau la couleur du _barplot_. _Committer_ mais ne pas _pusher_ (attendre que les autres membres du groupe l'ait fait)
381+
* Si le _push_ ne fonctionne pas (personnes moins rapides), réconcilier les versions. Une fois que c'est le cas, committer et pusher.
382+
* Maintenant la personne la plus rapide fait un _pull_ et règle les conflits
383+
384+
:::
385+
386+
387+
Cet exercice permet d'illustrer trois points de difficultés avec les _notebooks_:
388+
389+
* La taille des fichiers `ipynb` devient vite importante car les _outputs_ sont insérés dedans, de manière brute.
390+
* Il devient vite difficile de suivre les changements du code car celui-ci est noyé au milieu d'autres modifications (notamment celles des _outputs_).
391+
* La résolution de conflits est compliquée car il faut garder la structure JSON. Il est d'ailleurs fréquent qu'un _merge_ casse cette structure et rende le _notebook_ illisible.
392+
393+
394+
Pour régler ces problèmes, il existe plusieurs méthodes:
395+
396+
* Si on désire rester sur le _notebook_ comme endroit où est stocké le code, il faut cliquer sur le bouton `Clear all outputs` avant de faire une étape `git add`. Le _package_ [`nbstripout`](https://github.com/kynan/nbstripout) peut être une solution intéressante pour ne pas avoir à le faire manuellement à chaque fois car on prend le risque d'oublier et donc de faire quand même grossir la taille du dépôt. Néanmoins, cette approche ne règle qu'une partie des problèmes puisqu'elle ne fait qu'alléger le JSON versionné, elle rend moins probable mais ne rend pas impossible le risque de casser le _notebook_ lors d'une résolution de conflit.
397+
* Travailler en équipe sur des _notebooks_ différents comme ceci était conseillé pour les fichiers texte. Cela permet de ne plus avoir de conflit. Cependant, cela risque d'induire des redondances de code et donc des problèmes ultérieurement si on désire synthétiser les différents travaux.
398+
* Adopter une structure plus modulaire en déportant le maximum de code dans des fichiers `.py` et en important les éléments adéquats dans les notebooks. Ceci permet de tirer avantage de `Git`, qui suit très bien les fichiers `.py`, tout en offrant des bénéfices sur la qualité des _notebooks_. En étant moins monolithiques, ils seront probablement de meilleure qualité.
399+
400+
Cette dernière approche est une manière de s'ouvrir aux bonnes pratiques qui sont évoquées dans le cours de 3e année de ["Mise en production"](https://ensae-reproductibilite.github.io/website/).
401+
311402

312403
# Conclusion
313404

content/git/introgit.qmd

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,16 +308,14 @@ Cet exercice vient de nous illustrer le principe de l'authentification et la man
308308

309309
Cette approche montre comment le SSPCloud injecte lors de la création d'un service VSCode le _token_ et le dépôt que vous désirez clôner.
310310

311-
312311
1. Sur le SSPCloud, se rendre dans la page [Mes Services](https://datalab.sspcloud.fr/my-services). Vous pouvez supprimer le service existant, il n'est plus nécessaire.
313312

314313
2. Cliquer sur `➕​ Nouveau service` et choisir un service `vscode-python` (ne pas en prendre un autre).
315314

316-
3. Dans un autre onglet, récupérer, sur la page d'accueil de votre dépôt, l'url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert `<> Code`. L'URL prend la forme suivante
315+
* Dans un autre onglet, récupérer, sur la page d'accueil de votre dépôt, l'url du dépôt distant qui est accessible en cliquant à droite sur le bouton vert `<> Code`. L'URL prend la forme suivante
317316

318317
`https://github.com/<username>/<reponame>.git`
319318

320-
321319
* Dérouler le menu `Configuration Vscode-python` et chercher l'onglet `Git`
322320

323321
* Dans celui-ci, vous devriez voir votre _token_ pré-injecté dans le formulaire. Ne le changez pas.

content/manipulation/03_geopandas_intro.qmd

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -600,9 +600,11 @@ les calculs sur la dimension spatiale.
600600

601601
* `2154` : système de projection Lambert 93. Il s'agit du système de projection officiel. La plupart des données diffusées par l'administration pour la métropole sont disponibles dans ce système de projection.
602602
* `27572` : Lambert II étendu. Il s'agit de l'ancien système de projection officiel. Les données spatiales anciennes peuvent être dans ce format.
603-
* `4326` : WGS 84 ou système de pseudo-Mercator ou encore _Web Mercator_. Ce n'est en réalité pas un système de projection mais un système de coordonnées (longitude / latitude) qui permet simplement un repérage angulaire sur l'ellipsoïde. Il est utilisé pour les données GPS. Il s'agit du système le plus
603+
* `4326` : WGS 84 ou système de pseudo-Mercator Ce n'est en réalité pas un système de projection mais un système de coordonnées (longitude / latitude) qui permet simplement un repérage angulaire sur l'ellipsoïde. Il est utilisé pour les données GPS. Il s'agit du système le plus
604604
usuel, notamment quand on travaille avec des fonds de carte _web_.
605605

606+
607+
606608
:::
607609

608610
::: {.content-visible when-profile="en"}
@@ -631,8 +633,7 @@ This operation is not neutral. One of the consequences of the [remarkable theore
631633

632634
## Le système Mercator
633635

634-
Comme évoqué plus haut, l'une des projections les plus connues est la
635-
projection _Web Mercator_ dite WGS84 (code EPSG 4326). Il
636+
Comme évoqué plus haut, l’une des projections les plus connues est la projection Web Mercator (code EPSG 3857), qui projète sur les cartes planes les données sphériques de longitude, latitude issues du système WGS84 (EPSG 4326), qui est le système géodésique utilisé par le [GNSS](https://en.wikipedia.org/wiki/Satellite_navigation) américain [**GPS**](https://en.wikipedia.org/wiki/Global_Positioning_System), utilisé par l'immense majorité des systèmes de navigation mondiaux, et a fortiori Google Maps. Il
636637
s'agit d'une projection conservant intacte les angles, ce
637638
qui implique qu'elle altère les distances. Celle-ci a en effet été
638639
pensée, à l'origine, pour représenter l'hémisphère Nord. Plus
@@ -654,7 +655,7 @@ Il s'agit d'une projection pensée d'abord pour la navigation, non pour la repr
654655

655656
## The Mercator System
656657

657-
As mentioned earlier, one of the most well-known projections is the _Web Mercator_ projection, also known as WGS84 (EPSG code 4326). This projection preserves angles, which means it distorts distances. It was originally designed to represent the Northern Hemisphere. The farther you move away from it, the more distances are distorted. This leads to well-known distortions (Greenland being oversized, Africa reduced in size, Antarctica being immense, etc.). However, the Mercator projection keeps positions intact. This property explains its use in GPS systems and navigation map backgrounds like _Google Maps_. It is a projection primarily designed for navigation, not for representing socio-economic information on Earth. This projection is inseparable from the great explorations of the Renaissance, as highlighted by [this Twitter thread](https://x.com/JulesGrandin/status/1765668642094514447) by Jules Grandin.
658+
As mentioned above, one of the best-known projections is the Web Mercator projection (EPSG code 3857), which projects spherical longitude and latitude data from the WGS84 system (EPSG 4326) onto flat maps. This is the geodetic system used by the American [GNSS](https://en.wikipedia.org/wiki/Satellite_navigation) [**GPS**](https://en.wikipedia.org/wiki/Global_Positioning_System), which is used by the vast majority of global navigation systems, let alone Google Maps. This projection preserves angles, which means it distorts distances. It was originally designed to represent the Northern Hemisphere. The farther you move away from it, the more distances are distorted. This leads to well-known distortions (Greenland being oversized, Africa reduced in size, Antarctica being immense, etc.). However, the Mercator projection keeps positions intact. This property explains its use in GPS systems and navigation map backgrounds like _Google Maps_. It is a projection primarily designed for navigation, not for representing socio-economic information on Earth. This projection is inseparable from the great explorations of the Renaissance, as highlighted by [this Twitter thread](https://x.com/JulesGrandin/status/1765668642094514447) by Jules Grandin.
658659

659660
![*Example of country re-projection from the site [thetruesize.com](https://thetruesize.com/)*](https://minio.lab.sspcloud.fr/lgaliana/generative-art/pythonds/truesize.png)
660661

docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM inseefrlab/onyxia-vscode-python:py3.11.6-2024.04.08
1+
FROM inseefrlab/onyxia-vscode-python:py3.12.6-2024.10.07
22

33
USER root
44

0 commit comments

Comments
 (0)