Legilibre / Archeo-Lex

Pure Histoire de la Loi française – Git + Markdown
https://archeo-lex.fr
Do What The F*ck You Want To Public License
98 stars 17 forks source link

Faire tourner Archéo Lex sur tous les codes avec une base LEGI récente #28

Closed Seb35 closed 5 years ago

Seb35 commented 7 years ago

C’était à faire depuis quelques temps et Suzanne Vergnolle m’a d’ailleurs relancé il y a une dizaine des jours.

Ce bug est un bug de tracking, il sert à résumer l’avancement et à faire le point sur les différents problèmes que pourrait rencontrer un utilisateur qui débuterait avec Archéo Lex. Ce bug sera fermé lorsque tous les codes tourneront correctement. L’automatisation éventuelle est hors de portée de ce bug et doit faire l’objet d’un bug séparé.

Seb35 commented 7 years ago

À date :

Seb35 commented 7 years ago

Je mentionne ici une idée pour ne pas oublier, mais ça pourra probablement faire l’objet d’un bug séparé.

Avec mes déboires de versionnement sous Git des fichiers de la base LEGI et en parallèle en étudiant les tréfonds de Docker, notamment le système de fichiers AuFS, je me dis que ça pourrait être intéressant de voir les fichiers de la base LEGI comme une superposition de couches, donc de décompresser la version initiale dans un répertoire puis chaque màj chacune dans des répertoires propres (à voir comment gérer les suppressions de fichiers).

Ensuite, à la lecture, pour lire un répertoire spécifique :

En comparaison de l’algorithme « on décompresse la base LEGI jusqu’au jour J », l’avantage est d’avoir de pouvoir lire en même temps toutes les livraisons de la base LEGI. En inconvénient, cet algorithme est plus lent à la lecture. Il est aussi possible de mélanger les deux stratégies et de combiner ça avec la gestion de l’espace disque :

Dans le même ordre d’idée, peut-être que les systèmes de fichiers avec la fonctionnalité de snapshot pourraient être intéressants (par exemple btrfs ou zfs, cf comparaison des systèmes de fichiers). Je n’ai jamais utilisé ce type de fonctionnalité, mais ça peut valoir le coup de s’y pencher.

fenollp commented 7 years ago

Note que la plupart des hebergeurs Git gratuits (bitbucket, gitlab, github) limite les .git a 1GB et au dela suppriment des fichiers au hasard.

Autre solution a envisager: stocker des tarball dans https://git-lfs.github.com/

Changaco commented 7 years ago

Je ne comprends pas pourquoi tu persistes à vouloir extraire les archives, ça ne fait que gâcher de l'espace disque et du temps.

Je reste aussi sceptique sur l'export vers Git, d'autres projets l'ont déjà fait, et quitte à utiliser un logiciel existant MediaWiki est bien plus puissant que la meilleure des interfaces web Git.

fenollp commented 7 years ago

Autre solution: subdiviser les donnees pour les stocker dans plusieurs repo. Pourquoi pas en faire un autre qui les ajoute tous en submodules.

Seb35 commented 7 years ago

@fenollp La place n’est un problème que pour la base LEGI originale (~10 Gio lorsque décompressée). Après extraction avec Git, les dépôts ne font que quelques centaines de Kio après compression (git gc), par exemple les 4 que je viens de terminer (pas encore publiés) :

Ils font effectivement jusqu’à une centaine de Mio avant compression mais vu que l’étape de compression ne prend que 15-30s, il ne faut pas s’en priver. Au passage, ce niveau de compression important montre le degré de modification au final très faible dans les historiques.

Avant compression :

Seb35 commented 7 years ago

@Changaco Sur ma volonté de prendre en compte les archives, c’est parce que je préfère pouvoir recalculer des choses après coup et avoir des résultats reproductibles. Étant donné la rigueur du format Git (changer un caractère change le numéro de commit de la version en cours et de toutes les versions à la suite), je préfère pouvoir suivre assez finement les changements. Par exemple, si la mise en page est changée dans un article lors d’une livraison, je peux :

  1. soit intégrer cette modification dans la prochaine version du code, mais ça n’est pas satisfaisant car cette modification n’est pas dû à cette nouvelle version mais provient d’un effet de bord entre différentes livraisons de la base LEGI
  2. soit je réécris effectivement l’historique en repartant de la date où a été introduit l’article, et il me semble que j’ai besoin comparer l’historique de l’ancienne et nouvelle livraisons (si c’est dans la base de données + dans le cache Markdown, je pense ne pas avoir besoin de la base LEGI)

Sur l’existance de ce cas, je me suis longtemps demandé si ça valait le coup de le prendre en compte, et je suis tombé une fois sur une délibération CNIL (pas la base LEGI mais similaire donc) où il avait été un jour publié la délibération, puis dans une livraison ultérieure la même délibération mais anonymisée. Donc la réécriture existe, et je pense que le cas ne peux pas être évité, il peut toujours y avoir des erreurs (sur le texte lui-même) qui sont corrigées lors de livraisons suivantes.

Je précise que le comportement actuel est le premier scénario car l’implémentation actuelle est trop simpliste, mais c’est à mon sens un bug et il serait souhaitable de basculer vers le deuxième scénario (à moins d’une autre solution).

Après, sur la gestion en pratique de la base LEGI et pour des questions de performance comme expliqué dans mon commentaire, je reviens sur mon idée d’archiver sous Git la base LEGI car il est effectivement beaucoup plus performant de réextraire les .tar.gz. Il est possible aussi que le scénario "AuFS" soit également peu performant, mais pour l’instant je n’en sais rien.

Seb35 commented 7 years ago

@Changaco Sur le versionnement Git ou MediaWiki, ça rejoint le « est-ce mieux d’avoir tout dans un fichier unique ou dans une arborscence ? », c’est-à-dire qu’il est possible d’extraire au format qu’on veut.

Il faut soit se mettre d’accord – c’était l’approche un peu testée depuis deux ans entre les quelques projets similaire – soit accepter qu’il n’y a pas une réponse unique, mais que cela varie en fonction des besoins et des préférences. Je m’oriente vers cette deuxième voie (cf par exemple #18 visant à rajouter des liens internes : c’est utile pour certains usages mais pas tous, donc il faut mettre un switch et ceux qui veulent des liens activeront le switch).

Avec le temps et les usages, j’imagine que certaines versions seront plus utilisées, par exemple une « Git + Markdown + fichier unique », une « Git + Markdown + arborscence » et une « MediaWiki + wikitexte + fichier unique ». Chacune aura ses avantages, ses inconvénients, et son utilité vis-à-vis d’un besoin spécifique.

En résumé, pull requests acceptées pour des variantes dès qu’elle peuvent être sélectionnées via un switch.

Changaco commented 7 years ago

Quand je dis "extraire les archives" je parle de faire un tar -xf archive.tar.gz ou équivalent. C'est un gâchis de ressources, legi.py ne le fait jamais, il transforme les archives directement en base SQLite sans passer par une extraction intermédiaire dans un système de fichier.

Détecter les corrections des contenus ou de leurs mises en page ne nécessite pas de conserver les anciennes versions.

fgallaire commented 7 years ago

@Changaco je ne suis pas sûr de comprendre ce qe tu veux dire, mais utiliser MediaWiki "à la place de Git" est une hérésie technique : base SQL contenant toutes les versions avec des diffs en PHP.

Changaco commented 7 years ago

Le fait que Git ne puisse pas modifier un ancien commit sans modifier tous les suivants est une des raisons qui font qu'à mon avis il n'est pas un bon format d'export pour les bases de données juridiques.

Si le but est de pouvoir explorer les textes et les différences entre versions alors MediaWiki est meilleur que Git. Si le but est d'exploiter les données d'une autre manière alors il vaut mieux utiliser directement la base SQLite. Bref, je ne vois pas dans quel cas passer par Git est bénéfique.

fgallaire commented 7 years ago

Je cherche à comprendre ton argument, quel est le cas pratique pour une bd juridique de modifier un ancien commit ?

Pour les diffs : Git, dont c'est l'unique utilité, est très largement supérieur à 2 requêtes MySQL + un diff calculé en ugly PHP.

Changaco commented 7 years ago

La nécessité de pouvoir corriger un ancien commit a été expliquée tout à l'heure par @Seb35.

Un diff n'est pas une opération très coûteuse, l'implémentation de MediaWiki est probablement bien suffisante. (Par ailleurs je ne suis pas convaincu que Git soit plus efficace pour calculer un diff entre deux versions non-adjacentes, car il doit d'abord reconstruire l'ancienne version, mais bon on s'éloigne du sujet.)

Seb35 commented 7 years ago

@fgallaire @Changaco Cas existants de modifications que j’ai recensé :

Changaco commented 7 years ago

(Je rappelle qu'un des sens du nom "Git" est "stupide", et que ce n'est pas un hasard. C'est loin d'être un gestionnaire de version idéal même s'il est beaucoup mieux que ceux qui l'ont précédé. Pour le futur il y a le projet Pijul qui est potentiellement prometteur.)

Seb35 commented 7 years ago

Sur les histoires de stockage, Git comme MediaWiki stockent les textes entiers (cf Git internal), et tous les deux recréent les diffs à la volée. Bien sûr, les deux utilisent la compression, soit en interne pour Git, soit via MySQL pour MediaWiki.

Si on compare les deux :

Après, chacun a ses finalités, ses cas d’usage, etc. donc on peut tout à fait préférer l’un ou l’autre, et trouver qu’un usage est meilleur sur l’une ou l’autre plateforme.

Changaco commented 7 years ago

C'est vrai que MediaWiki a aussi des limites (par exemple je ne crois pas qu'il sache faire un diff sur plusieurs pages en même temps, or on ne peut pas mettre tout un Code dans une seule page). Je ne dis pas que c'est l'outil parfait, juste que dans ceux existants il me semble être meilleur que Git si le but est d'avoir une alternative basique à Légifrance qui permette de visualiser les différences entre versions.

Ceci dit je pense qu'il vaut mieux construire ses propres outils que d'essayer de détourner un existant jusqu'à l'absurde, donc comme MediaWiki et Git semblent tous deux inadaptés j'opterais plutôt pour des solutions maison.

Changaco commented 7 years ago

Sur les histoires de stockage, Git comme MediaWiki stockent les textes entiers (cf Git internal)

Le lien que tu donnes n'explique que le fonctionnement basique de Git, la vraie "magie" est dans les Git Packfiles.

fgallaire commented 7 years ago

https://lwn.net/Articles/131657/

Seb35 commented 6 years ago

Cette issue est en passe d’être résolue. Plusieurs alignements sont en passe de prendre effet pour rendre cette production possible (110k textes dans la base LEGI, 45% d’arrêtés, 45% de décrets) :

fenollp commented 6 years ago

La version gratuite et hosted de gitlab donne 2000 minutes de CI par mois, un cron et un cache. Pourquoi partir sur une solution qui nécessite de provisionner des VM, de payer le service et de faire du Ops ? En plus, avoir une conf de CI publique permet à tout un chacun de comprendre et reproduire la compilation des codes.

Seb35 commented 6 years ago

Je crois pas trop aux trucs magiques "qui marchent tout seuls", il faut de toutes façons toujours faire de la config et des scripts. Pour l’instant, on est parti là-dessus parce qu’il faut avancer ; si tu veux proposer des PR pour des déploiements CI ou ailleurs, n’hésites pas.

Seb35 commented 5 years ago

Résolu à 99,05 % = 104/105, tous les codes tournent quotidiennement depuis une semaine sur https://archeo-lex.fr et fonctionnent à part le code des communes (ça se voit pas sur l’interface web, mais lors de la màj 14/09 -> 19/10 il était en erreur, j’avais fait en sorte que ça affiche l’erreur, mais du fait qu’il n’a pas été mis à jour depuis le 19/10 l’erreur a été effacée).

Seb35 commented 5 years ago

Bon, c’est résolu à 100 %. Tous les codes sont disponibles quotidiennement sur https://archeo-lex.fr.