Journal “indexer, choisir et copier des fichiers” version Beta

Posté par . Licence CC by-sa
Tags : aucun
7
25
nov.
2013

Sommaire

“index” vient de sortir en version Beta. Il s’agit d’un logiciel pour faciliter le choix, et la copie parmi un grand nombre de fichier, sur un grand nombre de supports différents.

“Mais pourquoi”

Le problème s’est posé, quand des personnes voulaient partager des fichiers. Souvent, un seul disque amovible ne permet pas de récupérer tous les fichiers disponibles.

Il faut donc faire un choix.

Le besoin est un outil, qui créé une base de donnée de fichiers. Cette base est distribuée aux amis. L’outil permet de choisir des fichiers, et de calculer la place totale nécessaire à la copie. Cette liste de choix est donné, pour effectuer le transfert.

Les amis n’étant pas tous parfait, une version Windows est nécessaire. Avoir une GUI semble trop compliquée, autant commencer par un outil en ligne de commande (CLI). Mais un outil CLI pour des windosiens, cela ne va pas être possible.

Comment ?

Il fallait un outil simple, plus il serait simple, plus il serait utilisable, et utilisé (et facile à tester). Un éclair de lucidité a permis de se rendre compte, que la phase importante de choix, ressemblait beaucoup à l’utilisation d’un navigateur de fichier. Il faut pouvoir utiliser celui de l’OS.

Pour cela, chaque fichier serait représenté par un fichier plus petit (sinon cela ne sert à rien), contenant une référence vers le fichier d’origine : les fichiers d’index.

La norme universelle, qui définit une référence vers un fichier, semble être le lien “magnet” ( http://fr.wikipedia.org/wiki/Magnet_%28standard%29 ). Cela permettrait d’inclure un hash du fichier, qui peut aussi servir pour les système comme bittorrent, en plus d’un path. Cela permettrait de faire la liaison avec Internet.

Dans un premier temps, seul le path complet est utile pour la copie. La lecture d’un lien “magnet” ne semble pas simple, il existe des ambiguïtés dans la norme (encore une histoire de mélange de data et de contrôle dans le même flux, de mémoire). De plus, générer un hash pour plusieurs Go de fichier, prendrait des heures. Exit le lien magnet, et vive la simplicité : un path par ligne (avec un éventuel ‘\n’ encodé).

L’outil a 3 tâches à effectuer, cela veut dire des binaires différents, ou un jeu d’option. Or on peut lancer un binaire sous Windows, par un double clic dans le navigateur de fichier. Cela lance une console, qui se referme aussitôt. Pour en lire le contenu, il faut lancer un script “.bat”, qui contient une commande “pause”, après la commande “index”. La console reste ouverte, et attend l’appuie sur une touche.

Un moyen d’avoir une GUI sous Windows existe, si l’outil se contente d’un double clic sur un exécutable. Plus tard, on peut imaginer inclure l’outil dans le menu du clic droit, ou dans ultracopier. On ne peut pas avoir plus simple. Ou presque.

Finalement

On peut faire en sorte que toutes les tâches s'enchaînent : en créant la liste d’index dans un répertoire spécifique, puis en cherchant des fichiers d’index autour, qui sont remplacés par le fichier d’origine. Si les fichiers d’origines ne sont pas trouvés, on cumule les tailles pour avoir une idée de la place nécessaire. Et on évite la bêtise d’indexer les fichiers d’index.

Au premier lancement, seul la liste est créée. Celle-ci est à donner aux amis. Ils copies/collent les fichiers indexes, en dehors du répertoire “liste” pour faire leur choix. Un (2ième) lancement du logiciel donne la taille totale nécessaire. Ce choix de fichiers est donné à leur propriétaire. Un 3ième lancement du logiciel lancera les transferts.

L’installation du logiciel à la racine du répertoire à indexer, est nécessaire sous Windows, pour savoir qu’il faut indexer le répertoire courant (si on veut éviter la ligne de commande). Sous Linux, les options de montages peuvent interdire l’exécution de programme depuis un disque externe. Pas de bol. Il faudra fournir le path de la base de fichier à indexer, en option. Et copier l'exécutable ailleurs. Ou attendre l’intégration dans les distributions.

Technique

Concernant le langage de programmation, OCaml permet de faire rapidement un outil sans bug stupide. Je n’avais pas envie de passer mon temps à faire des tests, pour comprendre les exceptions runtime. OCaml attrape ce genre de problème à la compilation.

OCaml permet de créer, et de traiter des arbres de données de façon très simple. Une manière d’éviter les bug, est d’avoir une structure de données qui correspond exactement au besoin de l’étape de traitement suivante. Ainsi, une structure incomplète ou fausse ne compile pas. Se “traîner le monde” dans une structure gigantesque est très tentant, mais on s’y perd bien trop facilement : Si on la modifie, à quel moment, telle valeur est à jour ? 2 valeurs se ressemblent beaucoup, laquelle est la bonne ?

Les étapes de transformations intermédiaires sont plus simples, car les données sont plus petites. Traiter 2 arbres en même temps peut être pénible pour le cerveau (très très pénible).

Le code est peut être un peu plus lent, car plus de données sont explicitement créées. Mais les arbres suivants sont souvent plus petits (meilleur localité de cache), et donc plus rapide à traverser, ce qui augmente la vitesse du code avale.

Et dans mon cas, ce sont les appels systèmes qui sont lent.

Format de fichier durable

Un format de fichier est une chose à ne pas rater, gérer les évolutions et la rétro compatibilité pouvant être “pénible”. Dans un protocole de communication CCSDS, un nombre magique était utilisé, le champs suivant était une taille de paquet qui permettait de trouver son CRC.

Le problème est d’identifier le paquet entier, et non un bout de paquet légitime quelconque. Un nombre de n bit a une probabilité d’apparition de 1/2n multiplié par la taille des données, ce qui rend la probabilité de collision de plus en plus faible avec n, surtout si il y a un CRC à vérifier ensuite.

Un fichier a un début, cela facilite beaucoup de chose. Le hash prend du temps. Le problème est également de définitivement faire la différence entre une donnée, et les métadonnées. XML gère cela parfaitement, mais c’est un peu l’arme atomique, ses radiations sont nocives.

Le concept est d’utiliser des couches pour offrir des garanties “définitives”. Par exemple, une string avec n’importe quel caractère doit pouvoir être écrit et relu sans souci (même avec ‘<’ ‘\n’, ‘&’ ‘?’,…). Le choix a été fait de mettre une donné par ligne, c’est réellement humainement lisible. En cas de ‘\n’ dans la donné, elle est encodé en ‘#n’, et ‘#’ en ‘##’. De plus, c’est assez rare dans un path.

Un code fixe permet d’identifier le type de fichier, et un numéro de version permet de gérer une future évolution.

Vie privée

Les fichiers contiennent des paths entiers. Les utilisateurs doivent faire attention de ne pas laisser filer d’information par cet intermédiaire. Les fichiers ne sont pas compressés individuellement pour pouvoir lire facilement ce qui est exporté.

Malware ?

Le logiciel se distribue lui-même, car il est présent sur les supports mobiles pour faciliter l’usage sous Windows. Il y a donc un problème potentiel de virus ou de malware.

Pour éviter cela, il n’existe pas beaucoup de solution. Celle en béton implique une signature cryptographique des exécutables, mais cela implique donc de gérer une clef, dont la perte serait plus que gênante.

La distribution du hash SHA des binaires permet de limiter les problèmes, pour une même version de l’outil, le hash doit être le même partout. Bien sûr, il ne faut pas qu’il y est trop de version en circulation, cela diminuerait la possibilité de vérification croisée.

Avec une diffusion “officielle” publique sur le web, c’est encore plus simple.

Premier tests

Index a bénéficié des techniques de développement de l'aéronautique. Enfin, d’une.

Une option (cachée) permet de faire un ‘dump’ des structures de données internes. C’est ainsi plus simple de détecter les étapes ayant une erreur, et de faire de la non régression avec des diff de fichier. Oui, cela ressemble à du debug avec printf(), sauf que les printf() restent dans le binaire finale, et ils sont écrit une fois pour toute. C’est le top de la faignantise de codeur. En plus, cela colle bien avec l’idée d’avoir des séries d’arbres “minimaux”.

Exemple (“console shot“ sous Linux)

La page d’aide s’ouvre avec ‘-h’:

[alice@localhost CORSAIR16GB]$ index -h
index V0.4.48
usage : index [--lowmem] [root path]
‘/media/CORSAIR16GB' file directory are read.
Index file listing 'list/' are created or updated.
Index file not present in the 'list/' directory are replaced by the file they point to if possible.
The size of none replaced index file are printed.
The indexes should be copied, with this executable.

Indexation des fichiers :

[alice@localhost CORSAIR16GB]$ index
index V0.4.48
The base directory is '/media/CORSAIR16GB'.
The directory '/media/CORSAIR16GB/list' will be the index directory.
81 files have been scanned.
81 new index have been created in the index directory.
0 have been updated.
81 files are in base directory.
0 files to be copied in the base directory :
0 files have been effectively copied.
There is 0 byte ( 0.00 MiB ) of 0 unreplaced .idx file(s) by the original.
Elapsed time : 0.05 s, since the begining.
[alice@localhost CORSAIR16GB]$ cd ../S8GB
[alice@localhost S8GB]$ index
index V0.4.48
The base directory is '/media/S8GB'.
The directory '/media/S8GB/list' will be the index directory.
61 files have been scanned.
61 new index have been created in the index directory.
0 have been updated.
61 files are in base directory.
0 files to be copied in the base directory :
0 files have been effectively copied.
There is 0 byte ( 0.00 MiB ) of 0 unreplaced .idx file(s) by the original.
Elapsed time : 0.04 s, since the begining.
[alice@localhost S8GB]$ cp -rp list/* ~/index_list/S8GB/
[alice@localhost S8GB]$ cp -rp ../CORSAIR16GB/list/* ~/index_list/CORSAIR16GB/
[alice@localhost S8GB]$ cp -rp ~/index_list ../HPW4/list/

La clef usb HPW4 est ensuite donné à Bob, la liste est récupérée sur un disque mobile.

[bob@desktop HPW4]$ cp -rp ./list/* ../WD2T/list/; cd ../WD2T/

Bob choisit les fichiers. 2 ici. Il vérifie la taille nécessaire à leur future copie.

[bob@desktop WD2T]$ cp list/index_list/fichier1.idx .
[bob@desktop WD2T]$ cp list/index_list/fichier2.idx .
[bob@desktop WD2T]$ index
index V0.4.48
The base directory is '/media/WD2T'.
The directory '/media/WD2T/list' will be the index directory.
143 files have been scanned.
0 new index have been created in the index directory.
0 have been updated.
2 files are in base directory.
2 files to be copied in the base directory :
File not found fichier1  64419
File not found fichier2  64419
0 files have been effectively copied.
There is 128838 byte ( 0.12 MiB ) of 2 unreplaced .idx file(s) by the original.
Elapsed time : 0.00 s, since the begining.

Bob rend la clef usb HPW4, et son disque dur WD2T à Alice. Alice branche WD2T, S8GB et CORSAIR16GB sur son ordinateur.

[alice@localhost WD2T]$ index
index V0.4.48
The base directory is '/media/WD2T'.
The directory '/media/WD2T/list' will be the index directory.
143 files have been scanned.
0 new index have been created in the index directory.
0 have been updated.
2 files are in base directory.
2 files to be copied in the base directory :
filer1_1_1_1_1.jpg
filer1_1_1_1_2.jpg
2 files have been effectively copied.
There is 0 byte ( 0.00 MiB ) of 0 unreplaced .idx file(s) by the original.
Elapsed time : 0.01 s, since the begining.

Les 2 fichiers ont été copié. Un nouveau lancement montre qu’il n’y a plus rien à faire.

[alice@localhost WD2T]$ index
index V0.4.48
The base directory is '/media/WD2T'.
The directory '/media/WD2T/list' will be the index directory.
145 files have been scanned.
0 new index have been created in the index directory.
0 have been updated.
2 files are in base directory.
0 files to be copied in the base directory :
0 files have been effectively copied.
There is 0 byte ( 0.00 MiB ) of 0 unreplaced .idx file(s) by the original.
Elapsed time : 0.00 s, since the begining.

Alice peut rendre son disque WD2T à Bob contenant les fichiers.

Performance

Les première versions de l’outil était lent. Les fichiers d’index portaient exactement le même nom, que les fichiers d’origines. Pour les reconnaître, il fallait lire leur entête. Indexer 30 000 fichiers impliquait de les ouvrir tous, pour vérifier si il s’agissait d’index à remplacer. Ouvrir un fichier est trop long. Rajouter l’extension .idx, permet de n’avoir à ouvrir que les fichiers ayant cette extension. C’est beaucoup plus rapide.

Ocaml ne permet pas vraiment de réutiliser la mémoire pour parser un fichier (sauf si on réécrit les fonction de parsing en utilisant le type buffer). Il y a obligation de passer par une string, qui est difficilement réutilisable. 30 000 fois quelques Ko, cela peut faire beaucoup. Jouer avec le garbage collector, permet de réduire son nombre d’appel, cela va plus vite, mais cela consomme beaucoup plus de mémoire (15% plus rapide, 8x plus de mémoire, mais 300 Mo, cela va encore).

Une chose intéressante : un flush() de stdout pour afficher (trop souvent, à chaque bloc de 15 Mo, soit ~10x par seconde pour 100 Mo/s), l’évolution de la taille du fichier copié, pouvait faire perdre jusqu’à 20% de vitesse de copie sur un SSD. La mise à jour a donc lieu moins souvent.

Au final, indexer 30000 fichiers prend quelques secondes sur un SSD, mais avec un cpu Atom. La taille des fichiers n’importe pas. Avec un disque USB, c’est l’USB, qui est un peu limitant.

Découvertes

http://semver.org/ décrit une manière de faire des numéro de version x.y.z. ‘Z’ est un numéro de patch, ‘y’ rajoute des fonctionnalités, mais reste compatible, ‘x’ est un incrément majeur qui indique une absence de retrocompatibilité. Le système de build de ‘index’ incrémente automatiquement ‘z’, cela va sans doute un peu trop vite, mais cela évite les oublie. Les versions windows et linux n’ont pas exactement la même version, pour cette raison.

Indexer la racine d’un disque mobile sous Windows amène à indexer le répertoire $RECYCLE.BIN, qui est la corbeille, après quelques essais, celle-ci est pleine de fichiers .idx qui sont remplacés par le fichier d’origine ! ‘index’ ne parcourt donc plus ce répertoire.

Fonctionnalités en plus

Le path sous Linux utilise le nom de volume du disque mobile. Windows prend la première lettre disponible. Si on branche plusieurs disques, la lettre change. Index recherche donc à retrouver le bon disque pour les transferts, cela permet de cumuler les disques, même dans le désordre. Cela marche beaucoup moins lentement, que je l’aurais pensé.

En cas d’interruption et de relance, la copie est continué et non écrasé.

Effets secondaires

Comme l’identification du fichier est son path, son nom, et non son contenu (comme avec un hash), celui-ci peut changer. Seul la taille sera fausse. Cela peut être utile pour faire des transferts récurrents, ou un outil de sauvegarde simple.

Le programme permet aussi de gérer le contenu de plusieurs disques de façon plus simple, qu’avec des déplacements de fichiers. On gère un ensemble de fichier et non un fichier à la fois. Cela aide pour les re-répartir.

Bug connu

Il y a un bug sous Windows XP, quand un fichier n’est pas trouvé pour une copie, une erreur est remontée, au lieu de simplement cumuler la taille des fichiers. Je n’ai pas encore d’XP sous la main, pour le reproduire.

Beta

Maintenant, le plus dur reste à faire, pour que cet outil ai une utilité : avoir des utilisateurs.

J’attends vos retours !

github https://github.com/nicolasboulay/index/
manuel https://github.com/nicolasboulay/index/blob/master/README.txt
installation https://github.com/nicolasboulay/index/releases/tag/V0.4.52
package https://github.com/nicolasboulay/index/releases/download/V0.4.52/index.tar.gz

  • # Quelques remarques

    Posté par . Évalué à 10.

    On sent que cet outil à été développé pour répondre à un besoin précis… Cependant ce journal et la page github peinent à expliquer clairement son fonctionnement et surtout à le "vendre". Je ne vois pas dans quelles circonstances je pourrais avoir besoin de ce système de copie en 2 étapes. En outre, utiliser un mot anglais très courant pour nommer l'outil ne risque-t-il pas de rendre le programme difficile à trouver via un moteur de recherche ? C'est dommage car on sent de gros efforts et du temps investi.

    • [^] # Re: Quelques remarques

      Posté par . Évalué à 3.

      Je sais que malgré le fait qu'il n'y ai pas d'option, le soft semble compliqué à comprendre. Mais même avec ce long commentaire, et le "manuel" du logiciel, c'est toujours incompréhensible ?

      "La première sécurité est la liberté"

      • [^] # Re: Quelques remarques

        Posté par (page perso) . Évalué à 4. Dernière modification le 26/11/13 à 09:56.

        La remarque d'AP sur le nom est vraiment importante, d'autant que tu te sers du nom propre du soft "index" comme nom commun dans les messages, d'où une surcharge sémantique (un mot qui désigne >1 choses) qui pour le dire gentiment, est d'une utilité toute relative dans la démarche d’appréhension de l'outil par l'utilisateur (qu'aucun moteur de recherche ne pourra aider sans circonvolutions pénibles) :)

        Par ailleurs il y a des fautes de style et / ou de pluriel dans tes messages : juste un exemple, déclinable :

        ‘/media/CORSAIR16GB' file directory are read.
        (…)
        Index file listing 'list/' are created or updated.

        C'est quoi un "file directory" ? Il y en a combien ? Si un seul, alors "is read". Note que tu peux éviter ce genre d'impair en utilisant le style concis nnn file(s) read ou le participe présent reading nnn files (mais avant l'action).

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 3.

          J'avoue avoir réécrit tellement de fois ces messages, que j'avais un peu laissé tombé, surtout que cela me cassait mes testes.

          Mais je prends note.

          Le nom était volontairement passe partout au début. Mais c'est vrai que c'est maintenant un handicap.

          "La première sécurité est la liberté"

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 2.

          tu en as trouver d'autre de ce genre de problème .

          "La première sécurité est la liberté"

    • [^] # Re: Quelques remarques

      Posté par (page perso) . Évalué à 3.

      Ça semble intéressant, mais difficilement compréhensible.

      Je pense qu'une relecture de ce journal avant de le poster aurait été judicieux, et cela aurait permis d'alléger certaines phrases. La ponctuation est aussi surprenante (je pense aux « xxx, est yyy » par exemple).

      C'est peut-être un cliché, mais quand je vois une description comme celle-ci, j'ai tendance à penser que le code puisse être écrit de la même manière, et ça ne me rassure pas sur ce logiciel. Cependant, j'avoue ne pas avoir regardé le code : ce n'est qu'une impression.

      • [^] # Re: Quelques remarques

        Posté par . Évalué à 1.

        Le texte a été relu des centaines de fois mais bon :) Je ne sais pas si tu écris souvent des textes de cette longueurs, mais c'est impossible autrement.

        "La première sécurité est la liberté"

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 3.

          Faut le faire relire par quelqu'un d'autre, parce que là clairement le lire des centaines de fois toi même c'est du temps perdu.

          • [^] # Re: Quelques remarques

            Posté par . Évalué à 1.

            Cela a été fait aussi. Mais au bout d'un moment, le temps passé ne vaut plus l'amélioration espéré (genre le-mieux-est-l-ennemi-du-bien).

            "La première sécurité est la liberté"

            • [^] # Re: Quelques remarques

              Posté par . Évalué à 3.

              Quand je dis relecture, c'est pas uniquement l'orthographe, c'est aussi demander à quelqu'un qui connait pas si il y pige un minimum quand même.

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 4.

          En fait je trouve qu'on sent bien la présence partout de justification des choix, tu fais de la recherche et tu écris des articles non ?
          Peut-être que c'est pour ça que le gens trouvent ça un peu lourd (genre la partie qui explique cette histoire de GUI n'est pas de première importance au début, mais peut intéresser des gens, celle qui explique pourquoi Ocaml non plus (même si je suis de tout cœur avec toi et que ça mérite d’être dit : avec caml, quand ça compile, ça marche !), celle sur le débug, et ainsi de suite).

          En séparant présentation de l'outil, cas d'utilisations, et justification de certains choix (dans une FAQ, ou à la fin comme pour les autres trucs) auraient peut-être rendu les choses un brin plus légères.

          Je suis pas totalement sur d'avoir compris dans quelle situation l'outil vaut le coup d’être utilisé, mais je crois que l'exemple m'en a donné un aperçu, maintenant il va falloir que j'y réfléchisse pour être sur ;)
          Le mieux c'est de montrer au lecteur le cas particulier où sans l'outil, il est dans la merde !

          • [^] # Re: Quelques remarques

            Posté par . Évalué à 5.

            c'est juste,
            Et tu peux aussi supprimer la partie sur les liens magnets, perso j'ai cliqué sur wikipedia, j'ai lu de quoi il s'agissait (p2p etc…) tout ca pour apprendre que finalement non tu ne l'utiliserai pas, du coups le peer-to-peer restait dans mon espris, je ne sais même pas si tu en garde une morceau d'infra, bref… oui j'ai arreté peu aprés.

            domage, je n'ai pas été perceverant.
            Bref, la plupart du temps, on s'en fout du pourquoi.

            • [^] # Re: Quelques remarques

              Posté par . Évalué à 1.

              J'aurais dû mettre les lien à la fin. En général, je lis les liens ouvert, une fois que j'ai fini un article.

              "La première sécurité est la liberté"

          • [^] # Re: Quelques remarques

            Posté par . Évalué à 3.

            " tu fais de la recherche et tu écris des articles non ?"

            Je ne fais pas de la recherche, mais j'ai déjà publié une quinzaine d'article. Ici, l'idée était de faire une présentation de la démarche qui a abouti au résultat actuel. Je pense que cela pouvait intéresser plus de monde, qu'une simple présentation de l'outil final.

            "La première sécurité est la liberté"

            • [^] # Re: Quelques remarques

              Posté par . Évalué à 2.

              Hehe, ça se voit direct ;)

              Ne me méprend pas, tu as bien fait d'expliquer, je pense que plein de monde trouve ça intéressant, mais c'est surtout une histoire de forme, et comme toujours les râleurs sont ceux qu'on entend le plus :P

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 10.

          Ça y est, j'ai compris : c'est utile pour éviter à Alice de filer tout son disque dur à Bob (surtout si il est interne à une machine) mais en:
          1) lui donnant facilement accès à la liste des fichiers qu'elle a (et vite, sur une petite clef usb par ex)
          2) lui donnant facilement la possibilité de choisir les fichiers
          3) et en ayant facilement la possibilité de copier ces fichiers sur le disque dur de Bob (parce que Alice elle a pas que ça a foutre de copier les fichiers un par un en les cherchant dans son énorme arborescence).

          Ça arrive effectivement souvent comme situation, typiquement au boulot, pour s'échanger des films de vacances.

          Ça fait penser un peu au listings de fichier que les gens s'échanger sur IRC à l'époque, mais avec de quoi faire la sélection et la copie.

          • [^] # Re: Quelques remarques

            Posté par . Évalué à 1.

            C'est ça. Au début, je voulais faire un réseau social pair à pair de main à la main. Je n'ai gardé que le coté novateur de l'échange de la main à la main.

            "La première sécurité est la liberté"

        • [^] # Re: Quelques remarques

          Posté par . Évalué à 2.

          Faut le faire relire, l'ami! :)
          Mais ce qui m'agace et ce n'est pas pour faire le sectaire, c'est que la moitié* du texte parle de l'implémentation et des problèmatiques sur Windows XP dont on se fout en fait.

          Je ne conteste pas la légitimité de ce logiciel libre, de ce que j'ai difficilement compris il y a des bonnes choses, mais je n'arrive pas à me figurer l'usage.

          • [^] # Re: Quelques remarques

            Posté par . Évalué à 2.

            Je parle plus du processus de création que du logiciel lui-même, un peu plus haut victor semble avoir très bien compris l'usage.

            "La première sécurité est la liberté"

  • # la roue ça servait à quoi déjà ?

    Posté par . Évalué à 7. Dernière modification le 27/11/13 à 23:08.

    Péniblement je crois que j'ai compris le besoin qui est visé.

    Alice : "Salut Bob, tu m'avais pas dit que tu avec 'telle saison de telle série tv', 'tel album de tel groupe' et 'tel film' sur ton NAS chez toi ?"
    Bob : "Si, c'est un peu gros pour que je te l'envoi par le net, passe à la maison avec un disque dur, je te les filerai"
    Quelque jour plus tard, Alice arrive chez Bob.
    Bob : "ça copie, il reste encore un peu de place sur ton disque, tu veux quoi ?"
    Alice : "attends, je regarde… ça et ça".
    Bob : "voilà, c'est fait"
    Alice : "Merci"

    J'ai l'impression que c'est un peu le cas nominal et à part un logiciel de copie de fichiers quand tu es sous un OS bancal, je ne vois pas trop de quoi on a besoin en plus.

    J'avais un pote qui tenait à jour la liste de ses films et de ses musiques dans une spreadsheet et qui la filait à la demande. Si en plus tu mets la taille dans une colonne, il ne faut guère plus qu'une formule dans Calc pour connaître la taille du disque à prévoir.

    Tout ça pour dire que je ne suis pas convaincu du besoin d'automatiser autant cette tâche qui au final se fait une fois de temps en temps entre potes.

    Si vraiment, tu veux industrialiser: Bob fait un

    find /path/to/my/collection -type f -name "*.avi" -or -name "*.mp?" -printf "%p\t%k\n" > /tmp/collection.csv
    

    Il envoie le fichier à Alice.
    Alice ouvre ça avec Calc. C'est dispo sous plein d'OS. Elle met des croix devant les fichiers qu'elle veut. Une formule "somme.si" calcule la taille totale.
    Alice va voir Bob avec le fichier et un disque dur.
    Bob extrait les lignes avec une croix et passe ça à "cp".
    Ils ont le temps de prendre le thé et plus si affinité.
    Et Alice repart, comblée.

    Enfin, comme d'autre, je tique aussi sur le nom qui ne dit absolument rien sur l'usage. "HereItIsDude" aurait au moins le mérite d'être marrant.

    Et pour finir sur une note plus positive : tu sembles t'être bien gratté la tête et tu proposes une restitution à la communauté, c'est appréciable. Et OCalm permet de faire des vraies choses, je ne le savais pas et c'est un tort. Merci de m'en avoir faire prendre conscience.

    • [^] # Re: la roue ça servait à quoi déjà ?

      Posté par . Évalué à 3.

      Pas la peine d'essayer de me prouver que l'on peut faire les choses autrement, c'est enfoncer une porte ouverte.

      Mais une ligne de commande comme :
      find /path/to/my/collection -type f -name "*.avi" -or -name "*.mp?" -printf "%p\t%k\n" > /tmp/collection.csv
      Ne fait pas parti de ce que j'appelle une interface simple.

      "J'ai l'impression que c'est un peu le cas nominal "

      Non, ce n'est pas le cas nominal. En général, tu as un paquet de cas ou tu ne te pointes pas chez les gens pour faire une copie. Ensuite, selon la taille des fichiers, on peut lancer tout en parallèle, et cela rallonge le temps global de copie, ou attendre entre chaque copie, ce qui est casse-pied.

      "La première sécurité est la liberté"

      • [^] # Re: la roue ça servait à quoi déjà ?

        Posté par . Évalué à 3. Dernière modification le 28/11/13 à 15:57.

        c'est enfoncer une porte ouverte.

        C'est pas moi qui ai commencé. Et puis merci pour ce genre de remarque constructive, c'est toujours agréable.

        Je n'ai pas prouvé qu'on pouvait faire autrement. J'ai prouvé qu'on pouvait faire simple avec ce qu'on avait déjà.

        une ligne de commande comme … Ne fait pas parti de ce que j'appelle une interface simple

        A quoi je répondrais :
        1/ Moi si.
        2/ La ligne de commande, ce n'est que pour Bob. Bob, si il a une bonne collection à partager, est un utilisateur un peu avancé (bittorrent et tout). Tu as aussi dû oublier que tu es sur linuxfr.org et que la ligne de commande n'est pas une insulte ici. Quant à Alice, un simple tableur lui suffit plutôt que de naviguer dans une arborescence comme dans ta solution.
        3/ Tu n'as pas démontré dans ton journal que l'interface de ton outil était simple. Il y a quand même 19 paragraphe dans ce journal pour tenter d'expliquer son fonctionnement. J'ai un find dont je donné la commande exacte et un tableur. Fais mieux.

        • [^] # Re: la roue ça servait à quoi déjà ?

          Posté par . Évalué à -1.

          "Et puis merci pour ce genre de remarque constructive, c'est toujours agréable."

          C'est toi qui a commencé sur ce ton, pourquoi tu t'étonnes que je continue ? (tu parlais de roue, je parle de porte)

          1/ tu n'es pas la cible, ce n'est pas parce qu'un logiciel est expliqué sur linuxfr qu'il n'est utile qu'au gourou
          2/ J'aimerais voir Alice avec un tableur quand il s'agit de gérer plein de série, au lieu de prendre un répertoire. Et puis, je ne comprends pas cette manie d'utiliser un tableur pour faire tout et n'importe quoi, comme de la gestion de base de donné.
          3/ Mes 19 paragraphes étaient pour expliquer le processus de développement du logiciel et pas seulement le logiciel lui-même. Tu fais juste de la mauvaise fois.

          "Fais mieux."

          Pourquoi faire ?

          Créer la liste :
          $ ./index

          Pour faire les copies ?
          $ ./index

          Pour vérifier la taille de la futur copie ?
          $ ./index

          Pour se faire son choix de fichier ?
          $ cp …. # ou un navigateur de fichier

          Cela te suffit ?

          "La première sécurité est la liberté"

          • [^] # Re: la roue ça servait à quoi déjà ?

            Posté par . Évalué à 2. Dernière modification le 28/11/13 à 16:43.

            Pour faire le café : ./index
            C'est génial.

            Mais trêve de plaisanterie. Je ne comprends toujours pas comment tu fais la sélection de fichiers : un treeview avec des cases à cocher ? Tu n'as pas une capture d'écran ?

            Pour se faire son choix de fichier ?
            $ cp

            cp pour faire un choix de fichier ?!?
            cp c'est de la ligne de commande. On m'a soufflé que c'était pas user freindly. Ce que je persiste à contester.

            Et le tableur, c'est comme la ligne de commande, c'est pas tabou. C'est bien adapté à une liste (lignes) et des aspects (colonnes), genre chemin|taille|sélection

            Pour reprendre mon message d'origine, et même si le titre était volontairement corrosif : il est louable d'expliquer la démarche ici mais il ne faut pas sauter les étapes : expliquer le besoin et l'usage. Avant de rentrer dans les détails d'implémentation.

          • [^] # Re: la roue ça servait à quoi déjà ?

            Posté par . Évalué à 3.

            Oh pu$ù$, je crois que je viens de comprendre ton idée.

            Bob génère avec l'outil une copie de l'arborescence complète de sa collection. Dans cette copie, les fichiers sont remplacé par un petit fichier content "path;taille".

            Bob envoi cette arborescence par un moyen qqconque à Alice. Genre un zip (ou tar.gz) dans un mail.

            Alice copie le zip, le décompresse. Elle copie tout ce qu'elle veut dans une autre arborescence à elle, fichier ou répertoire, ailleurs, sur son disque dur portable par exemple. Elle peut tout réorganiser comme elle veut, même renommer les fichiers.

            Alice peut s'assurer de la taille totale des fichiers demandés en lançant l'outil sur son arborescence à elle.

            Quand elle est satisfaite, elle peut soit aller chez Bob avec son disque portable soit envoyer son arborescence à elle dans un zip par mail.

            Bob lance l'outil qui remplace alors tous les petits fichiers par les fichiers d'origine.

            Here it is dude !

            Ouf, ça fait enfin sens.

            Comment l'outil sait si il faut génerer une copie, calculer la taille ou copier les fichiers, ça reste à définir mais c'est du détail.

            Reste une chose, lui trouver un nom.

            • [^] # Re: la roue ça servait à quoi déjà ?

              Posté par . Évalué à 3. Dernière modification le 28/11/13 à 17:33.

              "Comment l'outil sait si il faut génerer une copie, calculer la taille ou copier les fichiers, ça reste à définir mais c'est du détail."

              C'est simple, il le fait à chaque fois dans l'ordre : mettre à jour la liste, détecter les fichiers d'index en dehors de la liste, essayer de faire une copie, donner la taille des fichiers qu'il n'arrive pas à copier.

              Ce qui me fait très peur, c'est que cette démarche est expliquer en détail dans le journal, et encore une fois dans le readme.txt. Et cela n'a pas l'air d'être évident du tout.

              "Reste une chose, lui trouver un nom."

              Si cela gène tellement, je peux utiliser indexFile c'est le mot magique dans les fichiers d'index.

              "La première sécurité est la liberté"

              • [^] # Re: la roue ça servait à quoi déjà ?

                Posté par . Évalué à 2.

                Comme j'aime bien comprendre, j'ai quand même téléchargé l'outil.
                Je l'ai lancé dans une arborescence, il a généré un répertoire "list" avec la même arborescence mais avec des ".idx". Jusque là, comme attendu.
                Après j'ai déplacé le répertoire "list" et l'outil ailleurs. J'ai commencé à bouger les fichiers et répertoires, en supprimer, etc. J'ai relancé l'outil, je pensais avoir la taille de ce que je gardais mais en fait, il a recommencé une création d’arborescence avec le répertoire où je l'avais mis. M'aurai étonné aussi qu'il comprenne ce que je voulais faire sans passer des options ou quelque chose de ce genre.

                J'avais bien compris le principe, mais le fonctionnement, pas encore.

                • [^] # Re: la roue ça servait à quoi déjà ?

                  Posté par . Évalué à 2.

                  Super un utilisateur :)

                  Le problème est que la taille est calculée uniquement pour les fichiers qu'il ne trouve pas. Pour ne pas avoir les copies qui se lancent, il faut renommer, par exemple, le répertoire de base pour qu'il ne puisse pas trouver les fichiers d'origine. Le cas "normal" est de faire un trie, quand les fichiers ne sont pas présent.

                  Je pourrais mettre une option pour désactivé la copie, et calculer uniquement la taille.

                  "La première sécurité est la liberté"

                  • [^] # Re: la roue ça servait à quoi déjà ?

                    Posté par . Évalué à 2.

                    Ça n'empêche qu'il pourrait m'indiquer la taille correspondant à tous les ".idx" même si il trouve les fichiers sources.

                    Là je me suis placé dans le cas où Bob doit copier les fichiers pour Alice : il récupère le répertoire "list" d'Alice et lance l'outil. Le fichiers sources doivent venir remplacer les fichiers "*.idx" dans le répertoire "list". Et en fait non.

                    Définitivement, je ne comprends pas comment sont différenciés les trois cas d'usage : générer l'arborescence idx, calculer la taille cible, réaliser la copie. Dans mon cas, il ne fait que le premier et toujours le premier.

                    • [^] # Re: la roue ça servait à quoi déjà ?

                      Posté par . Évalué à 2.

                      "Ça n'empêche qu'il pourrait m'indiquer la taille correspondant à tous les ".idx" même si il trouve les fichiers sources."

                      Oui, l'un n’empêche pas l'autre.

                      L'outil ne regarde pas le contenu de ./list/. C'est plus simple si tu réfléchis avec des supports amovibles.

                      Bob a donné des fichiers .idx à Alice qui les copient dans le ./list/ de son disque usb. Celle-ci a ensuite transférer les .idx qui l'intéresse, de ./list/ à la racine (n'importe où ailleurs que ./list/). Ensuite, elle passe son disque à bob. Bob lance index à la racine du disque mobile, les fichiers .idx en dehors de ./list sont remplacé par les fichiers d'origines.

                      "générer l'arborescence idx, calculer la taille cible, réaliser la copie. Dans mon cas, il ne fait que le premier et toujours le premier."

                      Il détecte les .idx en dehors de ./list/, et tente de les remplacer par les fichiers d'origine.

                      Si il ne trouve les fichiers, ils additionnent leur taille. Si il les trouve, il les copie.

                      "La première sécurité est la liberté"

                      • [^] # Re: la roue ça servait à quoi déjà ?

                        Posté par . Évalué à 2.

                        en dehors de list

                        Heu du coup, ça n'a rien d'intuitif et mériterait d'être dit explicitement dans le manuel utilisateur.

                        J'ai testé ainsi. Ça marche. Comme tout doit tenir avec une seule commande, il recrée une nouvelle liste en partant de la copie et de ce qu'il y a autour. C'est troublant mais pas si grave.

                        • [^] # Re: la roue ça servait à quoi déjà ?

                          Posté par . Évalué à 2.

                          Tu peux décrire ce qui te trouble plus précisément ?

                          L'idée est d'avoir un minimum "d'état". si il remplaçait le contenu de la liste, ou est-ce que je pourrais mettre les .idx ? Il faut aussi faire en sorte que lancer 2 fois de suite l'outil, ne change rien à l'état du système. si cela n'est pas stable, c'est compliqué de comprendre ce qui peux se passer.

                          ./list est là où sont stocker les idx, qui est maintenu à jour.

                          "La première sécurité est la liberté"

                          • [^] # Re: la roue ça servait à quoi déjà ?

                            Posté par . Évalué à 2.

                            En gros, je vivrai très bien avec.
                            D'ailleurs, quand tu l'expliques, à nouveau ça fait sens.

                            Ce que je comprends : à chaque lancement, l'outil s'assure que l'on a :
                            - une arborescence sans idx, sinon, il le remplace par la source,
                            - un répertoire "list" avec la même arborescence en idx.
                            Et il affiche la taille de tout ce qu'il n'a pas pu remplacer par la source.

                            C'est plus le premier point de mon commentaire, sur le non intuitif, qui était important selon moi.

                            Au final, on va peut être parvenir à faire le tour du sujet. on a:
                            1/ le besoin ciblé
                            2/ comment l'utilisateur procède
                            3/ le principe général de la solution
                            4/ des détails d'implémentation.

                            Les commentaires à ce journal - y compris les miens - auraient été moins "sport" si tu n'y avais pas traité que le 4.

                            • [^] # Re: la roue ça servait à quoi déjà ?

                              Posté par . Évalué à 2.

                              Je me disais que j'aurais dû ajouter des "$ ls -R" dans mon exemple.

                              Tu as lu aussi le readme.txt dans le git ? Et pas seulement le readme.md ?

                              "La première sécurité est la liberté"

                              • [^] # Re: la roue ça servait à quoi déjà ?

                                Posté par . Évalué à 2.

                                Je les ai lu, oui, mais pas lors de mes premiers commentaires.
                                Je les ai lu quand j'ai installé l'outil.
                                J'ambitionnai de comprendre l'outil sans le lancer (j'aime pas lancer un exécutable comme ça sur ma machine sans comprendre ce qu'il va faire), avec la doc. Mais je n'y suis pas parvenu.
                                Et d'ailleurs, comme tu as pu le lire, quand je l'ai lancé, je n'ai pas tout compris non plus.

                                Si tu vises un public large, il faut que ce soit extrêmement didactique, avec des captures d'écran par exemple. Ou sous forme de BD ou que sais-je. Et l'utilisateur se contentera des points 1/ et 2/.

                                Quand tu veux faire un journal pour avoir un retour sur ton travail, franchement, les quatre points doivent être traités. Sinon, c'est trop dur, voire frustrant, pour le lecteur, de rentrer dans le sujet.

                                • [^] # Re: la roue ça servait à quoi déjà ?

                                  Posté par . Évalué à 2.

                                  Les 4 points sont présent, si tu regarde bien, mais sans doute pas, comme tu le souhaiterais. Et si je n'ai pas mis de capture d'écran, j'ai mis des "consoles shot" dans le même but. Mais il manque les "$ ls" pour comprendre.

                                  Tu as des remarques concernant la sortie du logiciel ou autres choses ? Je ferais une beta 2, avec toutes les remarques des commentaires.

                                  "La première sécurité est la liberté"

                                  • [^] # Re: la roue ça servait à quoi déjà ?

                                    Posté par . Évalué à 3.

                                    Sur le logiciel, pas vraiment de remarque. Il est suffisamment simple et consistent pour ne pas avoir à changer grand chose pour le moment.

                                    Tout ce joue sur la documentation, imha, comme nous avons pu en discuter.

                                    Un truc dans la doc qui m'a pas mal embrouillé aussi au début c'est l'histoire des multiples clés usb. Je trouve que c'est pas le cas nominal (oui je suis pénible avec ça). C'est plus la cerise sur la gâteau. Ça mériterai d'être en annexe, dans les bonus, et pas en première ligne.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.