Bonjour
,
Vous avez peut-être remarqué que Setup ne bouge pas beaucoup depuis quelques jours, depuis la Noël environ. C'est tout à fait normal et le développement continue tout aussi rapidement. Simplement, ce développement n'est pas encore du code.
Setup dispose de deux «killer features», des fonctionnalités qui font que Logram l'utilise, pas Pacman, pas APT, pas RPM, mais bien Setup et toujours Setup :
- La base de donnée binaire, dont le format facilite tellement les choses que la partie «gestion des paquets» proprement dite ne fait que 1000 lignes, plus quelques centaines pour remplir cette base, alors que les autres gestionnaires de paquets ont facilement 10 000 lignes ou plus dédiées à cette gestion. Son temps d'accès O(1) est également un très fort attout, lançant la tant attendue «informatique sans délai», promise depuis si longtemps, au fur et à mesure que les ordinateurs accélèrent.
- Le solveur de dépendances, utilisant un système d'arbres et de branches. Aidé par la base de donnée binaire, il résoud les dépendances en consommant très peu de mémoire, très rapidement, et fournit la liste des solutions possibles.
Dans quelques jours, ou dans quelques semaines, une nouvelle fonctionnalité s'ajoutera à la liste : les delta packages.
Les Paquets Deltas
Ce type de paquet contient les différences entre la version A et la version A+1 d'un paquet. Il permet à l'utilisateur de ne pas avoir à télécharger un énorme fichier, et permet à Logram de mettre à jour les paquets bien plus souvent, en générant moins de traffic sur le web, donc en utilisant au mieux cette bande passante (téléchargement des LiveCD plus rapides, meilleure navigation sur le site web, etc).
Le format de ces paquets «delta» est déjà fixé, et tout est déjà bien avancé. Ces paquets seront une simple archive .tar.xz, d'extension .dpk (Delta PacKage), et contiendront un arbre Linux (/bin, /usr, etc). Cet arbre sera remplit de fichiers deltas ou normaux :
- Si un fichier n'a pas été modifié entre la version A et la version A+1 du paquet, alors il ne se trouve pas dans l'archive.
- Si un fichier a été ajouté entre A et A+1, son contenu se trouve dans l'archive
- Si un fichier a été modifié, alors seule la différence est stockée
- Si un fichier a été supprimé, rien ne se trouve dans l'archive.
Un fichier deltapackage.list se trouvera à la racine de cette archive, et contiendra quelques métadonnées, comme la liste des fichiers (tel fichier est nouveau, tel fichier est modifié, tel fichier est supprimé). Ainsi, on pourra savoir avec précision quels sont les changements entre deux versions, quels fichiers patcher, etc.
Toute la difficulté, l'algorithme de diff
Le fichier de type «différences entre deux fichiers» est le plus compliqué. Il existe pas mal de programmes permettant de créer ces patches, et de les appliquer, mais ils ne sont pas tous aussi efficaces qu'ils ne le devraient.
Le plus efficace, pour l'instant, est bsdiff, qui génère de très petits patches. Malheureusement, l'application du patch est lente et consomme beaucoup de mémoire.
Courgette, créé par Google, ne peut servir que pour les éxécutables et nécessite un ré-assemblage. Immensément trop lent et trop peu portable pour une distribution comme Logram.
xdelta et les autres ne sont pas assez efficaces, même s'ils sont plus rapides que bsdiff.
Les quelques recherches sur le sujet que j'ai faites sont très prometteuses, car voici le menu :
- Format de diff compact et bien compressable (un diff non-compressé peut être gros, mais un petit tour de XZ le réduit largement)
- Application du patch hyper rapide. bsdiff patche un fichier en O(n+m), ou n est la taille de l'ancien fichier, et m la taille du nouveau. Mon algo applique le patch en O(d), où d est la taille du patch. Bien plus rapide. Il consomme aussi O(1) octets en mémoire, c'est à dire toujours la même chose quelque soit la taille du patch, alors que bsdiff nécessite n+m+O(1) octets, à nouveau avec n et m la taille des fichiers.
- Les algos de diffs utilisés ont un petit problème avec les fichiers contenant beaucoup de différences. En effet, ils utilisent un système d'insertion et de suppression. Setup utilisera des insertions, suppressions et opérations mathématiques. Ainsi, au lieu d'avoir par exemple -3+abc pour changer bca en abc, ce qui prend 5 octets, le patch contiendra :xyz, où x sont des octets tel que b+x = a, c+y = b et a+z = c. C'est possible car l'arithmétique de nos ordinateurs fonctionne par excès (255+1 = 0). Je sais que c'est une bonne technique car elle se trouve dans la thèse du créateur de bsdiff, ici, en bas de la page
- Utilisation d'un certain procédé que je ne dévoilerai pas ici avant quelques tests et, si c'est révolutionnaire, le nécessaire pour éviter qu'un brevet ne soit déposé dessus. En effet, le web a des oreilles
.
Grâce à ce dernier procédé, que je ne révèle pas (quelques jours de Googlage vous le donnent), au format utilisé, et un peu de chance, Setup risque bien de produire non-pas des diffs plus petits que la concurrence, mais bien les plus petits diffs possibles. L'algo n'est pas trop trop compliqué, mais utilise uniquement des opérations rapides, et exactes (alors que les autres éliminent des données quand elles ne leur plaisent pas).
Setup Diff + XZ risque bien d'être très léger. Pour le moment, un diff de 17 octets permet de passer de la première de ces chaînes à la deuxième :
- Bonjour, je suis un tres joli fichier, vraiment super joli
!
- Bonjour, je suis un joli fichier, vraiment super super joli ^^' !!
Ok, c'est léger, mais bon, c'est un diff fait main aussi
(oui, l'appliqueur est déjà fait).
Donc, en clair, ça va prendre pas mal de temps. J'ai déjà trouvé quels algos je vais utiliser, comment les utiliser, mais je dois encore arranger certains soucis techniques, pour que ce soit suffisemment rapide pour gérer une dizaine de diffs par paquets (histoire qu'avec un diff, on puisse passer de la version A à A+3, si jamais on a pris du retard dans les mises à jour).