cassionAnalyse de données

Retour à la leçonLeçon 2 sur 8Le projet sur le disque

Git n'oublie pas, ce qui en est l'intérêt et le danger

Le même diaporama que les téléchargements, rendu sous forme de page. Lancez le diaporama pour le présenter en plein écran — les flèches ou un clic avancent d'une diapositive, Échap quitte.

Diapositives · PDFDiapositives · PowerPoint

  1. Diapositive 1 / 23

    Ce que couvre cette leçon

    • Le commit qu'on ne peut pas reprendre
    • Le .gitignore qu'on écrit avant le premier commit
    • Ce que « données personnelles » signifie ici, précisément
    • La vérification qui s'exécute avant le commit
    • Que faire si c'est déjà arrivé
    • Les commits sur un travail d'analyse
    • Ce que devrait contenir un dépôt d'analyse de programme
    • Rapportez-le en entier
    • La suite
    Notes du présentateur
    Un dépôt se souvient de chaque version de chaque fichier qu'il a jamais contenu, ce qui est exactement ce qu'on veut pour du code et exactement ce qu'on ne peut pas permettre pour une liste de bénéficiaires. Supprimer le fichier dans un commit ultérieur ne le retire pas.
  2. Diapositive 2 / 23

    Le commit qu'on ne peut pas reprendre — Shell

    git add data/raw/beneficiaries.csv
    git commit -m "add survey data"
    # ... realised three days later ...
    git rm data/raw/beneficiaries.csv
    git commit -m "remove data"
  3. Diapositive 3 / 23

    Le commit qu'on ne peut pas reprendre

    • Le fichier est toujours dans le dépôt — Il est dans l'historique, dans chaque clone, sur le dépôt distant, et dans la…
    • Sur un dépôt contenant des données de protection ou de santé, c'est une divulgation — Non une erreur à corriger plus…
    • D'où une règle préventive plutôt que corrective — On ne peut pas dé-commiter des données personnelles ; on ne peut que…
    Notes du présentateur
    Le fichier est toujours dans le dépôt. Il est dans l'historique, dans chaque clone, sur le dépôt distant, et dans la copie locale de tous ceux qui ont tiré. Le second commit l'a retiré de l'état courant et de rien d'autre. Sur un dépôt contenant des données de protection ou de santé, c'est une divulgation. Non une erreur à corriger plus tard — une divulgation, avec les mêmes obligations que n'importe quelle autre. D'où une règle préventive plutôt que corrective. On ne peut pas dé-commiter des données personnelles ; on ne peut que les empêcher d'entrer.
  4. Diapositive 4 / 23

    Le .gitignore qu'on écrit avant le premier commit — Exemple (suite)

    # Raw data. Nothing under here is ever committed.
    data/raw/*
    !data/raw/.gitkeep
    !data/raw/CHECKSUMS
    
    # Derived data, regenerated by the pipeline
    outputs/
    
    # Credentials, in every form they arrive in
    .env
    *.pem
    *_secret*
    config.local.*
    
    # Editor and language noise
    .Rhistory
  5. Diapositive 5 / 23

    Le .gitignore qu'on écrit avant le premier commit — Exemple (suite)

    .RData
    __pycache__/
    *.pyc
    .DS_Store
    .ipynb_checkpoints/
  6. Diapositive 6 / 23

    Le .gitignore qu'on écrit avant le premier commit

    • Écrivez-le en premier, commitez-le en premier — Un .gitignore ajouté après le premier commit est un .gitignore…
    • Les négations comptent — data/raw/* exclut tout, puis !data/raw/CHECKSUMS laisse revenir exactement le fichier qui…
    Notes du présentateur
    Écrivez-le en premier, commitez-le en premier. Un .gitignore ajouté après le premier commit est un .gitignore arrivé trop tard pour la chose qu'il devait attraper. Les négations comptent. data/raw/* exclut tout, puis !data/raw/CHECKSUMS laisse revenir exactement le fichier qui prouve quel export a servi — la provenance sans le contenu.
  7. Diapositive 7 / 23

    Ce que « données personnelles » signifie ici, précisément

    Paraît anonymeNe l'est pas, parce que
    Un identifiant de casIl se joint à un système de gestion de cas qui a le nom
    Les coordonnées GPS d'un ménageC'est une adresse
    Date de naissance plus commune plus sexeTrois champs identifient la plupart des gens dans une petite commune
    La photographie d'un formulaireChaque champ qui y figure
    Une colonne de notes en texte libreElle contient ce que le travailleur social a tapé
    Notes du présentateur
    C'est plus large qu'une colonne de noms, et les jeux de données de ce secteur le démontrent.
  8. Diapositive 8 / 23

    Ce que « données personnelles » signifie ici, précisément

    • Le cours de protection a établi l'arithmétique — une ventilation à quatre entrées d'un jeu de données anonyme a produit…
    • Le test n'est donc pas « y a-t-il une colonne de noms » — C'est de savoir si une combinaison quelconque de ce que…
    Notes du présentateur
    Le cours de protection a établi l'arithmétique : une ventilation à quatre entrées d'un jeu de données anonyme a produit dix-neuf cellules de un, et une cellule de un est une identification. Le test n'est donc pas « y a-t-il une colonne de noms ». C'est de savoir si une combinaison quelconque de ce que contient le fichier pourrait désigner une personne — et dans une petite commune, elle le peut généralement.
  9. Diapositive 9 / 23

    La vérification qui s'exécute avant le commit — Shell

    # .git/hooks/pre-commit — or the pre-commit framework, or a CI step
    if git diff --cached --name-only | grep -qE '^data/raw/'; then
      echo "Refusing to commit anything under data/raw/" >&2
      exit 1
    fi
  10. Diapositive 10 / 23

    La vérification qui s'exécute avant le commit — En R

    # The same check as an R function, run by whatever CI you have.
  11. Diapositive 11 / 23

    La vérification qui s'exécute avant le commit

    • Un crochet qui refuse vaut mieux qu'une politique qui rappelle — Le mode d'échec est quelqu'un de pressé à 18 heures,…
    • Ajoutez une recherche des formes que prennent les secrets — parce qu'un jeton collé dans un script est l'autre cas…
    Notes du présentateur
    Un crochet qui refuse vaut mieux qu'une politique qui rappelle. Le mode d'échec est quelqu'un de pressé à 18 heures, et un rappel n'y survit pas. Ajoutez une recherche des formes que prennent les secrets, parce qu'un jeton collé dans un script est l'autre cas courant. gitleaks et detect-secrets le font tous deux en une étape d'intégration continue.
  12. Diapositive 12 / 23

    Que faire si c'est déjà arrivé

    • Un : signalez-le — Votre organisation a une procédure d'incident de données
    • Deux : renouvelez tout ce qui était un identifiant — Un jeton commité est compromis définitivement ; le supprimer n'y…
    • Trois : réécrivez l'historique — avec git filter-repo ou BFG, et forcez la poussée
    • Quatre : supposez qu'il a été récupéré — Sur un dépôt public, supposez que le fichier a été téléchargé et copié, et…
    Notes du présentateur
    L'ordre compte et la première étape n'est pas technique. Un : signalez-le. Votre organisation a une procédure d'incident de données. C'en est un, et le caractère public ou non du dépôt décide de l'urgence, non de la nécessité. Deux : renouvelez tout ce qui était un identifiant. Un jeton commité est compromis définitivement ; le supprimer n'y change rien. Trois : réécrivez l'historique, avec git filter-repo ou BFG, et forcez la poussée. Chaque clone existant doit être supprimé et recloné — un clone que personne n'a recloné contient encore le fichier. Quatre : supposez qu'il a été récupéré. Sur un dépôt public, supposez que le fichier a été téléchargé et copié, et traitez la divulgation comme complète.
  13. Diapositive 13 / 23

    Que faire si c'est déjà arrivé — Shell

    git filter-repo --path data/raw/beneficiaries.csv --invert-paths
  14. Diapositive 14 / 23

    Que faire si c'est déjà arrivé

    • La troisième étape est la seule qui ressemble à une correction et c'est la moins importante
    Notes du présentateur
    La troisième étape est la seule qui ressemble à une correction et c'est la moins importante.
  15. Diapositive 15 / 23

    Les commits sur un travail d'analyse

    • Commitez le code et la sortie ensemble quand la sortie est commitée — Une figure et le script qui l'a produite…
    • Écrivez le pourquoi dans le message — corrige les noms de communes est ce que le diff montre déjà
    Notes du présentateur
    Les habitudes diffèrent de celles du développement logiciel sur deux points qu'il vaut la peine de nommer. Commitez le code et la sortie ensemble quand la sortie est commitée. Une figure et le script qui l'a produite appartiennent au même commit, pour qu'un relecteur voie si le graphique correspond au changement. Écrivez le pourquoi dans le message. corrige les noms de communes est ce que le diff montre déjà. « Regrouper quatre orthographes de Nord-Ouest ; sans regroupement, le pire district se fragmente et aucun fragment ne paraît alarmant » est ce dont un successeur a besoin et qu'il ne peut pas retrouver.
  16. Diapositive 16 / 23

    Les commits sur un travail d'analyse — Shell

    git commit -m "Group four spellings of Nord-Ouest before computing coverage
    
    Ungrouped, the worst district splits into fragments of 727, 33, 22 and 20
    households and none of them looks alarming. The 20-household fragment shows
    0% open defecation, which a district table would report as a solved problem."
  17. Diapositive 17 / 23

    Les commits sur un travail d'analyse

    • Une branche par question d'analyse, non par journée — Une branche qui répond à « la couverture diffère-t-elle par…
    Notes du présentateur
    Une branche par question d'analyse, non par journée. Une branche qui répond à « la couverture diffère-t-elle par district » peut être relue et fusionnée ; une branche appelée travail non.
  18. Diapositive 18 / 23

    Ce que devrait contenir un dépôt d'analyse de programme — Exemple

    project/
      .gitignore          committed first
      README.md           what it produces, how to run it, what to know
      uv.lock             the environment, pinned
      src/                every transformation
      tests/              the checks that fail loudly
      data/
        raw/              .gitkeep and CHECKSUMS only
        reference/        committed: thresholds, admin codes, lookup tables
      outputs/            ignored
  19. Diapositive 19 / 23

    Ce que devrait contenir un dépôt d'analyse de programme

    • Les tables de référence sont commitées et les données brutes non — et la ligne qui les sépare est de savoir si le…
    Notes du présentateur
    Les tables de référence sont commitées et les données brutes non, et la ligne qui les sépare est de savoir si le fichier décrit des personnes. Les standards de croissance de l'OMS, les seuils IPC et les codes de découpage administratif sont de la référence ; une liste de ménages non.
  20. Diapositive 20 / 23

    Rapportez-le en entier — Exemple

    Data handling in this analysis
    
      No raw data is committed. data/raw/ is excluded by .gitignore, with only a
      CHECKSUMS file tracked so the exports used can be identified.
    
      A pre-commit hook refuses any staged file under data/raw/ and a CI step
      scans for credential patterns.
    
      Reference tables (WHO growth standards, IPC thresholds, admin codes) are
      committed; they describe no individual.
    
      The repository is private and access is limited to the M&E team. Raw
      exports are held in [the organisation's storage], not here.
  21. Diapositive 21 / 23

    Rapportez-le en entier

    • La dernière ligne est celle qu'on oublie et celle qu'un audit demande — Dire où sont les données compte autant que…
    Notes du présentateur
    La dernière ligne est celle qu'on oublie et celle qu'un audit demande. Dire où sont les données compte autant que dire où elles ne sont pas.
  22. Diapositive 22 / 23

    La suite

    • Du code en gestion de versions ne reproduit toujours pas un nombre si l'environnement diffère.
    Notes du présentateur
    Du code en gestion de versions ne reproduit toujours pas un nombre si l'environnement diffère. La leçon suivante le fige, et trouve les quatre choses qui font différer une réexécution alors que rien dans le dépôt n'a changé.
  23. Diapositive 23 / 23

    La suite

    Lire la leçon complète, avec le code exécutable Retour à la leçon