zyphos a écrit 94 commentaires

  • [^] # Re: Typo dans le premier bloc de code

    Posté par  . En réponse à la dépêche PHP sort en version 8.2. Évalué à 1. Dernière modification le 06 décembre 2022 à 08:56.

    La fin de ligne devrait même être vide en fait.

        public function __construct(
            private string $title,
            private string $author
        )
        {}
  • # Réseau local sûr

    Posté par  . En réponse à la dépêche Oubliez les web services, utilisez des tubes nommés. Évalué à 10.

    Si vous construisez des (premières versions de) programmes communicants qui fonctionneront sur un réseau local (sûr), et pour lesquels les messages échangés sont connus et simples, alors j'ai une bonne nouvelle : vous n'avez pas besoin d'utiliser des services web (ou tout autre type de middleware).

    Je pense que plus aucun réseau local n'est sûr.
    Vu le nombre d'objets connectés et smartphone sans mise à jour disponible, il faut partir du principe que le réseau local n'est pas sûr malheureusement.
    Même en utilisant des pares-feux, on n'est pas à l'abri d'une adresse IP spoofé.

    Personnellement, je n'utiliserai les Named Pipes que pour des processus au sein d'une même machine.

  • [^] # Re: Le poids des images, le choc des photos

    Posté par  . En réponse à la dépêche Student Demo Cup 2017 : résultats. Évalué à 2.

    Il y a un tout petit peu plus d'informations sur les projets gagnants, via cette page:
    http://student.opensourcesummit.paris/edition/

    Mais c'est toujours très édulcoré.

  • [^] # Re: copie efficace vers/de une machine distante

    Posté par  . En réponse à la dépêche Sortie de gfast-copy et de fast-copy sur www.open-source-projects.net. Évalué à 3.

    Ce qui ralenti surtout Rsync (sur du Gbits ou supérieur), c'est le chiffrement utilisé.
    En changeant de système de chiffrement, il est accéléré considérablement. Il devient aussi rapide que "scp" (voir plus rapide).
    Attention, il faut que le chiffrement choisi soit disponible sur les 2 pc.

    Source:
    https://gist.github.com/KartikTalwar/4393116

  • # Attention à la dé-duplication

    Posté par  . En réponse à la dépêche Optimisations et corrections pour Fim 1.2.3. Évalué à 5.

    Dans le code, uniquement les hashes sont utilisés pour détecter les fichiers dupliqués.

    Or on sait très bien que les hashes ont des collisions, elles sont rares, mais elles existent. (Forcément, sinon pourquoi perdrait-on des milliers de Mo pour stocker des fichiers alors que quelques octets (les hashes) suffisent…)

    Pour trouver des fichiers dupliqués voici une approche:
    1. On vérifie les tailles (c'est la plus rapide vérification)
    2. Si les tailles sont identiques, on vérifie les hashes (complet sur les fichiers) (on stock les hashes pour ne pas les recalculer à chaque fois)
    3. Si les hashes sont identiques, on compare les contenus en entier.

    J'ai déjà eu des dizaines de fichiers effacés par erreur par un outil qui faisait de la dé-duplication. Liten (https://code.google.com/archive/p/liten/), il y a un également Liten2 (https://code.google.com/archive/p/liten2/) Tous les 2 sont à proscrire. Ils utilisent (enfin utilisaient, je n'ai plus regardé le code source) un hash basé sur les premiers 16Ko des fichiers. Pour aller plus vite…

  • # Conversion données -> CSV

    Posté par  . En réponse à la dépêche Oui, Illico !. Évalué à 2.

    Pour la conversion des données en CSV, avant traitement avec Illico, il peut être utile d'utiliser Pentaho Kettle.

    Bon ok, ça fait un peu usine à gaz juste pour convertir.
    Il y a aussi quelques fonctions redondantes avec Illico.

  • [^] # Re: Questions

    Posté par  . En réponse à la dépêche Katal, catalogue de fichiers. Évalué à 3.

    On parle de données (ex: photos de famille), je pense qu'un risque, même très faible, n'est pas acceptable pour des données.

    De plus la comparaison bit à bit ne se ferait qu'en cas très rare d'hash identique. Donc, la perte de performance sera très faible et justifiée.

    Par contre vérifier la taille des fichiers me semble être vraiment le strict minimum. Bien avant de calculer et comparer un hash.

    Pour optimiser le tout, je ne calculerais les "hash"s que si au moins 2 fichiers ont la même taille. Puis évidement ils seraient stockés dans la DB.

  • [^] # Re: Questions

    Posté par  . En réponse à la dépêche Katal, catalogue de fichiers. Évalué à 3.

    Pour les doublons le fait de ne vérifier que les hash n'est pas suffisant, les hash peuvent avoir des collisions.

    J'en ai déjà fait les frais, des fichiers effacés par erreur lors d'une déduplication,
    merci liten2, https://code.google.com/p/liten2/
    En effet, chez liten2 c'est encore pire que de comparer les hash complets, il ne compare que les hash des 16 premiers Ko du chaque fichier.

    Je pense que le mieux est:
    1. Vérification de la taille des fichiers
    2. Si même taille, vérification du hash
    3. Si même hash faire une vraie comparaison bit à bit.

  • # Extraordinaire

    Posté par  . En réponse à la dépêche Sortie de Tabula 1.0.1 - Extraction de données tabulaires dans des pdfs. Évalué à 10.

    Merci beaucoup pour ce programme. Il fonctionne vraiment pas mal.
    Je l'ai testé avec une liste de prix fournisseur, PDF 2,1MB, 77 pages, 760 lignes x 5 colonnes de tableaux.

    • Il est juste un peu lent (7min34 preview + 20sec export CSV), mais ce n'est pas là le plus important pour moi, c'est toujours beaucoup plus rapide que de le faire à la main.
    • Un peu consommateur de ressource. 700MB de RAM pour un pdf de 2,1MB (avec Ruby sur Java c'est normal)
    • L'interface utilisateur est très bien faite et facile. L'auto-détection de tableau a parfaitement fonctionné sur mon test. Il devait y avoir +-300 petits tableaux.
    • L'installation est "plug and play", je redoutais le pire avec Ruby. (expérience passée) Mais le fait qu'il soit packagé dans du Java aide sur ce point.
    • Il n'est pas compatible avec les processeurs multi-coeur (multiprocessing). Je n'en ai qu'un seul thread à 100% avec 4 cores.
    • Il doit y avoir des fuites mémoires, après plusieurs itérations la mémoire RAM augmente. Après 2 itérations et on en est à 780MB de RAM total.
  • [^] # Re: more on that...

    Posté par  . En réponse à la dépêche Internet des objets l'ESP8266 et ma porte de garage. Évalué à 3.

    Auto upload sur l'IDE arduino, c'est possible.
    http://www.arduinesp.com/

    Il y a deux méthodes:
    1. Avec 2 transistors NPN + 2 résistances
    http://www.arduinesp.com/blink
    2. Liens en direct, mais on perd le moniteur série. (l'accès au port série pour le débuguer)
    http://www.arduinesp.com/blink_no-serial-monitor

    Pour installer l'IDE arduino:
    http://www.arduinesp.com/getting-started Section

    Apparemment l'upload est basé sur esptool-ck:
    https://github.com/igrr/esptool-ck

  • [^] # Re: more on that...

    Posté par  . En réponse à la dépêche Internet des objets l'ESP8266 et ma porte de garage. Évalué à 7. Dernière modification le 11 septembre 2015 à 11:14.

    Pour le problème de la sécurité du wget, rien n'empêche de mettre la domotique sur un réseau wifi exclusivement dédié à cet usage. Pour rappel le ESP8266 peut lui même être un point d'accès.

    Il existe également un autre système de communication plus ancien et moins chère que ZigBee, mais il faut s'occuper soit même de la sécurité, le NRF24L01. Mais ce dernier nécessite un microcontrôleur (Arduino par exemple).

    Petit comparaison:
    - NRF24L01 (2,4ghz mais autre que wifi), 3,3v et TTL en 3.3-5v, Serial, nécessite un microcontrôleur, non chiffré, 0,60€/piece si on en prend 10
    - ESP8266 (wifi), 3,3v et TTL en 3,3v, SPI, peut-être tout a fait autonome, chiffré, 2,24€/piece si on en prend 5
    - Xbee (zigbee), 3,3v et TTL en 3,3v, Serial, nécessite un microcontrôleur, chiffré, 17 €/piece

    Le SDK du ESP8266 n'est pas complètement open source.

    Pour la tension d'alimentation du ESP8266 c'est maximum 3,6v (voir TDS). Mais normalement c'est 3,3v et TTL 3,3v, mais l'auteur de cet article a apparement utilisé directement le TTL de l'arduino à 5v alors que certains préconisent un logic level converter (shifter), personnellement j'utilise un arduino en 3,3v.

    Selon certain site on peut l'alimenter jusqu'à 4,5V, mais il consomme 100x plus en veille que en dessous de 3,8V
    http://forum.makehackvoid.com/t/esp8266-operating-voltage-range-and-sleep-current/286

    Un livre gratuit a été écrit sur le ESP8266, mais il est en anglais.
    http://neilkolban.com/tech/esp8266/

    Un wiki est disponible:
    https://github.com/esp8266/esp8266-wiki/wiki

    Ainsi que des forums:
    http://www.esp8266.com/

    Et enfin la technical datasheet (TDS):
    https://drive.google.com/file/d/0B_ctPy0pJuW6Y0FHcDlVY09Xdjg/view

  • # Carte de dev alternative basé sur le STM32F10xxx à bas coût, le Leaf Maple Mini

    Posté par  . En réponse à la dépêche Écrire son système d'exploitation - Partie 1 : préparer le terrain. Évalué à 1.

    Pour ceux d'entre-vous qui voudraient également tester le code ou développer sur un STM32F103RCBT6,
    il y a ce module, pas cher, pour commencer le développement:

    Leaf Maple Mini
    Wiki: http://leaflabs.com/docs/hardware/maple-mini.html
    Prix: environs 4€ (chez Ali…)

    Avec connectique Mini-USB, c'est assez rapide pour la programmation (upload) et très peu onéreux.

    Ce qui est bien c'est qu'il peut se faire programmer comme un Arduino (avec un GUI, presque le même).
    On peut tester directement le programme en RAM (sans écrire sur la mémoire flash), pratique pour les petits tests.

    Mais attention beaucoup des GPIO ne sont pas compatible 5v. C'est presque du 3,3v partout.

  • [^] # Re: Race conditions

    Posté par  . En réponse à la dépêche Exploiter inotify, c’est simple. Évalué à 1.

    Ce qui est bizarre avec inotify, c'est que le l'ajout de répertoire fonctionne parfaitement, mais dès que vous en déplacez un hors du scope (répertoires surveillés) de inotify, et que plus tard vous le re-déplacez dans le scope, il se passe des choses bizarres:

    • L'ancien watch nommé nodurépertoire devient nodurépertoire-unknown-path
    • Un nouveau watch est automatiquement créé. Bref il faut retirer les watch à la main.

    ex:
    répertoire surveillé: /tmp/inotify/

    # mkdir /tmp/inotify/aze
    Event IN_CREATE|IN_ISDIR on /tmp/inotify/aze
    Event IN_OPEN|IN_ISDIR on /tmp/inotify/aze
    Event IN_OPEN|IN_ISDIR on /tmp/inotify/aze
    Event IN_CLOSE_NOWRITE|IN_ISDIR on /tmp/inotify/aze
    Event IN_CLOSE_NOWRITE|IN_ISDIR on /tmp/inotify/aze
    # touch /tmp/inotify/aze/k
    Event IN_CREATE on /tmp/inotify/aze/k
    Event IN_OPEN on /tmp/inotify/aze/k
    Event IN_ATTRIB on /tmp/inotify/aze/k
    Event IN_CLOSE_WRITE on /tmp/inotify/aze/k
    # mv /tmp/inotify/aze /tmp/
    Event IN_MOVED_FROM|IN_ISDIR on /tmp/inotify/aze
    [2014-11-25 08:59:08,714 pyinotify ERROR] The pathname '/tmp/inotify/aze' of this watch <Watch wd=3 path=/tmp/inotify/aze mask=4095 proc_fun=None auto_add=True exclude_filter=<function <lambda> at 0x9dfd454> dir=True > has probably changed and couldn't be updated, so it cannot be trusted anymore. To fix this error move directories/files only between watched parents directories, in this case e.g. put a watch on '/tmp/inotify'.
    Event IN_MOVE_SELF on /tmp/inotify/aze-unknown-path
    # mv /tmp/aze /tmp/inotify/
    Event IN_MOVED_TO|IN_ISDIR on /tmp/inotify/aze
    [2014-11-25 09:00:15,900 pyinotify ERROR] The pathname '/tmp/inotify/aze' of this watch <Watch wd=3 path=/tmp/inotify/aze mask=4095 proc_fun=None auto_add=True exclude_filter=<function <lambda> at 0x9dfd454> dir=True > has probably changed and couldn't be updated, so it cannot be trusted anymore. To fix this error move directories/files only between watched parents directories, in this case e.g. put a watch on '/tmp/inotify'.
    Event IN_MOVE_SELF on /tmp/inotify/aze-unknown-path
    Event IN_OPEN|IN_ISDIR on /tmp/inotify/aze
    Event IN_OPEN|IN_ISDIR on /tmp/inotify/aze-unknown-path
    Event IN_CLOSE_NOWRITE|IN_ISDIR on /tmp/inotify/aze
    Event IN_CLOSE_NOWRITE|IN_ISDIR on /tmp/inotify/aze-unknown-path
    
  • [^] # Re: Wordpress = + de perfs?

    Posté par  . En réponse à la dépêche Votre blogue à la maison sur Raspberry Pi. Évalué à 2.

    Rapsberry Pi B = 2,3W (mesuré avec Carte SD et Raspbian)
    Raspberry Pi B+ = 1W (non mesuré) normalement d'après l'annonce.
    En Belgique, 1 appareil 24h/24, 1W = +-1,5€/an

  • [^] # Re: encore du travail pour être reconnu

    Posté par  . En réponse à la dépêche Sortie de Odoo 8 (anciennement OpenERP). Évalué à 3. Dernière modification le 23 septembre 2014 à 15:34.

    Justement, pour Odoo et Opencencerto il y a un support Entreprise.

    Et pour Odoo, il y a les intégrateurs qui font également le support.

    Donc cet argument est tout à fait caduc.

  • [^] # Re: J'ai trop la flemme de vérifier...

    Posté par  . En réponse à la dépêche Sortie de Odoo 8 (anciennement OpenERP). Évalué à 3.

    Il faut quand même nuancer.
    Ce n'est pas parce qu'Odoo est utilisé par des grands noms que ces grands noms utilisent le module que vous compter utiliser.

    Par exemple, je ne pense pas que Danone utilise le module compta d'OpenERP.

    Mais bon c'est clair qu'il faut commencer quelque part.

    c'est le seul point négatif avec OpenERP, c'est qu'on ne peut pas savoir si un module a déjà été utilisé en production, et donc fiable à 100%.
    Je pense évidement à la compta.

  • [^] # Re: Où est ce qu'on achète

    Posté par  . En réponse à la dépêche L’arrivée du BananaPi. Évalué à 1.

    Il est déjà en vente sur un site chinois très connu (il faut compter 2 semaines pour la livraison)
    €38,65/piece, livraison gratuite.

    C'est le premier lien si on cherche "buy banana pi" sur G..gle (attention les versions moins chères ont 20€ de frais de port)

  • # Dialogues

    Posté par  . En réponse à la dépêche Je crée mon jeu vidéo E08 : fiche de lecture de «L'Art du game design» par Jesse Schell. Évalué à 3.

    Pour les dialogues, voici un petit exemple dans un autre jeux libre (Andors' trail). Ce n'est pas du YAML mais du JSON (JSON est compatible YAML il me semble), la structure en YAML serait presque la même:
    http://code.google.com/p/andors-trail/source/browse/#git%2FAndorsTrail%2Fres%2Fraw

  • # Pourquoi pas un Raspberry Pi ?

    Posté par  . En réponse à la dépêche Jeudi du libre le 5 décembre à Lyon : la domotique. Évalué à 1.

    La question a peut-être déjà été posée, mais pourquoi pas avoir utilisé un Rasberry PI ?
    Il est déjà très bien équipé, il ne consomme presque rien. (2W) Il n'est pas très cher.
    Il possède un bus I2C, un bus 1-Wire, 1 serial, 2 USB, 1 Ethernet, quelques GPIO.

  • # Concours et vie privée

    Posté par  . En réponse à la dépêche Concours de programmation CodinGame le 28 mai 2013. Évalué à 2.

    Il y a toujours un problème de vie privée avec les concours mais là c'est un peu bizarre, ils ne sont pas très clairs:
    http://www.codingame.com/cg/#!challenge:8 (bas de page à droite)

    Aucune de vos données n'est transmise à quiconque
    sans votre autorisation.
    À l'issue du concours, si une entreprise que vous avez sélectionnée souhaite vous contacter et que vous acceptez son invitation, alors nous lui transmettrons vos données personnelles.
    Sinon, elle ne saura jamais qui se cache derrière votre code…

    Et puis dans le règlement:
    http://www.codingame.com/cg/#!rules

    Article 7: Publicité
    Une fois la mise en relation établie entre le Candidat et l’Employeur intéressé, et le contrat entre les parties signé, Cartser se réserve le droit de publier, sur quelque support que ce soit, aux fins de communication publicitaire ou autre, sur le réseau internet ou non, pour le monde entier, la photo et le nom des Candidats ayant trouvé un poste grâce au Concours CodinGame.
    Et cela, sans que les gagnants puissent exiger une contrepartie quelconque ou s'y opposer.

  • [^] # Re: Merci pour vos critiques

    Posté par  . En réponse à la dépêche doorGets CMS, très jeune CMS Open Source français. Évalué à 10.

    Les critiques permettent d'avoir des avis objectifs et constructifs surtout sur ton produit. C'est comme ça qu'on avance.

    Après avoir regardé le code de plus près, il est dommage d'utiliser du français avec de l'anglais.
    Par exemple:
    /class/admin/class.candidaturemodels.php
    @line 63: public function get(){
    @line 71: public function voir($id)
    @line 103: public function listing($par=20){
    @line 160: public function formSupprimer($id)

    Il faut choisir une langue. Je te conseillerais quand même l'anglais.

    Pour les requêtes SQL pour te faire gagner du temps et en lisibilité, tu peux utiliser des alias.
    Ex:
    /class/admin/class.gensitemapxml.php

    $sqlT = "
            SELECT _categories_traduction.uri, _categories_traduction.id,_categories.uri_module , _categories.id, _categories_traduction.nom
            FROM _categories, _categories_traduction
            WHERE _categories_traduction.langue =  '$lgActu'
            AND _categories.id = _categories_traduction.id_cat
            AND _categories.uri_module = '$name'
            ORDER BY _categories.ordre ASC 
            LIMIT 0 , 30";
    
    

    devient:

    $sqlT = "
            SELECT c.uri, t.id, c.uri_module , c.id, t.nom
            FROM _categories AS c, _categories_traduction AS t
            WHERE t.langue =  '$lgActu'
            AND c.id = t.id_cat
            AND c.uri_module = '$name'
            ORDER BY c.ordre ASC 
            LIMIT 0 , 30";
    
    

    Attention sur ton site est vulnérable aux injections SQL, il n'y a aucun contrôle sur les données injectées.
    /class/core/CRUD.php
    @line 196

        public function dbQI($data,$table){
    
            $d = "INSERT INTO ".$table." (";
            foreach($data as $k=>$v){
                $d .= $k.',';
            }
            $d = substr($d,0,-1);
            $d .= ") VALUES (";
            foreach($data as $k=>$v){
                $d .= '\''.$v.'\',';
    
            }
            $d = substr($d,0,-1);
            $d .= ")";
    
            $this->dbpdo->query($d);
    
            $id = $this->dbpdo->lastInsertId();
    
    
    
            return $id;
        }
    
    

    à remplacer par:

        public function dbQI($data,$table){
            $safe_quote = array($this->dbpdo, 'quote');
            $columns = array_map($safe_quote, array_keys($data));
            $values = array_map($safe_quote, $data);
            $columns_sql = implode(',', $columns);
            $values_sql = implode("','", $values);
            $sql = 'INSERT INTO'.$table.' ('.$columns_sql.") VALUES ('".$values_sql."')";
            $this->dbpdo->query($sql);
            return $this->dbpdo->lastInsertId();
        }
    
    

    Il y en a sûrement d'autres, je n'ai pas tout lu.

    Pour les langues, au lieu de créer plein de répertoires et fichiers /lang/index.php utilises plutôt ceci:
    1- un fichier /.htaccess avec ceci:

    RewriteEngine on
    RewriteRule ^t/([a-z]{2})/$ t/index.php?lang=$1 [QSA]
    
    

    2- un fichier /t/index.php avec le contenu de /t/fr/index.php modifié comme ceci:
    @line 34 $isLgForce = 'fr';
    à remplacer par:
    @line 34 $isLgForce = $_GET['lang'];

    Pour la détection automatique de la langue voici un petit coup de pouce, il faut utiliser dans l'ordre si disponible:
    1. $_GET['lang']
    2. $_SESSION['lang']
    3. $_COOKIE['lang']
    4. $_SERVER['HTTP_ACCEPT_LANGUAGE']
    5. langue par défaut.

    Voici une implémentation (libre de droit ;)):

    $default_language = 'en';
    $languages = array('fr','en','de','ru','nl');
    
    function get_array_true_lang($array){
        global $languages;
        if (!array_key_exists('lang', $array)) return false;
        $lang = strtolower($array['lang']);
        if (in_array($lang, $languages)) return $lang;
        return false;
    }
    
    function get_lang(){
        global $default_language;
        foreach (array($_GET, $_SESSION, $_COOKIE) as $array){
            $lang = get_array_true_lang($_GET);
            if ($lang) return $lang;
        }
        //il faut créer une fonction pour analyser $_SERVER['HTTP_ACCEPT_LANGUAGE']
        return $default_language;
    }
    
    

    Pas oublier de sauver la valeur après avoir identifié la langue.

    $lang = get_lang();
    $_SESSION['lang'] = $lang;
    set_cookie('lang', $lang);
    
    

    PS: c'est inutilisable la syntaxe Wiki de LinuxFR. Ils auraient dû prendre la syntaxe Wiki de wikimedia (ça bug non stop).

  • # Multilingue c'est bien, dans la bonne langue c'est mieux.

    Posté par  . En réponse à la dépêche doorGets CMS, très jeune CMS Open Source français. Évalué à 3.

    Encore un CMS qui ne tient pas compte des préférences des utilisateurs.

    Il est multilingue, mais ne détecte pas la langue préférée de l'utilisateur. Comme à mon avis 99% des sites. (Pour testé j'ai changé ma langue préféré en Anglais, détruit les cookies et relancé le site)
    Habitant dans un pays multilingue, je déteste à avoir à chercher pour trouver le lien permettant d'avoir le site dans ma langue préférée.
    Ici c'est facile, les langues sont visibles au-dessus. Mais prenez par exemple, http://www.samsung.be. Essayez d'avoir le site en Français. Le pire est le message de confirmation qui est dans la langue non choisie.

  • [^] # Re: Rabat joie

    Posté par  . En réponse à la dépêche Expérience de déploiements d’OpenERP dans des entreprises françaises. Évalué à 2.

    C'est payant. Il n'y a pas de migration automatique gratuite.
    OpenERP a développé les outils de mise à jour, mais ils les gardent secrets, c'est leur gagne pain.
    Il faut payer leurs services pour migrer.
    Comme cité par Alexis:

    L'éditeur ne publie pas de scripts de migration pour les modules officiels ; il le fait payer sous forme de service.

  • [^] # Re: Est-ce compatible avec les licences d'utilisation ? (Minifying)

    Posté par  . En réponse à la dépêche Mod_pagespeed : un accélérateur de pages Web. Évalué à 1.

    Oui c'est une bonne solution, le seul problème c'est qu'il faut réécrire les fichiers.
    Je ne pense pas que tout le monde a accès, ou le droit de modifier les fichiers.
    De plus cela pose problème lors de mise à jour de framework externe, d'expérience, un jour on oubliera de modifier à nouveau le code licence.
    Ou lorsqu'il y a beaucoup de fichier a traiter.

    Une simple détection de certains mots comme 'license', 'copyright',… dans le commentaire serait suffisante. Mais demanderait un peu plus de ressources.

  • # Est-ce compatible avec les licences d'utilisation ? (Minifying)

    Posté par  . En réponse à la dépêche Mod_pagespeed : un accélérateur de pages Web. Évalué à 3.

    Vu que les fonctions minify CSS/Javascript/HTML (Rewrite CSS/Minify/Remove Comments) retirent les commentaires, la licence des codes est retirée.
    Cela pose un petit problème de droit d'auteur non ?

    Enfin il y a toujours la solution de désactiver certaines fonctionnalités.

    L'idéal serait un système de détection des licences.