SpaceFox a écrit 1630 commentaires

  • # "Le texte précise désormais que le « blocage automatique (de contenus) doit être évité » au maximum"

    Posté par  (site web personnel, Mastodon) . En réponse au journal Directive sur le droit d’auteur adoptée. Évalué à 2.

    Et autres modifications ici : https://www.lemonde.fr/pixels/article/2018/09/12/le-parlement-europeen-adopte-la-directive-sur-le-droit-d-auteur-a-l-heure-du-numerique_5354024_4408996.html

    Y'a plus qu'à voir ce qui a été exactement modifié et ce que ça implique vraiment…

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Sur Ubuntu 16.04 et 18.04, la description est bonne

    Posté par  (site web personnel, Mastodon) . En réponse au journal De l'importance de bien nommer ses logiciels…. Évalué à 5. Dernière modification le 11 septembre 2018 à 16:18.

    Certes, mais ça ne s'affiche pas dans l'interface en question (ni dans les menus de Mint, d'ailleurs).

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Sur Ubuntu 16.04 et 18.04, la description est bonne

    Posté par  (site web personnel, Mastodon) . En réponse au journal De l'importance de bien nommer ses logiciels…. Évalué à 8. Dernière modification le 11 septembre 2018 à 15:15.

    Je parle de cette description là.

    PS : les descriptions aux mêmes endroit de Firefox et Thunderbird (sous Mint, je n'ai pas Ubuntu sous la main au boulot) sont claires. C'est respectivement « Naviguer sur le web » et « Lire et écrire des courriels ».

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Montre ton code

    Posté par  (site web personnel, Mastodon) . En réponse au journal Prototypage d'applications web. Évalué à 9. Dernière modification le 07 septembre 2018 à 16:10.

    Je n'ai pas développé ce toolkit en ayant un type d'utilisateur en tête. […] je ne sais pas comment il se positionne par rapport à des solutions de développement web classiques (je n'ai jamais utilisé de telles solutions).

    Si je comprends bien, tu développes un toolkit :

    • sans avoir d'utilisateur cible en tête,
    • sans connaitre les solutions standard du marché,
    • sans connaitre le positionnement de ta solution par rapport à l'existant,
    • donc sans savoir comment le reste de l'univers a adressé les problématiques que tu rencontres ou vas rencontrer, quelles sont les solutions apportées, quels sont les avantages, les inconvénients et comment tu te situes au-milieu de tout ça.

    Pour être tout à fait honnête, je ne comprends pas vraiment comment tu peux imaginer que ça fonctionne. Là tu es parti pour devoir réinventer la roue, sans jamais avoir vu de roue ni utiliser de roue. Je ne vois pas comment tu peux obtenir autre chose qu'un truc carré, et ce après t'être mangé tous les nids-de-poule que tous tes « concurrents » ont déjà bouchés sur leur propre route.

    Ça me fait penser à ce témoignage d'Olivier Levy. En gros, il a créé un site de vente de matériel son en ligne, alors que son boulot c'était le SEO, juste pour mettre en application ses techniques SEO. Il a choisi le matériel son plus ou moins au pif. Ça a marché… ou pas :

    Une entreprise bien huilée ? En apparence seulement, car la réalité vous rattrape. Plus Platine grossissait, plus je me rendais compte que je ne pouvais continuer à faire du commerce sur des produits que je ne connaissais pas.

    Et la liste des lacunes était grande:

    C’est un an après que je me suis rendu compte qu’on ne pouvait pas vendre de la sono sans aussi proposer des jeux de lumière…

    C’est seulement 2 ans après que je me suis rendu compte que je ne vendais pas les principales marques de sono et platine DJ… (Numark, Stanton, Gemini, Martin Light, etc…). En gros, c’était comme si j’avais ouvert une boutique de vente de téléviseurs sans proposer des marques comme Sony, Thoshiba ou encore Samsung…

    C’est seulement au bout d’un an que je me rends compte que le magazine papier dans lequel je faisais de la pub n’est plus du tout lu par les DJ, et que les nombres de publications qu’ils m’annonçaient étaient faux.

    Et je n’inclus pas les erreurs dont je ne me suis jamais rendu compte. Et puis toutes ces questions techniques auxquelles personne ne savait répondre chez nous… Autant de ventes perdues.

    Du coup si ton projet était une démonstration technologique, un essai de technologie ou une marotte, OK, c'est sans doute très intéressant. Mais j'ai l'impression que c'est plus que ça pour toi, du coup je ne comprends pas ta démarche.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Montre ton code

    Posté par  (site web personnel, Mastodon) . En réponse au journal Prototypage d'applications web. Évalué à 7.

    Le schéma est indispensable à cause de ça :

    Le seconde, à laquelle la première se connecte, est constituée d'un ensemble de logiciels qui tournent sur un serveur distant (accessible, lui, d'internet). Pour éviter au développeur d'avoir à s'en occuper, un tel serveur, auquel le toolkit se connecte automatiquement, est gracieusement mis à disposition.

    Il est des applications pour lesquelles il est impensable que quoi que ce soit tourne sur un serveur tiers inconnu. Si je n'ai pas un schéma clair qui m'explique qu'est-ce qui tourne où, et quelles sont les alternatives disponibles, ton framework est disqualifié d'office.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Montre ton code

    Posté par  (site web personnel, Mastodon) . En réponse au journal Prototypage d'applications web. Évalué à 10.

    Plus que du code, je montrerais plutôt un schéma. Parce que depuis le temps que je vois passer tes journaux, je n'ai toujours pas compris qu'est-ce qui s'exécute où avec ton framework.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: ça tape sur la CGT !

    Posté par  (site web personnel, Mastodon) . En réponse au journal Chaque été depuis 9 ans, Altran enclenche une procédure de licenciement contre un délégué syndical. Évalué à 3.

    Je dirais que ça peut être à la fois totalement normal (si la personne n'était pas censée faire du Java) ou purement scandaleux (si la personne était censée faire du Java).

    Personnellement qu'un collègue ne connaisse pas X ou Y hors de son domaine de compétence, je trouve ça normal. Qu'il ne connaisse pas X ou Y dans son domaine de connaissance, ça peut être plus surprenant selon la notoriété et l'utilité de X ou Y. Mais qu'une personne ne connaisse pas le minimum syndical (sans jeu de mot) de son domaine théorique de compétence, là il y a un problème. Je suis toujours halluciné de constater que certains osent se prétendre développeurs professionnels avec de l'expérience mais n'arrivent pas à résoudre un simple fizzbuzz – et c'est loin d'être un cas rare.

    Je parle des développeurs ici parce que c'est le milieu que je connais le mieux, mais le cas de la personne qui est incapable de faire son travail parce qu'elle n'a pas les (compétences, capacités, connaissances) nécessaires à icelui est hélas trop fréquent, dans tous les domaines. Parfois des demandes simples donnent lieu à des situations ubuesques. Exemple réel qui a quelques années maintenant : on avait besoin de photos de produits pour intégrer à un site commercial.

    – Bonjour, Client, il nous manque la photo de la fiche XXX. Ça devrait être une photo de boite d'œufs sur fond blanc.
    – Bonjour, Développeurs. Voici comme demandé dans votre mail la photo sur fond noir.
    (On vérifie. C'est la bonne boite d'œufs, sur fond noir. Notre mail parlait bien d'une photo sur fond blanc).
    – Bonjour, Client. Nous sommes désolés, il a dû y avoir une incompréhension ; pour une question de cohérence avec les autres images, nous avons besoin de la photo sur fond blanc, vous nous avez fourni une version sur fond noir.
    – Bonjour, Développeurs. Voici la photo demandée.
    (Joint : une photo de la boite d'œufs sur fond… paille. Comme si on avait posé la boite sur de la paille).
    – Bonjour, Client. Il semblerait qu'une fausse manœuvre ait provoqué l'envoi de la mauvaise version de la photo. Pouvez-vous vérifier et nous envoyer la photo sur fond blanc ? Elle devrait être dans votre outil de gestion etc.
    – Bonjour, Développeurs, voici la photo demandée sur fond blanc.
    (Joint : une photo d'une boite d'œufs identique achetée je ne sais où, posée sur un bureau blanc et photographiée au smartphone sous une mauvaise lumière, donc sur fond gris clair d'un côté et gris moins clair de l'autre).

    On a supposé qu'en réalité il manquait la photo sur fond blanc dans le référentiel. Mais qu'au lieu d'admettre ça et détourer celle sur fond noir, ou demander à ce qu'on détoure celle sur fond noir (ce qu'on a fini par faire et qui a pris 5 minutes), on a eu droit à ce dialogue absurde qui s'est étalé sur 3 jours.

    Et des situations de ce tonneau, j'en ai vu passer à peu près avec tous les clients, quels qu'aient été leurs domaines de compétence.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: pouvoir exhorbitant...

    Posté par  (site web personnel, Mastodon) . En réponse au journal Chaque été depuis 9 ans, Altran enclenche une procédure de licenciement contre un délégué syndical. Évalué à 6.

    C'est horriblement compliqué à prouver, cf ta propre explication deux messages plus haut.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: pouvoir exhorbitant...

    Posté par  (site web personnel, Mastodon) . En réponse au journal Chaque été depuis 9 ans, Altran enclenche une procédure de licenciement contre un délégué syndical. Évalué à 1.

    Ça devient possible quand le médecin de la sécurité sociale est précisément celui qui fournit les arrêts de complaisance. Mon père a même eu un de ses subordonnés qui lui expliquait qu'il avait un médecin pour se soigner, et un autre pour les arrêts.

    Cela dit c'est quand même un milieu assez particulier (la caricature de la fonction publique, avec un boulot objectivement chiant à mourir).

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: sur Médiapart

    Posté par  (site web personnel, Mastodon) . En réponse au journal Chaque été depuis 9 ans, Altran enclenche une procédure de licenciement contre un délégué syndical. Évalué à 4.

    D'ailleurs, je suppose que c'est aussi toi qui est à l'origine de ceci ? https://blogs.mediapart.fr/ehvince/blog/310818/chaque-ete-depuis-9-ans-altran-tente-de-licencier-un-delegue-syndical

    Si oui, tu as oublié d'en préciser la licence là-bas.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Communications chiffrées ?

    Posté par  (site web personnel, Mastodon) . En réponse au journal LineageOS. Évalué à 7.

    Et logique, et la prononciation correspond à l'écriture, et il n'y a pas besoin d'aller chercher une typographie voire des caractères exotiques.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Une faille de sécurité européenne

    Posté par  (site web personnel, Mastodon) . En réponse au journal RGPD, retrait de toutes les listes de MailJet. Évalué à 3.

    https://darkpatterns.org/

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Chaussures du cordonnier

    Posté par  (site web personnel, Mastodon) . En réponse au journal Freenaute, ton mot de passe d'abonné est stocké en clair chez Free. Évalué à 3.

    1/ on google les hashs, généralement on arrive à en casser un paquet car google a stocké des millions de hash avec leur clair

    Oh, que oui. Y compris des trucs invraisemblables. Je te laisse chercher ce MD5 290b284d9e401b0a1b25ddb281cf5bf0 ou ce SHA-1 b19e461aeaba1172b26b552471f56405e1928d17.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Une faille de sécurité européenne

    Posté par  (site web personnel, Mastodon) . En réponse au journal RGPD, retrait de toutes les listes de MailJet. Évalué à 9.

    En terme de consommation / pollution, un SUV de 2018 est comparable à bien des berines et sûrement préférable à une 306 de 2000

    Sans doute, mais ce n'est pas mon propos. Ce que je veux dire, c'est que quitte à posséder une voiture récente, il vaudrait mieux en avoir une qui réponde à ses besoins sans surdimensionnement. La proportion de SUV que je croise sur le chemin du boulot ou sur les parkings est statistiquement improbable par rapport à la proportion de gens qui ont besoin de ce genre de véhicule.

    Ce qui est un peu dommage, c'est qu'en 20 ans les moteurs ont évolué, mais qu'on s'est surtout servi de cette évolution pour motoriser des véhicules plus gros.

    Ça et évidemment les gens qui viennent systématiquement au boulot en voiture alors qu'ils sont en capacité (distance + capacité physique) de venir en vélo, transports en communs, etc. – voire parfois à pieds.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Une faille de sécurité européenne

    Posté par  (site web personnel, Mastodon) . En réponse au journal RGPD, retrait de toutes les listes de MailJet. Évalué à 10.

    Si ça pouvait calmer la passion des gens pour les SUV et pousser à la sobriété dans la consommation de carburant, ce serait plutôt intéressant.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: ... et pas qu'un ...

    Posté par  (site web personnel, Mastodon) . En réponse au journal Du développement full-stack en Java. Évalué à 4.

    À peu près dans l'ordre :

    • Le problème d'avoir une variable locale toto alors que tu as un champ nommé toto dans la classe, c'est que si dans la méthode tu utilises toto tu vas utiliser la variable locale, alors que dans toutes les autres méthodes de la classe si tu utilises toto tu vas utiliser le champ (this. est facultatif en Java).
    • Je n'a pas été clair : depuis Java 5, il ne faut plus utiliser les itérateurs dans le cas général – ça sert dans des cas particuliers, par exemple quand on supprime des éléments de la collection itérée.
    • Je ne sais pas exactement ce qu'impose Java, ce qui est sûr c'est que personne ne fait autre chose que « une classe = un fichier du même nom » (sauf les classe à l'intérieur d'autres classes).
    • Integer est effectivement plus lourd que int. En vrai, j'ai vu un seul cas où ça pouvait être problématique depuis plus de dix ans (et ce n'était qu'un élément parmi d'autres). Ce n'est pas un critère tant que tu n'as pas un test de performances qui te montent explicitement que c'en est un.

    En fait j'avais essayé de lancer ton projet TODOMVC. Le « Hello world » du journal semble fonctionner – si on peut appeler l'ouverture d'un navigateur qui appelle un .php sur ton serveur « fonctionner », parce que ça me paraît très éloigné de ce que j'avais compris de ton outil en lisant tes journaux.

    Tant que j'y suis : je ne connais aucun projet qui nécessite encore de lancer javac à la main. Rien que ça, c'est louche. Java profite tellement de la présence d'un IDE que ceux qui s'amusent à le développer et le compiler directement en CLI ne sont plus qu'une infime proportion.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: ... et pas qu'un ...

    Posté par  (site web personnel, Mastodon) . En réponse au journal Du développement full-stack en Java. Évalué à 6.

    J'avais prévenu que je n'y connaissais pas grand chose en Java !
    […]
    je préviens d'avance, je ne m'y connais pas plus en PHP qu'en Java).

    Mais si tu n'y connais rien, pourquoi tu te tapes les bindings toi-même ? Tu sais que tu vas avoir des versions toutes bancales qui feront peur plus qu'elles donneront envie. Si tu as une lib libre de qualité en C++, tu ne devrais avoir aucun mal à convaincre des développeurs plus expérimentés de faire les bindings dans les langages qui les intéressent.

    Pour le reste, dans l'ordre :

    • Tu ne mets pas 2 classes de premier niveau dans le même fichier en Java. C'est techniquement possible, mais personne ne fait ça.
    • Il n'y a pratiquement aucune raison de faire new String() en Java. En fait, je n'en vois aucune.
    • Il n'y a aucun problème à utiliser un champ dans une méthode.
    • Dans tous les cas, une variable locale ne devrait jamais avoir le même nom qu'un champ – j'imagine que c'est la même chose en C++ ?
    • L'itérateur, c'est Java 5 (2004).
    • Aucun intérêt à faire du Java < 8 en 2018 sur un nouveau projet.
    • On ne commite pas les if de test, ou alors on les commente – j'imagine que c'est la même chose en C++ ?
    • Tu as bien compris pour le new.
    • Un code de démo doit être le plus clair possible et illustrer les bonnes pratiques. Si c'est plus clair avec 15 fichiers qu'avec un seul, alors ça doit être dans 15 fichiers – j'imagine que c'est la même chose en C++ ?
    • On ne peut pas « nuller » un type primitif, mais il y a les classes enveloppes (pour toi Integer) pour ça. Depuis Java 5 (2004) le boxing et l'unboxing (conversion classes enveloppes ↔ types primitifs) sont automatiques.
    • Le code que j'ai proposé pour le paramètre xml fonctionne normalement depuis Java 1.0.
    • Ton explication sur les triples négations n'enlève rien au fait que c'est une triple négation. Pour des raisons de lisibilité (et sauf cas très exceptionnel), un if/else à branches équilibrées (ici c'est le cas) devrait être de la forme if (a == b) { X() } else { Y() } et non if (a != b) { Y() } else { X() }. Et les actions devraient avoir un sens positif (ShowBidule) et pas négatif (HideBidule). C'est valable dans tous les langages, dont le C++.
    • Un code qui n'est pas un pur test devrait utiliser un logger (y'en a un dans l'API standard).
    • Un lien clé-valeur en Java, c'est une Map
    • J'ai essayé de le tester. J'ai eu le même genre d'emmerdes que barmic dans ce commentaire, sauf que moi j'ai écris mon retour sur ma pause au boulot. Je n'avais pas 1h à passer pour faire marcher le bordel.

    La connaissance libre : https://zestedesavoir.com

  • # Chrome-like, Firefox : les blocs de code sont 1,1x trop gros

    Posté par  (site web personnel, Mastodon) . En réponse à la dépêche Quelques petits changements sur le site. Évalué à 4.

    La classe CSS code a une règle font-size: 1.1em;, ce qui fait que les blocs de code (en ligne et multi-ligne) sont plus gros que le reste, d'un facteur 1,1 semble-t-il.

    Ça donne un rendu assez inégal :

    Comportement observé sous Vivaldi 1.15.1147.55 (Stable channel) (64 bits) (moteur JS : V8 6.5.254.41) et Chromium 68.0.3440.7 et Firefox 61.0.1 (64 bits) sous Linux Mint 19 Cinnamon à jour.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Lapin compris

    Posté par  (site web personnel, Mastodon) . En réponse au journal Du développement full-stack en Java. Évalué à 7.

    En fait ça fonctionne parce que ton code est contraire aux bonnes pratiques de Java.

    Un constructeur ça sert à construire un objet, pas à lancer un traitement bloquant. Je me demande d'ailleurs si ça ne peut pas casser certains mécanismes de la JVM d’avoir ce genre de comportement.

    L'une des conséquences, c'est que l'utilisation d'un tel comportement est purement incompréhensible pour le lecteur du code.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: ... et pas qu'un ...

    Posté par  (site web personnel, Mastodon) . En réponse au journal Du développement full-stack en Java. Évalué à 10. Dernière modification le 03 août 2018 à 16:18.

    Être obligé de jongler avec plusieurs langages en fonction du type d'application à développer ? Non merci, je préfère pouvoir développer tout type d'application en utilisant un seul langage ; c'est beaucoup plus efficace.

    Ou pas.

    Mon stage de fin d'études c'était justement la migration d'une application mono-langage (Progress 4GL) à une pile de langages plus spécialisés (Java, HTML, JS, SQL). Eh bien la pile de langages était infiniment plus facile à comprendre et utiliser que l'espèce de soupe qui prétendait tout faire, des requêtes à la BDD aux effets présentés à l'utilisateur.


    Ça fait la troisième fois (en comptant la version Node.js) qu'ont dit que mon code est nettement perfectible (ce dont j'ai parfaitement conscience, comme je l'ai à maintes fois indiqué). Je veux bien, mais est-ce que quelqu'un aurait la bonté de me montrer ne fût-ce qu'un exemple de ce qui ne va pas, et comment le corriger, histoire que j'ai l'occasion d'améliorer mon code ? Ou alors je vais finir pas penser que mon code n'est peut-être pas aussi mauvais que certains le prétendent !

    Je vais être sec aussi, mais en ce qui concerne ton code Java, il n'y a tellement rien qui va que te l'expliquer en détail est un travail si énorme que c'est décourageant.

    Si je prends juste en exemple le TODO MVC :

    • Le fichier s'appelle main.java mais ne contient pas de classe publique qui s'appelle main.
    • Le fichier n'est pas dans un package.
    • Deux classes (package-protected) dans le même fichier.
    • Tu utilises des new String("…").
    • int index = this.index; ?!
    • D'ailleurs tu passes ton temps à masquer la variable de classe index avec des variables locales index.
    • Tu n'utilises pas les possibilités de l'API standard (l'itérateur ligne 43, le while ligne 197 par exemple, ou tout le bloc de if / else if à partir de la ligne 230).
    • if ( false ) { !?
    • La ligne 273 ressemble beaucoup à une boucle infinie.
    • Ton main lance Exception, ce qu'il ne devrait pas faire, et en plus rien dans ton code ne déclare que cette Exception devrait être lancée.
    • Tu appelles des méthodes avec leur package complet au lieu de les importer (info.q37.xdhq.XDH.readAsset).
    • Tout est ultra-manuel : génération de XML à la main en dur dans le code, méthode escape que tu as réinventé, etc.
    • Tout est en vrac dans un seul fichier : personnellement je ne comprends pas ce que fait ce code à sa simple lecture.
    • J'imagine que le index de la classe TodoMVC pourrait être nullable pour gérer le cas particulier au lieu d'utiliser la valeur spécifique -1.
    • Dans la méthode push tu modifies ton paramètre xml.
    • La logique contient des triples négations : dans handleCount tu as un else sur une condition négative qui active un truc qui s'appelle HideBidule. Au final ça fait quoi ?
    • D'ailleurs le projet s'appelle TODO MVC mais n'est pas du tout du MVC ?!
    • Je passe sur les détails comme le formatage, la présence d'un System.out, l'import de packages complets ou le manque d'accolades.
    • Je passe aussi sur ton API qui me semble très étrange, comme ces méthodes qui attendent un tableau de tableau de String.

    Rien qu'en re-présentant le code correctement, ça donnerait quelque chose comme :

    package todomvc;
    /*
        Copyright (C) 2018 Claude SIMON (http://q37.info/contact/).
    
        This file is part of XDHq.
    
        XDHq is free software: you can redistribute it and/or
        modify it under the terms of the GNU Affero General Public License as
        published by the Free Software Foundation, either version 3 of the
        License, or (at your option) any later version.
    
        XDHq is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
        Affero General Public License for more details.
    
        You should have received a copy of the GNU Affero General Public License
        along with XDHq If not, see <http://www.gnu.org/licenses/>.
    */
    
    import info.q37.atlas.Atlas;
    import info.q37.atlas.DOM;
    import info.q37.atlas.GUI;
    import info.q37.xdhq.XDH;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    
    class Todo {
        public boolean completed;
        public String label;
    
        Todo(String label, boolean completed) {
            this.completed = completed;
            this.label = label;
        }
    
        Todo(String label) {
            this(label, false);
        }
    }
    
    class TodoMVC extends Atlas {
        private Boolean exclude;
        private int index = -1;
        private List<Todo> todos;
    
        private int itemsLeft() {
            return (int) todos.stream()
                    .filter(todo -> !todo.completed)
                    .count();
        }
    
        private String escape( String text ) {
            return text
                    .replace( "&", "&amp;")
                    .replace( "\"", "&quot;")
                    .replace( "<", "&lt;")
                    .replace( ">", "&gt;");
        }
    
        private String push(Todo todo, int id, String xml) {
            return xml
                    + "<Todo"
                    + " id=\"" + id + "\""
                    + " completed=\"" + todo.completed + "\">"
                    + escape(todo.label)
                    + "</Todo>\n";
        }
    
        private void displayCount(DOM dom, int count) {
            String text = "";
    
            switch (count) {
            case 0:
                break;
            case 1:
                text = "1 item left";
                break;
            default:
                text = count + " items left";
                break;
            }
    
            dom.setContent("Count", text);
        }
    
        private void handleCount( DOM dom ) {
            int count = itemsLeft();
    
            if (count != todos.size())
                dom.disableElement("HideClearCompleted");
            else
                dom.enableElement("HideClearCompleted");
    
            displayCount(dom, count);
        }
    
        private void displayTodos( DOM dom ) {
    
            String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<XDHTML>\n<Todos>\n";
    
            ListIterator<Todo> li = todos.listIterator();
            while (li.hasNext()) {
                int index = li.nextIndex();
    
                Todo todo = li.next();
    
                if ((exclude == null) || (todo.completed != exclude))
                    xml = push(todo, index, xml);
            }
    
            xml = xml + "</Todos>\n</XDHTML>";
    
            dom.setLayoutXSL("Todos", xml, "Todos.xsl");
            handleCount( dom );
        }
    
        private void submitNew( DOM dom ) {
            String content = dom.getContent("Input");
            dom.setContent("Input", "");
    
            if (!"".equals(content.trim())) {
                todos.add(0, new Todo(content));
                displayTodos( dom );
            }
        }
    
        private void submitModification( DOM dom ) {
            int index = this.index;
            this.index = -1;
    
            String content = dom.getContent("Input." + index);
            dom.setContent("Input." + index, "");
    
            if (!"".equals(content.trim())) {
                todos.set(index, new Todo(content, todos.get(index).completed));
    
                dom.setContent("Label." + index, escape(content));
    
                dom.removeClasses( new String[][] { { "View." + index, "hide" }, { "Todo." + index, "editing" } } );
            } else {
                todos.remove(index);
                displayTodos( dom );
            }
        }
    
        private void toggle( DOM dom, String id) {
            int index = Integer.parseInt(id);
            Todo todo = todos.get(index);
    
            todo.completed = !todo.completed;
    
            todos.set(index, todo);
    
            dom.toggleClass( "Todo." + id, "completed");
            dom.toggleClass( "Todo." + id, "active");
    
            if (exclude != null)
                displayTodos( dom );
            else
                handleCount( dom  );
        }
    
        private void all( DOM dom ) {
            exclude = null;
    
            dom.addClass("All", "selected");
            dom.removeClasses(new String[][] { { "Active", "selected" }, { "Completed", "selected" } } );
            dom.disableElements(new String[]{"HideActive","HideCompleted"});
        }
    
        private void active( DOM dom ) {
            exclude = true;
    
            dom.addClass("Active", "selected");
            dom.removeClasses(new String[][] { { "All", "selected" }, { "Completed", "selected" } } );
            dom.disableElement("HideActive");
            dom.enableElement("HideCompleted");
    }
    
        private void completed( DOM dom ) {
            exclude = false;
    
            dom.addClass("Completed", "selected");
            dom.removeClasses( new String[][] { { "All", "selected" }, { "Active", "selected" } } );
            dom.disableElement("HideCompleted");
            dom.enableElement("HideActive");
        }
    
        private void clear( DOM dom ) {
    
            todos.removeIf(todo -> todo.completed);
    
            displayTodos( dom );
        }
    
        private void edit(DOM dom, String id) {
            String content = dom.getContent(id);
    
            index = Integer.parseInt(content);
    
            dom.addClasses( new String[][] { { "View." + content, "hide" }, { id, "editing" } } );
            dom.setContent("Input." + content, todos.get(index).label);
            dom.focus("Input." + content);
        }
    
        private void cancel( DOM dom ) {
            int index = this.index;
            this.index = -1;
    
            dom.setContent("Input." + index, "");
            dom.removeClasses( new String[][] { { "View." + index, "hide" }, { "Todo." + index, "editing" } } );
        }
    
        public TodoMVC() {
            System.out.println("Connection detected...");
    
            todos = new ArrayList<>();
    
        }
    
        public void handle( DOM dom, String action, String id ) {
            switch (action) {
                case "Connect":
                    dom.headUp(XDH.readAsset("HeadDEMO.html"));
                    dom.setLayout("", XDH.readAsset("Main.html"));
                    dom.focus("Input");
                    dom.disableElements(new String[]{"HideActive", "HideCompleted"});
                    displayTodos(dom);
                    break;
                case "Submit":
                    if (index == -1)
                        submitNew(dom);
                    else
                        submitModification(dom);
                    break;
                case "Destroy":
                    todos.remove(Integer.parseInt(dom.getContent(id)));
                    displayTodos(dom);
                    break;
                case "Toggle":
                    toggle(dom, id);
                    break;
                case "All":
                    all(dom);
                    break;
                case "Active":
                    active(dom);
                    break;
                case "Completed":
                    completed(dom);
                    break;
                case "Clear":
                    clear(dom);
                    break;
                case "Edit":
                    edit(dom, id);
                    break;
                case "Cancel":
                    cancel(dom);
                    break;
                default:
                    throw new RuntimeException("No or unknown action !!!");
            }
        }
    
        public static void main(String[] args) {
            String dir;
    
            if ( System.getenv("EPEIOS_SRC") == null )
                dir = ".";
            else
                dir = "TodoMVC";
    
            launch("Connect", dir, GUI.DEFAULT, args);
    
            while (true)
                new TodoMVC();
        }
    }

    (non testé).

    La connaissance libre : https://zestedesavoir.com

  • # Il vaudrait mieux te mettre en contact avec quelqu'un qui connait Java

    Posté par  (site web personnel, Mastodon) . En réponse au journal Du développement full-stack en Java. Évalué à 10.

    Je te conseille de te rapprocher d'un développeur Java, au moins pour tes exemples de présentations, pour deux raisons :

    1. Parce qu'il existe déjà un outil qui fait ça, c'est GWT – et que donc tu y seras obligatoirement comparé.
    2. Parce que ton code ressemble tellement peu à du Java que tes exemples te desservent au lieu de te vendre.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: Le scroll est devenu plus lent ? (Chrome-like)

    Posté par  (site web personnel, Mastodon) . En réponse au journal LinuxFr.org : seconde quinzaine de juillet 2018. Évalué à 2. Dernière modification le 01 août 2018 à 15:30.

    J'ignorais l'existence de cette propriété. Après avoir joué avec la démo de Mozilla, je te confirme que mon ressenti vient complètement de l'implémentation de scroll-behavior: smooth; sous Chrome-like quand il y a beaucoup à scroller (et donc c'est pas un problème de perfs, ce qui est le principal).

    C'est peut-être une habitude à prendre : LinuxFr est à ma connaissance le seul site que j'utilise à avoir des pages dans lesquels je fais des sauts aussi longs. Les autres ont soit de la pagination, soit du chargement au scroll, et dans les deux cas ça ne s'utilise pas pareil.

    La connaissance libre : https://zestedesavoir.com

  • # Le scroll est devenu plus lent ? (Chrome-like)

    Posté par  (site web personnel, Mastodon) . En réponse au journal LinuxFr.org : seconde quinzaine de juillet 2018. Évalué à 2.

    pas mal de petites modifications sur le site en ce moment, n'hésitez pas à me dire si vous voyez des choses bizarres, cassées ou qui vous semblent moins bien qu'avant

    J'ai l'impression que le scroll est devenu plus lent qu'avant, au moins sur les moteurs de rendus type Chromium.

    Cas de test :

    1. Trouver une page avec beaucoup de commentaires (comme celle-ci).
    2. Cliquer sur le lien [ qui renvoie au dernier commentaire par ordre chronologique.

    Comportement attendu : ça scrolle rapidement jusqu'au commertaire.

    Comportement obtenu : le scroll est assez lent, me semble-t-il plus lent qu'avant, surtout en début de scroll (c'est lent et ça accélère).

    Comportement observé sous Vivaldi 1.15.1147.55 (Stable channel) (64 bits) (moteur JS : V8 6.5.254.41) et Chromium 68.0.3440.7.

    Firefox 61.0.1 (64 bits) ne semble pas avoir ce souci.

    Ordinateur :

    • Linux Mint 19 Cinnamon à jour,
    • noyau 4.15.0-29-generic, Intel© Core™ i3-7100 CPU @ 3.90GHz × 2,
    • 16 Go de RAM,
    • carte graphique Advanced Micro Devices, Inc. [AMD/ATI] Oland GL FirePro W2100 avec les drivers libres.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: digital, vraiment ?

    Posté par  (site web personnel, Mastodon) . En réponse au journal Pollution numérique. Évalué à 5.

    Ça je suis d'accord, ma question portait vraiment sur les impressions de mails.

    La connaissance libre : https://zestedesavoir.com

  • [^] # Re: digital, vraiment ?

    Posté par  (site web personnel, Mastodon) . En réponse au journal Pollution numérique. Évalué à 7.

    C'est encore fréquent les gens comme « Monique » ? Je pensais naïvement qu'avec l'habitude et les écrans plats qui explosent beaucoup moins les yeux que les écrans cathodiques, on en voyait de moins en moins.

    La connaissance libre : https://zestedesavoir.com