Journal Du développement full-stack en Java

Posté par (page perso) . Licence CC by-sa.
Tags : aucun
8
2
août
2018

Sommaire

Java

Introduction

Dans la continuité de ce journal, voici la version Java d'un prototype de bibliothèque facilitant le développement full-stack en permettant de développer l'interface web d'une application en Java. La version PHP (en attendant d'autres langages) devrait suivre sous peu.

Je ne suis pas très familier avec l'écosystème Java, ni avec Java tout court. Du coup, cette bibliothèque est disponible sous forme de fichier .jar à télécharger. Je suppose qu'il existe d'autres méthodes pour déployer une bibliothèque Java, à l'aide d'outils similaires à npm de Node.js ; toute information à ce sujet est la bienvenue. Pour la même raison, il y a certainement moyen d'améliorer et le code des exemples, et celui de l'API ; n'hésitez pas à m'en faire part dans les commentaires.

Hello, World!

Pour faciliter la compréhension des principes de base, j'ai développé un genre de Hello, World, qui ressemble à ça :

Hello, World! with the Atlas toolkit

Pour l'essayer :

import info.q37.atlas.*;

class Hello extends Atlas {
    public void handle( DOM dom, String action, String id )
    {
        String head = 
        "<title>\"Hello, World !\" example</title>" +
        "<style type=\"text/css\">" +
        " html, body { height: 100%; padding: 0; margin: 0; }" +
        " .vcenter-out, .hcenter { display: table; height: 100%; margin: auto; }" +
        " .vcenter-in { display: table-cell; vertical-align: middle; }" +
        "</style>";

        String html = 
        "<div class=\"vcenter-out\">" +
        " <div class=\"vcenter-in\">" +
        "  <fieldset>" +
        "   <label>Name:</label>" +
        "   <input id=\"input\" maxlength=\"20\" placeholder=\"Enter a name here\"'" +
        "    type=\"text\" data-xdh-onevent=\"input|Typing\"/>" +
        "   <button data-xdh-onevent=\"Clear\">Clear</button>" +
        "   <hr/>" +
        "   <h1>" +
        "    <span>Hello </span>" +
        "    <span style=\"font-style: italic;\" id=\"name\"></span>" +
        "    <span>!</span>" +
        "   </h1>" +
        "  </fieldset>" +
        " </div>" +
        "</div>";

        if ( "Connect".equals( action ) ) {
            dom.headUp( head );
            dom.setLayout("", html);
        } else if ("Typing".equals( action ) ) {
            dom.setContent("name", dom.getContent(id));
        } else if ( "Clear".equals( action ) ) {
            if ( dom.confirm( "Are you sure ?" ) )
                dom.setContents( new String[][] { { "input", ""}, { "name", ""} } );
        } else {
            throw new RuntimeException( "Unknown action '" + action + "' !!!");
        }
    }
    public static void main(String[] args) throws Exception {
        launch("Connect" );

        for (;;)
            new Hello();
    }
}
  • compilez ce fichier :javac -cp Atlas.jar Hello.java,
  • lancez :
    • sous Windows : java -cp .;Atlas.jar Hello, avec un point-virgule (;) comme séparateur pour le classpath),
    • sous les autres plate-formes : java -cp .:Atlas.jar Hello, avec un deux-points (:) comme séparateur pour le classpath).

TodoMVC

Comme exemple plus évolué, il y a l'application du projet TodoMVC, qui ressemble à ça :

The TodoMVC app. with the Atlas toolkit

Pour l'essayer, avec le JDK déjà installé :

  • récupérez le contenu du repository https://github.com/epeios-q37/todomvc-java/ (avec git d'installé : git clone https://github.com/epeios-q37/todomvc-java),
  • placez, à l'intérieur du repository récupéré, le fichier Atlas.jar (https://q37.info/download/assets/Atlas.jar),
  • compilez le fichier source (javac -cp Atlas.jar main.java),
  • lancez, de l'intérieur du repository :
    • sous Windows : java -cp .;Atlas.jar TodoMVC (avec un point-virgule comme séparateur pour le classpath),
    • sous les autres plate-formes : java -cp .:Atlas.jar TodoMVC (avec un deux-points comme séparateur pour le classpath).

Quelques liens

Une documentation de l'API de cette bibliothèque est disponible à l'adresse https://atlastk.org/api/java/0.2. Le reste du site n'a pas encore été mis à jour ; il le sera lorsque cette nouvelle API sera également disponible pour PHP. En particulier, contrairement à ce qui indiqué sur le site, l'utilisation de XSL(T) n'est plus obligatoire (mais néanmoins toujours possible) ; vous pouvez générer le code HTML nécessaire a la mano, ou avec le moteur de template de votre choix.

Voici les liens vers les sources des différents composants logiciels :

Les deux premiers sont installés localement, mais seul le code Java destiné à être exécuté par le JRE est utilisé (le code source C++ contenu dans le répertoire src n'est, lui, pas utilisé). Les deux derniers contiennent du code natif, mais ne sont pas installés localement.

  • # Il manque un truc

    Posté par . Évalué à 10.

    D'abord je plusse le journal parce que tu es clairement motivé à développer et faire vivre tes idées.

    Par contre, je ne saurais expliquer quoi, mais il manque quelque chose dans les présentations. Comme pour UnJSq , j'ai l'impression de passer à côté de l'objectif. J'ai compris qu'il s'agit de s'affranchir du JS en front-end et de tout faire avec le même langage côté back mais le fonctionnement reste flou.

    Dans le dépôt todomvc-java , on a du Java, du HTML, du XSL, et du JS. Qd on ouvre, le main.java il y a même du XDHTML qui, si j'en crois Google dont le 1er résultat ramène sur ton site, est un moyen de coder des interfaces avec du HTML et du C++.

    Je ne suis pas un dieu du code, loin de là, mais en général j'arrive à saisir globalement les objectifs et la méthode des frameworks (sur http://todomvc.com/ par exemple). Là c'est fouillis. Il y a un ptit côté "magique" ou "boîte noire". Par exemple dans la phrase "Les deux derniers contiennent du code natif, mais ne sont pas installés localement.". Je comprends qu'il y aura des appels vers l'API mais elle est où ? Comment je fais pour la mettre chez moi ? La description des "2 derniers composants" sur Github n'explique rien, et le lien sur NPM n'est pas bon : http://q37.info/tools/xdhq/home

    Ça fait aussi beaucoup de nouveaux noms de technos (vu qu'elles sont développées par toi) à emmagasiner : XDHTML (qui ressemble trop à XHTML et DHTML du coup Google propose de corriger), njsq, xdhelcq, … Si on veut comprendre véritablement comment ça marche, on s'y perd !

    Bref soit je n'ai pas le niveau et ne suis donc pas le bon public pour ce logiciel (ce qui est bien possible !), soit y'a un soucis de clarté. Sans aucune malice, ce que je me suis dit après avoir parcouru toutes tes pages : "Si il faut que je passe autant de temps pour comprendre comment me passer de JS grâce à AtlasTk j'aurai ptêt plus vite faite d'apprendre JS."

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

      Posté par (page perso) . Évalué à 2. Dernière modification le 03/08/18 à 10:02.

      Il y a clairement un problème de communication. Le problème, c'est que je n'ai aucun talent en la matière. En outre, les technos que j'expose dans ce journal, d'une, c'est moi qui les ai développées, et, de deux, je les utilise quotidiennement. C'est donc difficile pour moi de me mettre à la place de quelqu'un qui les découvre, tant il y de choses qui me semblent être évidentes les concernant, et qui ne le sont en fait pas du tout.

      Le problème est le même pour d'autres de mes technos, au sujet desquels j'ai écrit plusieurs journaux. En terme de communication, un site comme http://q37.info/ est clairement inadapté.

      J'ai donc changé de stratégie en me concentrant sur une seule technologie, accessible à partir de plusieurs langages (Java, Node.js et PHP ; d'autres langages sont prévus), et en lui consacrant un site mieux structuré que http://q37.info/, à savoir http://atlastk.org/. Malgré mes efforts (et aussi mon manque de connaissances en matière de SEO), ce n'est pas suffisant, comme on peut le constater à l'activité des forums.

      Je suis freelance. Or, les SSII (pardon, les ESN) ne veulent pas de moi, à cause de mon profil atypique (C++, ce n'est pas ce qu'il y a de plus populaire et, en plus, j'utilise mes propres bibliothèques, et pas celle fournies en standard), bien qu'ils reconnaissent que j'ai une approche qui me permettent d'être bien plus polyvalent que la majorité des développeurs. Or, hors SSII ESN, la prospection est difficile, déjà que ce n'est pas une activité qui me passionne.

      Cette bibliothèque me sert donc de vitrine commerciale, pour me faciliter la prospection. Mais surtout, j'envisage de monter une structure commerciale pour la valoriser d'une manière ou d'une autre. Malheureusement, vu notamment mes talents de commerciaux et en marketing, et comme souligné dans ces commentaires, c'est le genre de projet qu'on ne peut monter seul. Et les partenaires adéquats ne se trouvent pas sous le pas d'un cheval.

      D'un point de vue technique, il faut savoir que le cœur de cette bibliothèque s'appuie sur du C++. Or, les gestionnaires de paquets, comme npm pour Node.js ou composer pour PHP, ne sont pas conçus pour déployer du code natif. Ce qui rend l'installation de cette bibliothèque compliquée.

      Pour contourner ce problème, j'ai conçu un mode de fonctionnement de cette bibliothèque qui permet de déporter sur un serveur la partie native, à laquelle accède la partie (non native) de la bibliothèque déployée localement. Ça facilite son installation, le but étant de fournir un moyen facile de tester cette bibliothèque, notamment en évitant d'avoir à déployer un serveur. Le code natif installé sur le serveur est celui des repository xdhwebq-cli et xdhq, et le code (non natif) installé localement par l'utilisateur est celui des repository atlas-java et xdhq-java (atlas-node et xdhq-node pour la version Node.js).

      Avec maintenant une procédure d'installation simplifiée, qui évite aux utilisateurs d'avoir affaire à du code natif, je me concentre sur la mise au point de l'API telle que décrite dans https://atlastk.org/api/java/0.2 (https://atlastk.org/api/node/0.2 pour Node.js).

      J'envisage d'animer, à la rentrée, des ateliers de développement qui s'appuient sur cette bibliothèque. Pour quelqu'un qui soit un tant soit peu familier avec un des langages pour lesquels cette bibliothèque est disponible (Java, Node.js ; PHP sous peu, et d'autres langages plus tard), ces ateliers seront l'occasion de mieux comprendre les technos au cœur du web (HTML, CSS et DOM) en apprenant à les manipuler grâce à cette bibliothèque. Cette bibliothèque est donc conçue pour un très large public, et si elle n'est pas perçue comme telle, c'est clairement qu'il y a un souci de clarté (si je puis dire).

      N'hésitez donc pas à signaler précisément ce qui manque de clarté, même si c'est des points très techniques ; ça me sera certainement très utile pour améliorer le contenu du site ainsi que le contenu des ateliers…

      Freelance en ingénierie logicielle.

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

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

        Alors, je ne suis pas sûr que tu apprécies des masses ce message mais ça fait plusieurs fois que ce que tu dis me choque un peu. Et comme tu en remets une couche régulièrement, je vais me permettre.

        Or, les SSII (pardon, les ESN) ne veulent pas de moi, à cause de mon profil atypique (C++, ce n'est pas ce qu'il y a de plus populaire et, en plus, j'utilise mes propres bibliothèques, et pas celle fournies en standard), bien qu'ils reconnaissent que j'ai une approche qui me permettent d'être bien plus polyvalent que la majorité des développeurs.

        Ben oui, c'est un problème de ne vouloir utiliser que ses propres bibliothèques plutôt que ce qui est universellement reconnu comme standard. C'est contre productif et je ne pense pas que cela t'aide à progresser non plus.

        Et je ne pense pas que ce soit ce qu'on peut appeler être polyvalent…

        C'est aussi un problème de vouloir utiliser un marteau (le C++) pour visser (faire du web). Il y a un moment, il faut savoir choisir un outil adéquat. D'autant qu'entre PHP, Ruby, Python, NodeJS, Java… il y a quand même un sacré choix de composants pour faire du web avec énormément de saveurs différentes. Alors, oui, je suis sûr qu'on peut trouver des frameworks C++ pour faire du web mais cela reste hyper confidentiel et mon humble avis est que ce n'est pas hyper adapté.

        Un autre souci, c'est que, même si tes technologies sont libres, tu ne libères pas tes clients mais tu les enfermes car personne d'autre que toi ne les maîtrise. Et vu la manière dont elles sont conçues, je ne pense pas que cela change ni que ce soit un problème de communication seulement.

        Rien que le fait que tu essaies de marier du C++ et du NodeJS, ça va faire fuir la majorité des gens : très peu de développeurs web font du C++. Et encore moins du C++ custom avec tes bibliothèques à toi. Recoupe ça avec les développeurs NodeJS et tu comptes tes potentiels utilisateurs sur les doigts de la main.

        Si tu veux répondre au mieux aux besoins de tes clients, essaie d'utiliser des projets Open Source existants avec une vraie communauté : tu te concentreras sur leur besoin et ils auront une solution plus pérenne et plus de capacité à changer de presta si nécessaire. De plus, ce sera l'occasion d'apprendre plein de choses, je ne jugerai pas ton C++ vu que je n'y connais rien mais pour ce qui est du Java, il y a énormément de lacunes et pas que des lacunes dues à la méconnaissance du langage.

        Dans une veine assez proche de ce que tu veux faire, il y a Wicket, qui est un petit projet Apache très sympa dont les principes sont assez simples et qui est très bien conçu. Ca et du Spring Boot et tu auras quelque chose de plus attrayant.

        Ca n'est évidemment que mon avis mais je pense que tu devrais t'ouvrir à d'autres choses et t'ouvrir à apprendre et à être plus flexible, plutôt que rester arquebouté sur ce que tu connais.

        C'est ça la polyvalence.

        Désolé si c'est un peu dur mais je pense que c'est important que ça te soit dit.

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

          Posté par (page perso) . Évalué à -4.

          Alors, je ne suis pas sûr que tu apprécies des masses ce message mais ça fait plusieurs fois que ce que tu dis me choque un peu. Et comme tu en remets une couche régulièrement, je vais me permettre.

          Oh, ne t'en fait pas. Je suis habitué à ce genre de message. Il n'y a qu'à voir les commentaires en réponses aux journaux dont j'ai donné la liste dans mon précédent commentaire. Beaucoup ont essayé de me convaincre, avec des arguments à l'emporte-pièce, que je faisais fausse route, sans jamais réussir à étayer leurs affirmations avec des éléments concrets. On va voir si ça va être différent cette fois-ci…

          Or, les SSII (pardon, les ESN) ne veulent pas de moi, à cause de mon profil atypique (C++, ce n'est pas ce qu'il y a de plus populaire et, en plus, j'utilise mes propres bibliothèques, et pas celle fournies en standard), bien qu'ils reconnaissent que j'ai une approche qui me permettent d'être bien plus polyvalent que la majorité des développeurs.

          Ben oui, c'est un problème de ne vouloir utiliser que ses propres bibliothèques plutôt que ce qui est universellement reconnu comme standard. C'est contre productif et je ne pense pas que cela t'aide à progresser non plus.

          OK, c'est un problème d'utiliser mes propres bibliothèques plutôt que celles standards. C'est bien ce que j'explique dans mon commentaire. Par contre, vu mon historique par rapport au C++, que je détaille dans ce commentaire, je ne vois pas en quoi c'est contre productif et que cela ne m'aide pas à progresser…

          Et je ne pense pas que ce soit ce qu'on peut appeler être polyvalent…

          Ce que j'appelle être polyvalent, c'est être en mesure de développer n'importe quel type d'application. Et je pense qu'on est plus efficace si l'on utilise toujours le même langage quelque soit le type d'application, plutôt que d'avoir à jongler entre plusieurs langages selon le type d'applications à développer… On maîtrise plus facilement un langage seul que plusieurs…

          C'est aussi un problème de vouloir utiliser un marteau (le C++) pour visser (faire du web). Il y a un moment, il faut savoir choisir un outil adéquat. D'autant qu'entre PHP, Ruby, Python, NodeJS, Java… il y a quand même un sacré choix de composants pour faire du web avec énormément de saveurs différentes. Alors, oui, je suis sûr qu'on peut trouver des frameworks C++ pour faire du web mais cela reste hyper confidentiel et mon humble avis est que ce n'est pas hyper adapté.

          Les outils C++ existants ne sont en effet guère adaptés pour faire du développement web. Mais cela ne signifie pas que le C++ lui-même n'est guère adapté pour faire du web. D'ailleurs, la bibliothèque que j'ai développé, moi, je la trouve parfaitement adaptée au web. Bien plus que celles qu'on trouve (et qui sont d'ailleurs plus souvent des frameworks) pour, je cite, PHP, Ruby, Python, NodeJS, Java… Et question diversité, on repassera. Avec ces langages, soit on fait du web à l'ancienne, du type CGI, soit on est obligé de se coltiner du JavaScript pour le front-end ou un des ces encombrants frameworks MVC. Il y en a qui trouve ça adapté, mais, désolé, je ne suis pas de cette avis. Et je ne suis pas le seul…

          Un autre souci, c'est que, même si tes technologies sont libres, tu ne libères pas tes clients mais tu les enfermes car personne d'autre que toi ne les maîtrise. Et vu la manière dont elles sont conçues, je ne pense pas que cela change ni que ce soit un problème de communication seulement.

          Tes arguments sont applicables à toute technologie naissante, y compris tous les langages que tu as cités précédemment. À leur lancement, peu de personnes les maîtrisaient. Si leurs concepteurs s'étaient arrêtés à des arguments comme les tiens, aucun de ces langages n'aurait percé…

          Rien que le fait que tu essaies de marier du C++ et du NodeJS, ça va faire fuir la majorité des gens : très peu de développeurs web font du C++. Et encore moins du C++ custom avec tes bibliothèques à toi. Recoupe ça avec les développeurs NodeJS et tu comptes tes potentiels utilisateurs sur les doigts de la main.

          Node.js, c'est développé en C++, donc ma bibliothèque n'est pas une union contre nature ! Et ma bibliothèque n'est qu'un module de plus parmi tout ceux que l'on trouve sur http://npmjs.com/, et elle s'utilise comme n'importe lequel de ces modules. Les utilisateurs n'ont pas plus à se préoccuper du fait qu'elle soit codée en C++ que pour n'importe lequel des modules fournis en standard avec Node.js.

          Si tu veux répondre au mieux aux besoins de tes clients, essaie d'utiliser des projets Open Source existants avec une vraie communauté : tu te concentreras sur leur besoin et ils auront une solution plus pérenne et plus de capacité à changer de presta si nécessaire. De plus, ce sera l'occasion d'apprendre plein de choses, je ne jugerai pas ton C++ vu que je n'y connais rien mais pour ce qui est du Java, il y a énormément de lacunes et pas que des lacunes dues à la méconnaissance du langage.

          Déjà, mes clients sont tout à fait satisfait de mes prestations ; ce n'est donc pas ça le problème. Surtout parce que, avec ce que je leur ai réalisé, je répondais mieux à leur besoin que ce que n'importe quel autre développeur a pu leur proposer (je sais que ça fait prétentieux, mais je ne fais que répéter ce qu'ils m'ont dit). Entre un logiciel pérenne qui ne répond pas à leurs besoins, et un autre, peut-être moins pérenne, mais qui répond parfaitement à leurs attentes, ils ont vite choisi…

          Ç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 !

          Dans une veine assez proche de ce que tu veux faire, il y a Wicket, qui est un petit projet Apache très sympa dont les principes sont assez simples et qui est très bien conçu. Ca et du Spring Boot et tu auras quelque chose de plus attrayant.

          Possible, mais j'aimerais savoir en quoi c'est plus attrayant. Et, pour aussi attrayant que ce soit, ça n'a pas l'air d'être beaucoup utilisé (comparativement à d'autres solutions). Donc, il est tout à fait possible que, pour certains, ma solution soit plus attrayante que la plupart de celles qui existent, y compris Wicket.

          Ca n'est évidemment que mon avis mais je pense que tu devrais t'ouvrir à d'autres choses et t'ouvrir à apprendre et à être plus flexible, plutôt que rester arquebouté sur ce que tu connais.

          À travers cette bibliothèque, et parce qu'elle est implémentée en C++, j'ai pu m'ouvrir à Java, Node.js, PHP. Et ce n'est qu'un début. Comme le C++ s'interface avec quasiment la totalité des langages existants, j'ai des perspectives d'ouverture (pour moi, et pour ma bibliothèque) quasi infinies. Alors, désolé, mais je reste à mon C++. Je ne pense pas qu'il y ai beaucoup de développeurs Java qui peuvent s'ouvrir à PHP de cette manière…

          C'est ça la polyvalence.

          Ê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.

          Désolé si c'est un peu dur mais je pense que c'est important que ça te soit dit.

          Encore une fois, beaucoup d'affirmations sans aucun élément concret pour les étayer.

          Rien que pour revenir à ma bibliothèque, celle-ci étant un binding Java d'une bibliothèque C++, C++ qui n'est soit-disant pas adapté au web. Il ne devrait pas être difficile de coder l'équivalent de l'application Hello, World! présentée dans ce journal, en Java, ou d'ailleurs avec n'importe quel autre langage, en s'appuyant sur les technos existantes, et qui mette en évidence la supériorité de cette implémentation sur à celle que j'ai réalisée avec ma bibliothèque. Ça ne devrait pas prendre plus de cinq minutes, vu que mon implémentation se code en moins de temps que ça, installation comprise… Bien entendu, il faut que cette implémentation offre les mêmes possibilités d’accès aux ressources du langage sélectionné que mon implémentation. Une page web, avec du code JavaScript, ça se réalise en moins de cinq minutes, mais ça ne répond pas au cahier des charges…

          Freelance en ingénierie logicielle.

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

            Posté par (page perso) . Évalué à 10. Dernière modification le 03/08/18 à 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

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

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

              Ê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.

              Non mais, sérieux, comparer le C++ avec cette horreur de PROGRESS

              Après, je n'impose à personne de n'utiliser qu'un seul et même langage. S'il y en a qui préfèrent en utiliser plusieurs, grand bien leur fasse, mais je ne vois pas au nom de quel principe, parce que à eux, ça leur réussit, il ne serait pas possible de faire tout aussi bien avec un seul langage, à fortiori lorsqu'il s'agit du C++

              Ç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.

              J'avais prévenu que je n'y connaissais pas grand chose en Java !

              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.

              OK.

              Le fichier n'est pas dans un package.

              OK.

              Deux classes (package-protected) dans le même fichier.

              Là, je ne comprend pas trop.

              Tu utilises des new String("…").

              Ah. Ça pose problème ? Si je fais String toto = "tutu", je suis bien obligé de faire un toto = new String("...") si je veux réutiliser toto, non ?

              int index = this.index; ?!

              D'ailleurs tu passes ton temps à masquer la variable de classe index avec des variables locales index.

              Comme je modifie this.index juste après, il fallait que je stocke sa valeur. Bon, j'aurais pu modifier this.index à la fin, et l'utiliser à la place de la variable locale, mais je ne trouvais pas ça conceptuellement très propre.

              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).

              Pour l'itérateur, je ne connaissais pas. Pour la boucle if/else, je pense que c'est par rapport au switch. C'est pour rester compatible avec Java < à 1.7, vu que les switch avec des String ne sont disponibles qu'à partir de cette version. Bon, maintenant, si on me dit que ce n'est pas la peine de rester compatible avec ces versions-là, je switcherai volontiers du if/else au switch.

              if ( false ) { !?

              Je mets à true pour certains essais, comme ça la todo list n'est pas vide au lancement.

              La ligne 273 ressemble beaucoup à une boucle infinie.

              Parce que c'en est une. Si j'ai bien compris, il faudrait que le new rende tout de suite la main, et qu'il soit suivi d'une fonction genre launch() qui, elle, serait bloquante.

              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.

              Il devait y avoir une méthode qui lançait Exception dedans à un moment, je pense…

              Tu appelles des méthodes avec leur package complet au lieu de les importer (info.q37.xdhq.XDH.readAsset).

              Ah, je ne savais pas que c'était déconseillé.

              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.

              Toute la partie XML a été fait en mode quick and dirty, parce que je n'ai pas trouvé de bibliothèque simple à installer qui le prenne en charge, et que, de toute manière, rien n'est imposé à l'utilisateur, pour peu qu'il fournisse à la fin une chaîne contenant du XML valide. Par contre, s'il existe une méthode toute faite pour remplacer mon escape(), je suis preneur…

              Tout est en vrac dans un seul fichier : personnellement je ne comprends pas ce que fait ce code à sa simple lecture.

              Je voulais éviter la multiplication des fichiers, vu que ça a tendance à effrayer…

              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.

              Je pense que oui… Ceci dit, je ne pensais pas qu'on pouvais nuller un type primitif…

              Dans la méthode push tu modifies ton paramètre xml.

              C'est sûr que la méthode que tu proposes est mieux, mais il me semblait avoir essayé un truc similaire, et cela ne fonctionnait pas. Peut-être un problème dû à l'utilisation d'une version antérieure de Java ?

              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 ?

              Si le nombre de todos actifs est différent du nombre total de todos, alors ça signifie qu'il y a des todos achevés, et donc il faut afficher le bouton permettant leur effacement, sinon il faut le cacher.

              D'ailleurs le projet s'appelle TODO MVC mais n'est pas du tout du MVC ?!

              C'est le but. Le projet dont est tiré l'application s'appelle TodoMVC et met effectivement en œuvre une architecture MVC, parce que c'est requis par la plupart des frameworks les plus populaires. Mais pourquoi utiliser cette architecture si l'on peut s'en passer ?

              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.

              On utilise quoi, alors, à la place de System.out pour afficher quelque chose dans la console ?

              Je passe aussi sur ton API qui me semble très étrange, comme ces méthodes qui attendent un tableau de tableau de String.

              En fait, c'est pour passer des paires de Strings, chaque paire étant une clef associée à une valeur. Si on passe deux tableaux de String, un pour les clefs, l'autre pour les valeurs, on perd le lien direct clef/valeur. Du coup, qu'est-ce que je peux utiliser à la place d'un tableau de tableau de String ?

              (non testé).

              (et pourtant, il n'y a vraiment pas grand chose à installer pour ça…).

              En tout cas, merci d'avoir pris le temps de suggérer des améliorations. Je modifierais les fichiers concernés en conséquence, une fois que j'aurais terminé le binding PHP (je préviens d'avance, je ne m'y connais pas plus en PHP qu'en Java).

              Freelance en ingénierie logicielle.

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

                Posté par (page perso) . É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

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

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

                  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.

                  Oui mais, aussi bancal que ce soit, c'est toujours plus facile que d'avoir à partir de zéro. En outre, aussi expérimenté que soit le développeur, je doute qu'il y en ai beaucoup qui sachent interfacer du PHP avec du C++, mais je me trompe peut-être…

                  Ceci dit, pour le coup, j'ai peut-être une connaissance faisant du PHP qui pourra m'aider…

                  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.

                  Soit.

                  • Il n'y a pratiquement aucune raison de faire new String() en Java. En fait, je n'en vois aucune.

                  En fait, si je comprend bien en faisant [String] tata = "tutu;", le new est fait automatiquement, c'est cela ?

                  • 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++ ?

                  Franchement, je ne vois pas le problème, mais bon…

                  • L'itérateur, c'est Java 5 (2004).

                  OK, je n'aurais donc aucun scrupule à l'utiliser.

                  • Aucun intérêt à faire du Java < 8 en 2018 sur un nouveau projet.

                  OK.

                  • On ne commite pas les if de test, ou alors on les commente – j'imagine que c'est la même chose en C++ ?

                  OK ! Pas taper ! Je vais mettre un commentaire !

                  • Tu as bien compris pour le new.

                  Super !

                  • 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++ ?

                  Sauf qu'en C++, le compilateur n'impose jamais une correspondance entre le nom d'un fichier et son contenu, donc on est plus facilement tenté de d'accumuler les classes dans un seul et même fichier (je ne dis pas que c'est une bonne chose !)

                  • 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.

                  Je connaissais les Integer, je les utilise dans certains contextes, mais là il me semblait plus pertinent d'utiliser un int, pensant, sans doute à tord, que c'est plus léger qu'un Integer.

                  • Le code que j'ai proposé pour le paramètre xml fonctionne normalement depuis Java 1.0.

                  Et je vais l'adopter.

                  • 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++.

                  L'une comme l'autre forme me convienne parfaitement, mais si ça peut faciliter la lecture à certains…

                  Par contre, le ShowBidule/HideBidule, faut voir, car ce sont des identifiant d'éléments de style, et ça risque de les alourdir.

                  • Un code qui n'est pas un pur test devrait utiliser un logger (y'en a un dans l'API standard).

                  S'il n'y a effectivement rien à installer de plus, je vais probablement l'utiliser.

                  • Un lien clé-valeur en Java, c'est une Map…

                  OK. Je vais voir ça.

                  • 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.

                  Et tu as lancé le bordel dans un environnement sans interface graphique ? Je subodore que c'est ce qui est arrivé à barmic, mais je n'en ai pas la confirmation…

                  En tout cas merci pour tes retours…

                  Freelance en ingénierie logicielle.

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

                    Posté par (page perso) . É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 . Évalué à 1.

                Ah. Ça pose problème ? Si je fais String toto = "tutu", je suis bien obligé de faire un toto = new String("…") si je veux réutiliser toto, non ?

                Non ? Tu peut très bien écrire :

                String toto = "foo";
                toto = "bar"

                Je ne sais pas trop ce que tu entends par réutiliser, mais les String son immuables en java. Tu peux modifier leur référence, mais pas leur contenu.

                Pour l'itérateur, je ne connaissais pas. Pour la boucle if/else, je pense que c'est par rapport au switch. C'est pour rester compatible avec Java < à 1.7, vu que les switch avec des String ne sont disponibles qu'à partir de cette version. Bon, maintenant, si on me dit que ce n'est pas la peine de rester compatible avec ces versions-là, je switcherai volontiers du if/else au switch.

                Le support de sécurité de Java7 n'existe presque plus (il reste certains support en payant « coucou RedHat ») et celui de java 8 se termine bientôt (pour ce qui est de l'usage gratuit). Tu n'a pas une communauté qui te dis que c'est difficile pour elle de passer à Java10 donc ne t'embête pas à supporter des vieilleries.

                Il devait y avoir une méthode qui lançait Exception dedans à un moment, je pense…

                Ça reste une mauvaise pratique.

                Je pense que oui… Ceci dit, je ne pensais pas qu'on pouvais nuller un type primitif…

                On ne peux pas, mais on peut utiliser Integer.

                On utilise quoi, alors, à la place de System.out pour afficher quelque chose dans la console ?

                Un logger.

                En fait, c'est pour passer des paires de Strings, chaque paire étant une clef associée à une valeur. Si on passe deux tableaux de String, un pour les clefs, l'autre pour les valeurs, on perd le lien direct clef/valeur. Du coup, qu'est-ce que je peux utiliser à la place d'un tableau de tableau de String ?

                Une Map<String, String> (voir) comme en C++ (avec std::map) ou dans tous les autres langages.

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

                  Posté par . Évalué à 4.

                  Tu n'a pas une communauté qui te dis que c'est difficile pour elle de passer à Java10 donc ne t'embête pas à supporter des vieilleries.

                  Depuis java 9 le cycle de release et support a changé. Java 8 était la dernière release à offrir du support long terme (sécu + bug fixes) sur plusieurs années.

                  En ce moment plus personne n'offre gratuitement, libre ou non, une version maintenue sur plus de 6 mois. Ça sera aussi le cas avec Java 11 puisque le binaire LTS ne sera dispo que pour les clients Oracle. Let gratos s'arrête à 6 mois.

                  Donc la communauté actuellement elle est actuellement toujours en Java 8. L'utilisation de 9 et 10 est ultra confidentielle (9 est EOL, 10 le sera dans 2 mois). Et ca commence à paniquer à 150 jours de la fin du LTS de Java 8 sans aucune autre solution que de faire un chèque à 5 zéro à Oracle ou Azul ou de monter de version majeure tout les 6 mois (en priant pour que tout ton écosystème de dependence suive le rythme ce qui est une bonne blague).

                  TL;dr pour une lib j'écrirai encore du 8 pendant un moment. Ça va patiner pendant un moment.

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

                    Posté par . Évalué à 4. Dernière modification le 04/08/18 à 10:32.

                    C'est plus compliqué que ça.

                    Il y a une base OpenJDK qui est entièrement libre. C'est la base de tout le runtime Java. Ensuite OpenJDK possède des distributions qui sont plus ou moins supportées par ceux qui les distribuent. Il y a évidement Oracle, mais aussi RedHat et IBM qui distribue leur propre distribution du JDK avec un aspect commercial différent et un support différent. Du coup :

                    La prochaine version LTS c'est effectivement la version 11 qui sera supporté par Oracle de septembre prochain jusqu'à septembre 2023 (toujours selon wikipedia), la LTS suivante sera la version 14 qui sortira en mars 2020. Si le support est bien celui annoncé par Oracle (IBM et RH n'ont pas communiqué sur leur support post-java9) alors :

                    • tous les 6 mois une version majeure de Java sort (en mars et en septembre)
                    • toutes les 3 versions sont des versions LTS
                    • les versions LTS seraient supportées 5 ans alors que les autres versions le seront pendant 6 mois

                    Le non passage à Java9 ou 10 s'explique aussi beaucoup par la frilosité du passage à jigsaw (et l'absence de killer-feature). Il y a encore beaucoup d'appli qui fonctionne sur des version 7 ou inférieures.

                    Dans tout cela il y a l'initiative AdoptOpenJDK qui est communautaire bien qu'épaulé entre autre par IBM et qui fourni leur propre distribution, mais je ne connais pas le support qu'ils appliquent.

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

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

                Par contre, s'il existe une méthode toute faite pour remplacer mon escape(), je suis
                preneur…

                La référence: https://www.owasp.org/index.php/OWASP_Java_Encoder_Project

                PS: L'échappement des inputs web c'est pas quelque chose qui se gère en trois lignes, les règles changent en fonction du contexte.

                Le plus gros soucis avec l'utilisation de C++ pour la gestion d'interface Web a mon sens n'a rien a voir avec le language, mais tout a voir avec le fait que comme très peu de personnes l'utilisent dans ce but, tout l'ecosystème de la sécurité web va être à refaire …

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

                  Posté par (page perso) . Évalué à 1. Dernière modification le 05/08/18 à 14:00.

                  Par contre, s'il existe une méthode toute faite pour remplacer mon escape(), je suis preneur…

                  La référence: https://www.owasp.org/index.php/OWASP_Java_Encoder_Project

                  Merci !

                  PS: L'échappement des inputs web c'est pas quelque chose qui se gère en trois lignes, les règles changent en fonction du contexte.

                  C'est vraiment juste un truc que j'ai codé en mode quick and dirty, pour gérer les cas les plus évidents (&, <, "…).

                  Le plus gros soucis avec l'utilisation de C++ pour la gestion d'interface Web a mon sens n'a rien a voir avec le language, mais tout a voir avec le fait que comme très peu de personnes l'utilisent dans ce but, tout l'ecosystème de la sécurité web va être à refaire …

                  Oui, c'est possible. D'un autre coté, vu le nombre d'outils qui existent pour faire du développement web dans d'autres langages, il y en a probablement pas mal qui ont une licence suffisamment permissive pour pouvoir s'en inspirer, voire carrément copier le code concerné, puisque pas mal de ces langages sont codés en interne en C ou en C++

                  Freelance en ingénierie logicielle.

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

        Posté par (page perso) . Évalué à 10. Dernière modification le 03/08/18 à 14:01.

        Cette bibliothèque me sert donc de vitrine commerciale, pour me faciliter la prospection. Mais surtout, j'envisage de monter une structure commerciale pour la valoriser d'une manière ou d'une autre.

        Je n'ai pas bien compris: tu comptes vendre du service autour de cette bibliothèque? Il y a sans doute plus de toolkit web que d'étoiles dans le ciel, je ne sais pas si c'est un marché très porteur…

        Incubez l'excellence sur https://linuxfr.org/board/

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

          Posté par (page perso) . Évalué à -2.

          La quantité ne fait pas la qualité…

          La plupart des solutions les plus populaires s'appuient sur une architecture MVC, et je n'en vois pas l'intérêt. Ça fait des décennies que l'on développe des application avec une interface native, sans qu'on ai jamais eu besoin de recourir à MVC. Pourquoi cela serait différent avec les applications web ?

          Pour répondre à ta question, oui, je compte vendre du service, mais cela ne constitue qu'une partie du business model envisagé…

          Freelance en ingénierie logicielle.

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

            Posté par . Évalué à 5.

            Ça fait des décennies que l'on développe des application avec une interface native,

            Comme pour la prose, des fois on fait du MVC sans le savoir. Il y a plein de bibliothèques de création d'interfaces "natives" qui font du MVC. Mais si c'est pas écrit dessus, tu peux passer à côté de l'info.

            Plus généralement, pour gérer des listes de très grandes tailes, ça reste la solution la plus simple. Pour réutiliser un max de code, ça reste la solution la plus simple.

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

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

              Je ne dis pas que MVC n'est pas utile dans certains cas, mais de là à l'utiliser systématiquement…

              En outre, ce n'est pas parce que des toolkits offrent des facilités pour faire du MVC que ces facilités sont utilisées…

              À moins que tu ne suggères qu'il y ai des toolkits dédiés au développement d'interfaces natives qui fonctionnent, en interne, selon le modèle MVC. Je serais curieux de voir un tel toolkit de prés, pour peu qu'il soit un tant soi peu populaire…

              Freelance en ingénierie logicielle.

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

                Posté par . Évalué à 3.

                Je serais curieux de voir un tel toolkit de prés, pour peu qu'il soit un tant soi peu populaire…

                Donc la popularité devient un argument ? Tu souhaite sincèrement utiliser cet argument ? Mais soit, je ne suis pas un spécialiste, mais wikipedia liste Qt, MFC ou Cocoa (en regardant de plus près il semble chacun l'implémenter à leur façon Model/View pour Qt, MVVM pour Microsoft et MVC ou MVVM pour cocoa). Paille poutre…

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

                  Posté par (page perso) . Évalué à -1.

                  Je n'ai jamais prétendu qu'il n'est pas possible d'utiliser MVC pour une interface native, mais il me semble que MVC, c'est plutôt presque la règle pour les interfaces web, alors que c'est plutôt l'exception pour les interfaces natives…

                  Freelance en ingénierie logicielle.

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

                    Posté par . Évalué à 7.

                    Heu, non non, mvc est la norme en natif.
                    Regarde ce que font Microsoft, Apple et google si tu me crois pas.

                    Linuxfr, le portail francais du logiciel libre et du neo nazisme.

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

                      Posté par (page perso) . Évalué à -3. Dernière modification le 04/08/18 à 12:32.

                      Ce n'est pas parce que les plus gros l’utilisent que c'est la norme…
                      Plus précisément, je ne me rappelle pas avoir jamais vu quoique ce soit de relatif au MVC dans les codes d'application natifs que j'ai pu voir, ni dans les tutoriaux des différents toolkits (s'ils l'abordent, ça doit vraiment être dans les chapitres les plus avancés)…

                      Mais ça m'intéresse de voir comment c'est mis en œuvre. Tu parles de quoi exactement quand tu me suggères de regarder ce que font Microsoft, Apple et google ?

                      Freelance en ingénierie logicielle.

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

                        Posté par . Évalué à 2.

                        Je suis freelance C++ aussi et je fais du MVC dans la majorité de mes projets. Tout simplement pour la portabilité, la réutilisation de code et les tests autos.
                        J'ai ai si des versions en ligne de commandes ou Android de mes applications PC natives.

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

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

                          Il y a moyen de voir les sources d'une de tes appli. avec interface native qui utilise MVC ?

                          Freelance en ingénierie logicielle.

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

                            Posté par . Évalué à 2.

                            Oui ok, il s'agit d'un jeu de Tarot local et en ligne avec un serveur dédié et deux clients différents, un en ligne de commandes et l'autre graphique.

                            Le modèle est constitué de messages Json streamés sur TCP. Le view est soit une console, soit un client Qt. Le contrôleur est une classe utilitaire du protocole réseau.

                            Sources du jeu

                            Te prends pas la tête avec ces trucs MVC.
                            L'important est de découpler les choses, ne pas mettre du code appli/réseau dans l'IHM, fonctionner par interfaces virtuelles et en composants, prévoir dès le début d'une appli deux cibles radicalement différentes, ça aide à séparer les choses.

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

                        Posté par . Évalué à 5.

                        Apple : https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

                        MVC is central to a good design for a Cocoa application.

                        Microsoft (MVVM est un dérivé de MVC) : https://blogs.msdn.microsoft.com/ivo_manolov/2012/03/17/model-view-viewmodel-mvvm-applications-general-introduction/

                        MVVM is a central concept in WPF, Silverlight, WindowsPhone and Windows 8 development […]

                        Il faut vraiment continuer ?

                        Tu peux critiquer MVC. Il y en a qui le font très bien et même des gens qui n'utilisent pas du tout, mais le balayer par un « ça me paraît pas utile » et nous expliquer que tu n'arrive pas à tester ton code parce que ça te prends trop de temps, c'est très très léger (et non personne va te prendre par la main pour que tu y passe, tu fais bien comme tu veux et c'est à toi de faire l'effort de comprendre pourquoi autant de gens l'utilisent si ça n'est pas utile…).

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

                          Posté par (page perso) . Évalué à -2.

                          Lorsque groumly écrivait :

                          Regarde ce que font Microsoft, Apple et google si tu me crois pas.

                          je pensais qu'il faisait référence à des applications natives développées par Microsoft, Apple, Google, whoever…, qui s'appuient sur MVC et dont les sources sont consultables. C'est ça qui m'intéresse.

                          En outre, lorsqu'on clique sur le premier lien, il y a ça qui s'affiche :

                          Retired Document
                          Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid.
                          

                          Pour le reste :

                          1. Depuis quand ne pas utiliser une techno (ne pas mettre en œuvre une pratique), c'est critiquer cette techno (pratique) ?
                          2. Je n'ai aucun problème avec les personnes qui utilisent MVC. Pourquoi donc y a-t-il des personnes pour qui cela représente un problème que, moi, je ne l'utilise pas ?
                          3. Je n'ai aucun problème avec les personnes qui codent des tests auxquels ils soumettent leur code, d'autant moins que c'est même une pratique que j'ai maintes et maintes fois encouragée. Pourquoi donc y a-t-il des personnes à qui ça pose un tel problème que, moi, je ne code pas de tels tests, au point d'en déformer mes propos sur le sujet ?

                          Ces personnes me font de plus en plus penser à ça :

                          Duty call

                          (source : https://xkcd.com/386/)

                          Freelance en ingénierie logicielle.

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

                            Posté par . Évalué à 3. Dernière modification le 05/08/18 à 09:54.

                            1. Non tu affirme que c'est peu utilisé en natif (tu as même tenté de dire que ce n'était pas très populaire, ce qui est drôle quand on est seul utilisateur d'une techno). Je te pointe des documents qui montent que c'est une notion centrale de bibliothèques très utilisées
                            2. Tu fais sincèrement ce que tu veux. Je m'en fou. C'est juste que tu remplace un pattern d'archi utilisé par aucun. Dans le monde argument. C'est juste dommage parce que tu nous dis à côté ne pas être capable de rester ton code. MVC est entre autre là pour que tu puisse le faire.
                            3. Parce que ton code est bugué? Fais ce que tu veux mais ton code est bugué si tu ne te débrouilles pas pour que ça fonctionne avant de te lancer dans des trucs fous comme une structure commerciale tu va dans le mur. Il n'y a pas de "mais ça fonctionnait", il faut mettre en place quelque chose pour s'assurer que ce que tu sors fonctionne. Tu veux pas faire de test unitaire très bien, il y a avoir un cahier de test, hier sur un environnement propre (docker ou une vm par exemple), etc. Pour le moment tu ne semble pas prendre conscience du problème. Avec ou sans communication ton truc ne fonctionne pas. Je l'ai ressayé, ça a "marchait" quelques fois (avoir des erreurs et servir lancer le programme au debuger pour trouver l'url qui va bien, c'est fonctionner ?). Puis plus du tout, comme si ton serveur ne répondait de token à mon client… J'ai pas de doute que ça se corrige mais il faut que tu attrape ce genre de problème plus tôt si tu veux rester crédible. Si les gens doivent payer les pots casser à chaque nouvelle version, ils ne peuvent qu'aller voir ailleurs, tu ne leur donne pas le choix.

                            Tu préfère que l'on t'ignore?

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

                              Posté par (page perso) . Évalué à -5. Dernière modification le 05/08/18 à 10:42.

                              Non tu affirme que c'est peu utilisé en natif (tu as même tenté de dire que ce n'était pas très populaire, ce qui est drôle quand on est seul utilisateur d'une techno). Je te pointe des documents qui montent que c'est une notion centrale de bibliothèques très utilisées

                              Possible que je me sois gouré sur sur son degré d'utilisation mais j'aimerais quand même un lien sur une appli avec interface native qui utilise MVC et dont je peux voir les sources, et, vu ce que tu dis des documents dont tu m'as donné la référence, ça ne devrait pas être très difficile à produire…
                              Et je ne vois pas en quoi croire (même si, à priori, à tort) qu'une techno. n'est pas très utilisée, c'est la critiquer.

                              Tu fais sincèrement ce que tu veux. Je m'en fou. C'est juste que tu remplace un pattern d'archi utilisé par aucun. Dans le monde argument. C'est juste dommage parce que tu nous dis à côté ne pas être capable de rester ton code. MVC est entre autre là pour que tu puisse le faire.

                              J'ai mon propre pattern d'archi, et je n'ai jamais dit que je n'étais pas capable de tester mon code, juste qu'écrire le code correspondant n'est, actuellement, pour moi, pas économiquement viable. Et, à l'instar de MVC, mon propre pattern d'archi est tout à fait adapté à l'écriture de tests, mais écrire le code de ces tests… (etc.).

                              Parce que ton code est bugué? Fais ce que tu veux mais ton code est bugué si tu ne te débrouilles pas pour que ça fonctionne avant de te lancer dans des trucs fous comme une structure commerciale tu va dans le mur. Il n'y a pas de "mais ça fonctionnait", il faut mettre en place quelque chose pour s'assurer que ce que tu sors fonctionne. Tu veux pas faire de test unitaire très bien, il y a avoir un cahier de test, hier sur un environnement propre (docker ou une vm par exemple), etc. Pour le moment tu ne semble pas prendre conscience du problème. Avec ou sans communication ton truc ne fonctionne pas. Je l'ai ressayé, ça a "marchait" quelques fois (avoir des erreurs et servir lancer le programme au debuger pour trouver l'url qui va bien, c'est fonctionner ?). Puis plus du tout, comme si ton serveur ne répondait de token à mon client… J'ai pas de doute que ça se corrige mais il faut que tu attrape ce genre de problème plus tôt si tu veux rester crédible. Si les gens doivent payer les pots casser à chaque nouvelle version, ils ne peuvent qu'aller voir ailleurs, tu ne leur donne pas le choix.

                              1. faire des tests sur un code ne garantit pas qu'il est exempt de bugs,
                              2. concernant le bug que tu as rencontré, tests ou pas tests, ça ne change rien, parce que je n'arrive pas à reproduire le problème (ceci dit, je suis en train de travailler sur une nouvelle version de Atlas.jar qui corrige ce bug, mais ça sera évidemment une correction à l'aveugle),
                              3. faire des tests sur un code ne garantit pas qu'il est exempt de bugs (oui, c'est la même chose que le 1., mais ça s'applique également au second bug que tu as rencontré).

                              Bref, rien ne prouve que tu n'aurais pas rencontré les mêmes problèmes avec mon appli. si je l'avais soumise à une batterie de tests que j'aurais codés. Je ne nie pas que ce soit possible, mais, de mon expérience, j'en estime la probabilité très faible, trop faible pour que j'investisse du temps (et donc de l'argent) pour pallier à cet hypothétique problème en codant des tests.

                              Je ne te convaincrais pas, tu ne me convaincras pas, donc je propose d'en rester là sur le sujet. Et cette proposition vaut aussi pour les autres qui seraient tenté d'intervenir sur ce même sujet.

                              M'ignorer ? Si l'alternative c'est d'avoir à répondre à des commentaires hors sujet et/ou contenant des arguments d'une part erronés et qui, d'autre part, ne font pas avancer le débat, oui, je préfère.

                              Freelance en ingénierie logicielle.

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

                            Posté par . Évalué à 2.

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

                        Posté par . Évalué à 6.

                        D’un côté, tu dit ne pas aimer mvc et ne pas en faire, de l’autre tu repetes a qui veut l’entendre ne pas regarder ce qu’il se fait ailleurs, donc c’est pas étonnant que t’en ait pas vu ailleurs. Forcément, si tout ce que tu regardes c’est ton propre code…

                        MVC est au cœur de uikit et appkit, c’est décrit en long en large et en travers dans leurs docs, et évident juste à regarder les noms de leurs classes (UIViewController vs UIView, la même côté appkit avec NSWindowController, et pareil avec tout le lifecycle qui est très centré sur les contrôleurs).

                        Et si, justement, quand les 3-4 plateformes qui font tourner 99.9% des applis écrites ces 30 années sont basées sur mvc, ça en fait la norme.

                        Écoutes, moi je veux bien admettre que MVC est pas parfait (le petit nom de mvc dans le monde iOS, c’est Massive View Controller, en référence au fait que les vc grossissent énormément avec le temps ce qui en fait un gros problème de maintenance), mais si t’as une meilleure idée d’architecture pour découpler la logique métier (model), la logique de présentation (view) et la glue entre les deux (controller), je suis tout ouïe.

                        Linuxfr, le portail francais du logiciel libre et du neo nazisme.

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

            Posté par . Évalué à 5.

            La plupart des solutions les plus populaires s'appuient sur une architecture MVC, et je n'en vois pas l'intérêt. Ça fait des décennies que l'on développe des application avec une interface native, sans qu'on ai jamais eu besoin de recourir à MVC. Pourquoi cela serait différent avec les applications web ?

            Ruby on Rails : MVC
            Django : MVC
            MFC (interfaces natives Windows) : MVC
            Windows Forms : orienté MVC
            WPF : idem, avec beaucoup de frameworks MVVM (qui est une variante du MVC)
            ASP .NET Core MVC : C'est dans le nom

            Ni les interfaces natives, ni le web ne t'ont attendu pour se mettre au MVC avec succès depuis 20 ans.

            Pour les interfaces natives, ça date même des années 70 :
            https://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leur

            "Quand certains râlent contre systemd, d'autres s'attaquent aux vrais problèmes." (merci Sinma !)

    • [^] # Re: Il manque un truc

      Posté par . Évalué à 10.

      Il manque surtout une référence aux travaux de Pierre Tramo.

  • # Lapin compris

    Posté par . Évalué à 6.

        for (;;)
            new Hello();
    

    Y a pas un problème ? Ça lance en boucle des threads jusqu'à ce que ça explose non ? (https://github.com/epeios-q37/atlas-java/blob/master/Atlas.java#L27) ou j'ai loupé un truc ?

    • [^] # Re: Lapin compris

      Posté par (page perso) . Évalué à -1.

      Je ne suis pas spécialiste de Java, donc il y a peut-être effectivement un problème.

      Ceci dit, le code lancé lors du new (https://github.com/epeios-q37/xdhq-java/blob/ee418c808a0cb64c8559e8e31ff51cf6459a2c28/src/DOM_DEMO.java#L135 ne rend la main que lorsqu'il y a une nouvelle connexion. En tout cas, ça à l'air de fonctionner ; il suffit de l'installer pour le constater.

      Freelance en ingénierie logicielle.

      • [^] # Re: Lapin compris

        Posté par . Évalué à 6.

        Ah oui, je ne suis pas allé jusque là et j'avais pensé rajouter "ou alors il y a quelque part dans la chaîne un truc dégueulasse qui fait que le constructeur est bloquant", mais je me suis dit que c'était pas possible… Ben si

        • [^] # Re: Lapin compris

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

          J'avais prévenu que je n'y connaissais pas grand chose à Java

          Si j'ai bien compris, comme déjà indiqué dans un précédent commentaire, je suppose qu'il faut que le new rende la main de suite, et qu'il y ai une fonction genre launch() qui, elle, soit bloquante…

          Freelance en ingénierie logicielle.

      • [^] # Re: Lapin compris

        Posté par (page perso) . É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: Lapin compris

          Posté par . Évalué à 10.

          Je me demande d'ailleurs si ça ne peut pas casser certains mécanismes de la JVM d’avoir ce genre de comportement.

          Rassure toi, la JVM est le seul truc qui sorte indemne de ce truc.

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

    Posté par (page perso) . É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: Il vaudrait mieux te mettre en contact avec quelqu'un qui connait Java

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

      Je te conseille de te rapprocher d'un développeur Java […]

      Je voudrais bien, mais je n'en connais point…

      Parce qu'il existe déjà un outil qui fait ça, c'est GWT – et que donc tu y seras obligatoirement comparé.

      Je n'ai pas étudié GWT en détail, mais, puisqu'il est cité, j'en profite pour exposer quelques différences notables que j'ai cru déceler :

      • c'est un framework
        • qui vient avec tout un ensemble d'exécutables à utiliser, notamment pour la création d'une application et pour son lancement,
        • qui met en place toute une arborescence de fichiers,
      • au final, ce n'est pas du Java qui est exécuté, mais du JavaScript compilé à partir du Java,
      • l'interface est construite programmatiquement, et non pas à l'aide d'un fichier descriptif,

      Tout ces points ne sont pas nécessairement des inconvénients. Cependant, avec ATK (c'est le petit nom de la bibliothèque décrite dans ce journal) :

      • c'est une simple bibliothèque ; un import info.q37.atlas.*; et ça roule,
      • on peut construire l'interface avec un simple fichier HTML (on peut aussi le faire programmatiquement),
      • on code/lance une application web avec ATK comme n'importe quelle application Java (utilisation de javac/java ; pas besoin d'exécutables maisons),
      • pour la tester, un simple .jar à télécharger (~22 Ko) au lieu d'une archive de ~90 Mo pour GWT,
      • suffit de connaître HTML, CSS, DOM pour l'utiliser (en théorie, mais, vu le premier commentaire, ça n'a pas l'air aussi évident que ça), l'API s'inspirant fortement de celle en JavaScript pour manipuler le DOM.

      Comme dit, je n'ai jamais utilisé GWT, et je ne suis pas familier avec Java, donc s'il y a des inexactitudes, n'hésitez pas à les signaler…

      Parce que ton code ressemble tellement peu à du Java que tes exemples te desservent au lieu de te vendre.

      Je m'y attendais un peu, d'où mon texte introductif dans le journal. Mais, hélas, je ne connais pas de développeur Java, donc si une bonne âme pouvait m'indiquer les améliorations à apporter…

      Freelance en ingénierie logicielle.

  • # Désolé

    Posté par . Évalué à 10. Dernière modification le 03/08/18 à 21:56.

    Sommaire

    Salut ! Je vais prendre le temps de te dire ce que je pense de ton approche :) Ça va peut être être rude, mais comprends bien que si je prends du temps pour écrire un commentaire c'est bien que je veux être constructif. De plus je distingue totalement ton travaille de la personne que tu es (c'est important). Mais il y a pas mal de choses à dire je trouve.

    Ton approche

    Background

    Tu connais le C++, tu vis le C++ en autarcie, tu nous explique à longueur de journée que les pratiques classiques comme les tests ne sont pas pour toi. En informatique comme ailleurs affirmer que l'on est plus malin/différents/le cas à part, c'est se tromper. Tu as des centaines de milliers de personnes dans le monde qui après une cinquantaine d'années à tenter de construire une certaine qualité logicielle. Arriver et dédaigner leur travail, par un « bof c'est pour les autres », c'est forcément se tromper. On exerce une science dure, pour affirmer des choses il faut avoir des arguments autre que « je fais de la factorisation poussée » (personne d'autre ne factorise ?). De tout ce que tu nous as décrit ça "fonctionne" parce que tu es le seul à coder et que tu accepte de voir très tard les bugs (tu reconstruit les autres logiciels et tu teste s'il plantent).

    Tu pars donc très très très mal : tu nous propose d'utiliser un code pas tester (yay !), mais pour quoi donc ?

    Objectif

    Tu ne sais faire que du C++, quelqu'un te demande de faire du web, tu fais du web en C++. Très bien. Mais la populace fais déjà du web avec un tas d'autres choses. Il va falloir nous donner une raison d'abandonner nos stack libres bien plus fiables que la tienne (dont le copyright est partagé, supporté par une communauté, testée, testée massivement,…).

    En plus du web, il existe un énorme paquet de techno qui apparaît. Ça signifie qu'il y a déjà énormément d'idées qui ont étaient essayée. D'autant que ça fais des années que ça dure !

    Tu ne nous a pas donné d'autres arguments sur le pourquoi utiliser ta pile autre que c'est du C++ et c'est simple… oui mais.

    Alternatives

    Tu n'a aucune idée de si c'est simple, tu en ai l'utilisateur-codeur et tu n'es même pas allé voir ce qui se fait ailleurs. On ne souffre pas la comparaison quand on en fait pas mais on va forcément la faire pour toi. Qu'est-ce que ça donne comparé à du CGI ? Qu'est-ce que ça donne face à Wt ? Pourquoi les gens choisiraient le code d'un développeur dans son garage (pas testé) par rapport à tout ce qui peut exister ailleurs ?

    J'ai parlé de techno C++, mais alors j'ai pas de doute qu'en PHP, Java et JS c'est pire encore.

    Finalement

    En vrai je ne sais pas pourquoi tu nous présente des plus ou moins portages dans d'autres langages, tu ne les utilise pas et tu n'explique pas en quoi les développeurs de ce langage gagneraient à utiliser ton code.

    Pire encore, tu nous parle d'une bibliothèque C++, je sais pas ce qu'elle fais. Si je vais voir http://atlastk.org/ (pas de https ?), tu nous dis que c'est du C++ donc c'est rapide. Si tu ne le corrobore pas avec des benchmarks c'est du vent. Tu nous explique pas en quoi ta bibliothèque est performante. Quelle archi est-ce que tu utilise ? Comment-est-ce que tu t'assure que tes bindings restent performant ? Tu connais netty ? C'est ce qui permet à Java d'être performant sur le réseau, il faut vraiment avoir des arguments pour pouvoir dire qu'on est plus performant que ça.

    La mise en œuvre

    D'un point de vu utilisateur

    Ton code nous montre du html dans des String. Donc on peut dire au revoir à la validation du html. On peut faire autrement ? Très bien montre nous et c'est là dessus qu'on évaluera si c'est facile ou pas. Tu nous montre aussi des manipulation de DOM, c'est affreux à utiliser… et c'est extrêmement lent ! C'est bien pour ça que toutes les techno utilisent un DOM virtuel… Aie…

    D'un point de vu conception

    Si je regarde Atlas.jar c'est ta classe principale, hein ? Tu as des chemins codés en dur dans ton code… C'est pas une question de java, il n'y a pas de langage dans le quel c'est une bonne pratique…

    Tu lance des Threads non managés. Tu ne les nettoie pas. Ton code explose, c'est une garantie.
    D'après toi qu'est-ce qui est affiché par ce code ?

    public void foo() {
        System.out.println("start");
        new Thread(() -> {
            try {
                Thread.sleep(1_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Hello");
        }).start();
        System.out.println("end");
    }

    Même si tu ne lançais un thread qu'à chaque connexion, ça exploserais à quelques dizaines de milliers de connexions. Le problème ce n'est pas que tu refuserais des connexions, mais bien que le serveur tombe à ce moment là…

    Tentons de voir s'il n'y a pas un truc que je rate dans ton code. Si je tente de lancer ton premier exemple :

    michel@MBA:/tmp/tmp.msaUgm9EXO % java -cp .:Atlas.jar Hello
    java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
        at java.awt.Desktop.checkActionSupport(Desktop.java:225)
        at java.awt.Desktop.browse(Desktop.java:381)
        at info.q37.xdhq.dom.DOM_DEMO.<init>(DOM_DEMO.java:154)
        at info.q37.xdhq.DOM.<init>(DOM.java:48)
        at info.q37.atlas.DOM.<init>(DOM.java:24)
        at info.q37.atlas.Atlas.<init>(Atlas.java:28)
        at Hello.<init>(Hello.java:3)
        at Hello.main(Hello.java:48)
    Exception in thread "Thread-0" java.lang.NullPointerException
        at info.q37.xdhq.DOM.getAction(DOM.java:62)
        at info.q37.atlas.Atlas.run(Atlas.java:38)
        at java.lang.Thread.run(Thread.java:748)
    

    Mais ça continue à s'exécuter, mais il n'écoute pas de port. Awt c'est une bibliothèque graphique, je ne sais pas ce que ça vient faire là, je pensais lancer un serveur web… Le code lance, une classe démo de ta bibliothèque ?…

    Je vais un peu plus loin. Tu tente silencieusement d'accéder à "http://atlastk.org/atlas.php?_token=c6f39490-1d1d-4e1d-9f21-b7eec4935e5d". Là ça commence à vraiment être mauvais tu piste potentiellement les gens qui utilisent ta techno…

    Bon je vais plus loin, en farfouillant ton code je vois qu'il y a un mode PROD face à un mode DEV ou DEMO (selon où on se trouve ça n'a pas le même nom…). En suivant des trucs et des bidules dans la classe XDH, je trouve la méthode statique isDev() qui vérifie que la variable d'environnement EPEIOS_SRC existe. Soit on va la positionner et voir ce que ça donne.

    michel@MBA:/tmp/tmp.msaUgm9EXO  [130]% EPEIOS_SRC=foo java -cp .:Atlas.jar Hello
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jreq in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at info.q37.jreq.Wrapper.Init(JRE.java:56)
        at info.q37.jreq.JRE.register(JRE.java:67)
        at info.q37.xdhq.XDH_PROD.<clinit>(XDH_PROD.java:27)
        at info.q37.xdhq.XDH.launch(XDH.java:65)
        at info.q37.atlas.Atlas.launch(Atlas.java:135)
        at info.q37.atlas.Atlas.launch(Atlas.java:170)
        at Hello.main(Hello.java:45)
    

    Et c'est reparti…

    Tu tente de charger une bibliothèque "jreq" que je n'ai semble-t'il pas. Quand je lance ton truc dans mon debuggeur je tombe sur la classe Wrapper de la bibliothèque atlas), elle contient une méthode getLocation() dont voici l'implémentation :

    protected static String getLocation() {
        String var0 = System.getProperty("os.name").toLowerCase();
        if (System.getenv("EPEIOS_SRC") == null) {
            return "./";
        } else if (var0.contains("windows")) {
            return "h:/bin/";
        } else {
            return var0.contains("mac") ? "/Users/csimon/bin/" : "/home/csimon/bin/";
        }
    }

    Donc cette fameuse variable d'environnement sert à définir où se trouve des binaires (en plus de définir si on utilise le mode prod ou pas…), mais elle ne permet pas de choisir où ça se trouve soit on ne la définit pas et on lance le truc en démo et cherche le binaire dans le dossier courant (spoiler alert : même si j'avais pu lancer le browser, ça aurait planté), soit je la défini et faut que j'aille la chercher chez toi.

    Je vais m'arrêter là, je ne peux pas faire fonctionner ton truc sans patcher ta bibliothèque. Fais des tests, pour vérifier que ton truc peut se lancer. Si tu veux des conseils :

    • commence par utiliser un IDE java, il te listera un tas d'erreurs que tu fais
    • une fois que tu les aura toutes corrigée, joue avec sonarqube il t'en donnera d'autres
    • arrête définitivement les chemins en dur où que ce soit
    • segmente les choses si pour toi factoriser c'est donner 2 sémantiques à une même variable, c'est vraiment un problème (et je t'en donne l'exemple ci-dessus)
    • même si tout ça avait fonctionné je suis certain de faire exploser le serveur sans problème vu la gestion des threads
    • lis la doc des API que tu utilise, pour le plantage que j'ai en mode démo, tu aurais pu le corrigé si tu avais lu la seule ligne de la doc en question. Pour être magnanime voici le code qui pourrait corriger ça : https://github.com/chatty/chatty/issues/17

    Pour ma première partie :

    • garde l'humilité d'aller voir ce qui se fait ailleurs
    • si tu veux qu'on passe du temps à apprendre ton truc explique nous ce qu'il a de plus et être en C++ ça n'est pas une bonne raison (surtout si c'est pour tout coder en java)

    J'ai passé du temps a regarder ce que tu as fais et à rédiger mon commentaire (il est mieux construit au début qu'à la fin, mais c'est la fatigue), je suis réellement allé cherché ton code et j'ai tenté de le lancer. Comprends que si ton truc ne marche pas en y aillant passé environ 1h30 à 2h, c'est qu'il y a un vrai problème. Je connais le java et je peux aller voir ce qu'il s'y passe. J'aurais pu lancer n'importe quel hello world vu, angular, react, elm, python ou brainfuck en 10 minutes. En terme de qualité c'est très loin de ce que l'on peut attendre d'un truc qu'on voudrait réutiliser (dans un cadre professionnel ou pas).

    • [^] # Re: Désolé

      Posté par . Évalué à 7.

      Bravo pour ce commentaire.

      J'ajouterai que faire du java aujourd'hui, c'est passer une grande partie de son temps à intégrer des dépendances / technologies externes à ses projets.

      La gestion des dépendances est très simple en Java, comparativement à d'autres langages car l'écosystème réutilise très peu les briques natives, la gestion de la mémoire autorise un isolement efficace, et le format du binaire n'a pas évolué (contrairement au Python, C# et C++).

      Ça peut paraître rébarbatif cette gestion des dépendance, mais c'est très intéressant car il y a une richesse immense de solutions et la qualité est très souvent au rendez-vous. On fait bien sûr des erreurs, qui peuvent coûter, mais l'expérience permet de moins se tromper et de limiter l'impacte de ces erreurs.

      J'inviterai le rédacteur de ce journal à regarder les Maven (ou Gradle), ou bien Groovy et Grape (y pourra tester sa lib avec Geb :) ). Avec un bon IDE, qui peut compléter son code.. Pour voir ce que font les autres, et comprendre qu'on a un grand choix dans à peu près tout ce que l'on veut (et que c'est performant et bien codé, surtout si c'est fait par d'autres, selon moi).

    • [^] # Mais il n'y a vraiment pas de quoi...

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

      Sommaire

      Salut !

      Salut !

      Je vais prendre le temps de te dire ce que je pense de ton approche :) Ça va peut être être rude, mais comprends bien que si je prends du temps pour écrire un commentaire c'est bien que je veux être constructif. De plus je distingue totalement ton travaille de la personne que tu es (c'est important). Mais il y a pas mal de choses à dire je trouve.

      Super ! Je n'attend que ça, des commentaires constructifs !

      Ton approche

      Background

      Tu connais le C++, tu vis le C++ en autarcie, tu nous explique à longueur de journée que les pratiques classiques comme les tests ne sont pas pour toi.

      Bon, on ne va pas reprendre cette discussion ici, mais je n'ai jamais dit que les tests ne sont pas pour moi. Tout ce que j'ai dit, c'est que, comme tout un chacun, je me sentirais bien mieux si je pouvais prendre le temps de soumettre mon code à des test, mais que, ce n'est pas, pour moi, en l'état actuel des choses, économiquement viable de passer du temps à écrire des tests. Peut-être qu'un jour, le temps que je gagne à ne pas écrire de tests sera significativement inférieur au temps que j'aurais gagné en soumettant mon code à ces tests. Ce jour-là, j'écrirais des tests. Quoiqu'il en soit, j'encourage tout un chacun à écrire des tests auxquels soumettre leur code.

      En informatique comme ailleurs affirmer que l'on est plus malin/différents/le cas à part, c'est se tromper.Tu as des centaines de milliers de personnes dans le monde qui après une cinquantaine d'années à tenter de construire une certaine qualité logicielle. Arriver et dédaigner leur travail, par un « bof c'est pour les autres », c'est forcément se tromper.

      Où ai-je affirmé de telles choses ? Le fait est que, moi, je n'ai absolument aucun problème avec les personnes qui ne codent pas uniquement en C++. Par contre, il semble que, parmi ces personnes, il y en a à qui cela pose un gros problème que je code uniquement en C++

      On exerce une science dure, pour affirmer des choses il faut avoir des arguments autre que « je fais de la factorisation poussée » (personne d'autre ne factorise ?). De tout ce que tu nous as décrit ça "fonctionne" parce que tu es le seul à coder et que tu accepte de voir très tard les bugs (tu reconstruit les autres logiciels et tu teste s'il plantent).

      Si tu relis la partie que tu cites, tu constateras que j'ai explicitement parlé d'hypothèse, et que donc je reconnaissais implicitement que ce que j'avançais n'était peut-être pas la bonne explication. Quand aux bugs, je les découvre peut-être plus tard que si j'utilisais une batterie de tests, mais toutefois suffisamment tôt pour qu'ils ne gênent pas mes clients. Et c'est le plus important, non ? (Par contre, ton histoire de reconstruire les autres logiciels et de tester s'ils plantent, là, je n'ai pas trop compris…)

      Tu pars donc très très très mal : tu nous propose d'utiliser un code pas tester (yay !), mais pour quoi donc ?

      Je n'écris pas explicitement de code de test, mais je lance toutefois quand plusieurs fois même mon application au cours de son développement pour voir si elle se comporte correctement, et, en outre, sur plusieurs plate-formes (notamment GNU/Linux, macOS et Windows)…

      Objectif

      Tu ne sais faire que du C++, quelqu'un te demande de faire du web, tu fais du web en C++. Très bien. Mais la populace fais déjà du web avec un tas d'autres choses. Il va falloir nous donner une raison d'abandonner nos stack libres bien plus fiables que la tienne (dont le copyright est partagé, supporté par une communauté, testée, testée massivement,…).

      Pourquoi devrais-je donner une raison ? Je donne à tout un chacun le moyen de tester ma bibliothèque pour qu'il puisse se forger sa propre opinion à son propos. Après, libre à lui d'en rester à sa stack bien-aimée ad vitam æternam, peu me chaut…

      En plus du web, il existe un énorme paquet de techno qui apparaît. Ça signifie qu'il y a déjà énormément d'idées qui ont étaient essayée. D'autant que ça fais des années que ça dure !

      Euh… Soit ! Et ?

      Tu ne nous a pas donné d'autres arguments sur le pourquoi utiliser ta pile autre que c'est du C++ et c'est simple… oui mais.

      J'ai surtout donné un moyen, que j'ai essayé de rendre le plus simple possible, pour tout un chacun de l'essayer et ainsi de pouvoir se forger sa propre opinion… (oui, je sais, je me répète).

      Alternatives

      Tu n'a aucune idée de si c'est simple, tu en ai l'utilisateur-codeur et tu n'es même pas allé voir ce qui se fait ailleurs. On ne souffre pas la comparaison quand on en fait pas mais on va forcément la faire pour toi. Qu'est-ce que ça donne comparé à du CGI ? Qu'est-ce que ça donne face à Wt ? Pourquoi les gens choisiraient le code d'un développeur dans son garage (pas testé) par rapport à tout ce qui peut exister ailleurs ?

      Si, je suis allé voir ce qui se faisait ailleurs, mais cela ne me convenait pas. Et comme c'est déjà les principes de base qui ne me convenaient pas, je n'ai pas essayé, donc je suis particulièrement mal placé pour émettre une comparaison objective de ma bibliothèque avec l'existant. Et encore une fois, je n'essaie de convaincre personne d'utiliser ma bibliothèque…

      J'ai parlé de techno C++, mais alors j'ai pas de doute qu'en PHP, Java et JS c'est pire encore.

      Pas compris ce tu essayes d'exprimer, là…

      Finalement

      En vrai je ne sais pas pourquoi tu nous présente des plus ou moins portages dans d'autres langages, tu ne les utilise pas et tu n'explique pas en quoi les développeurs de ce langage gagneraient à utiliser ton code.

      Déjà, ce ne sont pas des portages, mais des bidings, c'est à dire que le cœur de la bibliothèque est le même, quelque soit le langage utilisé. Et, encore une fois, pourquoi j'essayerais de convaincre qui que ce soit par quelqu'argument que ce soit des qualités de ma bibliothèque s'il existe un moyen, que j'ai essayé de rendre le plus simple possible, de l'essayer (bis, ou plutôt, ter repetita) ? S'il n'est alors pas capable de se forger sa propre opinion, je ne peux rien pour lui…

      Pire encore, tu nous parle d'une bibliothèque C++, je sais pas ce qu'elle fais. Si je vais voir http://atlastk.org/ (pas de https ?), tu nous dis que c'est du C++ donc c'est rapide. Si tu ne le corrobore pas avec des benchmarks c'est du vent. Tu nous explique pas en quoi ta bibliothèque est performante. Quelle archi est-ce que tu utilise ? Comment-est-ce que tu t'assure que tes bindings restent performant ? Tu connais netty ? C'est ce qui permet à Java d'être performant sur le réseau, il faut vraiment avoir des arguments pour pouvoir dire qu'on est plus performant que ça.

      (Si, il y a du https, mais je ne force personne à l'utiliser.)

      Sérieux, tu veux vraiment que je développe, ou fasse développer, ma bibliothèque dans tous les langages disponibles juste pour pouvoir faire des benchmarks ?

      La bibliothèque étant à l'état de prototype, il est inutile de rentrer dans les détails techniques, vu que ces derniers ont de grandes choses de considérablement évoluer…

      Concernant le C++, je ne pense que beaucoup considère que ce soit un mauvais choix si on cherche à obtenir les meilleures performances possibles…

      La mise en œuvre

      D'un point de vu utilisateur

      Ton code nous montre du html dans des String. Donc on peut dire au revoir à la validation du html. On peut faire autrement ? Très bien montre nous et c'est là dessus qu'on évaluera si c'est facile ou pas.

      Comme j'ai dit dés l'introduction, je ne suis pas familier avec Java. Certaines fonctions prennent une String devant contenir du HTML, et j'ai donc créer le contenu de ces String à la main pour éviter d'avoir à installer un outil tiers (il y a peut-être un outil fournit en standard ; n'ayant pas cherché, je l'ignore), et cela fonctionne très bien. Maintenant, s'il y en a qui sont incapables d'écrire du code HTML valide à la main, libre à eu de passer par l'outil de leur choix…

      Tu nous montre aussi des manipulation de DOM, c'est affreux à utiliser… et c'est extrêmement lent ! C'est bien pour ça que toutes les techno utilisent un DOM virtuel… Aie…

      Les goûts et les couleurs…

      Perso., je préfère manipuler le DOM que de passer systématiquement par un moteur de template et de me farcir du MVC. Mais ça, c'est mon choix personnel, que je n'impose à personne.

      Et je rappelle que ce qui est présenté ici, comme indiqué dans l'introduction de ce journal, c'est un prototype, donc quelque chose de largement améliorable. Il est tout à fait possible qu'à partir d'une des prochaines version de cette bibliothèque s'appuie sur un DOM virtuel.

      D'un point de vu conception

      Si je regarde Atlas.jar c'est ta classe principale, hein ? Tu as des chemins codés en dur dans ton code… C'est pas une question de java, il n'y a pas de langage dans le quel c'est une bonne pratique…

      Les chemins en dur ne sont utilisés que dans mon environnement de développement. Si ma bibliothèque est installé en suivant la procédure indiquée dans ce journal, ces chemins ne sont pas utilisés.

      Tu lance des Threads non managés. Tu ne les nettoie pas. Ton code explose, c'est une garantie.
      D'après toi qu'est-ce qui est affiché par ce code ?
      java
      public void foo() {
      System.out.println("start");
      new Thread(() -> {
      try {
      Thread.sleep(1_000);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      System.out.println("Hello");
      }).start();
      System.out.println("end");
      }

      Même si tu ne lançais un thread qu'à chaque connexion, ça exploserais à quelques dizaines de milliers de connexions. Le problème ce n'est pas que tu refuserais des connexions, mais bien que le serveur tombe à ce moment là…

      Encore une fois, la version présentée ici n'est qu'un prototype. Si une meilleure gestion des threads est requise, elle sera implémentée..

      Et je n'ai aucune idée de ce qui est affiché par ton code (et je m'en contrefiche un peu…).

      Tentons de voir s'il n'y a pas un truc que je rate dans ton code. Si je tente de lancer ton premier exemple :

      michel@MBA:/tmp/tmp.msaUgm9EXO % java -cp .:Atlas.jar Hello
      java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
         at java.awt.Desktop.checkActionSupport(Desktop.java:225)
         at java.awt.Desktop.browse(Desktop.java:381)
         at info.q37.xdhq.dom.DOM_DEMO.<init>(DOM_DEMO.java:154)
         at info.q37.xdhq.DOM.<init>(DOM.java:48)
         at info.q37.atlas.DOM.<init>(DOM.java:24)
         at info.q37.atlas.Atlas.<init>(Atlas.java:28)
         at Hello.<init>(Hello.java:3)
         at Hello.main(Hello.java:48)
      Exception in thread "Thread-0" java.lang.NullPointerException
         at info.q37.xdhq.DOM.getAction(DOM.java:62)
         at info.q37.atlas.Atlas.run(Atlas.java:38)
         at java.lang.Thread.run(Thread.java:748)
      

      Mais ça continue à s'exécuter, mais il n'écoute pas de port. Awt c'est une bibliothèque graphique, je ne sais pas ce que ça vient faire là, je pensais lancer un serveur web… Le code lance, une classe démo de ta bibliothèque ?…

      En fonctionnement normal, un serveur est effectivement lancé, mais ce fonctionnement, tel que la bibliothèque est codée, nécessite l'installation de code natif en local. Pour éviter cela, et, du coup, simplifier la procédure d'installation, le fonctionnement pas défaut ne lance pas de serveur.

      Je vais un peu plus loin. Tu tente silencieusement d'accéder à "http://atlastk.org/atlas.php?_token=c6f39490-1d1d-4e1d-9f21-b7eec4935e5d". Là ça commence à vraiment être mauvais tu piste potentiellement les gens qui utilisent ta techno…

      Je tente tellement silencieusement d'accéder à cette adresse qu'elle est normalement affichée en clair dans la console à partir de laquelle l'application est lancée… Mais elle ne s'est probablement pas affichée chez toi à cause du message d'erreur.

      Cette adresse est en fait celle à laquelle on doit se connecter avec un navigateur web pour accéder à l'application qui vient d'être lancée. Normalement, un navigateur pointant sur cette adresse est automatiquement lancé, mais ça échoue chez toi, peut-être parce que tu as lancé l'application dans un environnement sans interface graphique (quoique ce cas est normalement prévu).

      Quand à l'erreur, je pensais avoir traité le cas de figure où le lancement d'un navigateur n'est pas possible, mais apparemment pas. Normalement, dans ce cas de figure, un message est affiché dans la console invitant à ouvrir un navigateur à l'adresse que tu as relevée.

      Je passe sur une partie de ton message, car, malgré le message d'erreur, l'application fonctionne probablement. Il suffit de se connecter avec un navigateur web à l'adresse que tu as relevée (attention : elle change à chaque lancement de l'application). En tout cas merci pour le pointeur pour corriger le problème concernant le lancement d'un navigateur.

      Pour ma première partie :

      garde l'humilité d'aller voir ce qui se fait ailleurs

      Ne t'en fait pas, je regarde volontiers ce qui se fait ailleurs, non par humilité, mais par simple curiosité…

      si tu veux qu'on passe du temps à apprendre ton truc explique nous ce qu'il a de plus et être en C++ ça n'est pas une bonne raison (surtout si c'est pour tout coder en java)

      Entièrement d'accord, le fait d'être codé en C++ n'est absolument pas un critère en soi pour utiliser une bibliothèque (et je n'ai jamais prétendu le contraire), fût-ce à travers un binding Java ; en fait, ça serait même une raison de ne pas utiliser cette bibliothèque pour tout autre langage que le C++, compte tenu de l'inaptitude du gestionnaire de paquets de la plupart des langages (s'il existe !) à gérer correctement le déploiement de code natif. Mais, comme dit, avec la procédure d'installation telle que détaillée dans ce journal, il n'y a pas ce problème, puisque il n'y a pas de code natif qui est installé localement.
      Le seul but de ce journal, c'est de présenter un projet et de fournir un moyen simple de l'essayer. Si ce projet ne vous intéresse pas, il vous suffit de passer votre chemin (si possible, sans essayer de me convaincre de ne pas utiliser C++ pour faire du web ; ce n'est pas le sujet, et ça n'apporte absolument rien au débat). S'il vous intéresse, libre à vous de l'essayer, et de me faire remonter vos observations, que je lirais attentivement, via les commentaires.

      Et, encore une fois, tout n'est pas codé en Java. Ce qui est codé en Java, c'est uniquement un wrapper (en fait, c'est un peu plus qu'un simple wrapper).

      J'ai passé du temps a regarder ce que tu as fais et à rédiger mon commentaire (il est mieux construit au début qu'à la fin, mais c'est la fatigue), je sui réellement allé cherché ton code et j'ai tenté de le lancer. Comprends que si ton truc ne marche pas en y aillant passé environ 1h30 à 2h, c'est qu'il y a un vrai problème. Je connais le java et je peux aller voir ce qu'il s'y passe. J'aurais pu lancer n'importe quel hello world vu, angular, react, elm, python ou brainfuck en 10 minutes. En terme de qualité c'est très loin de ce que l'on peut attendre d'un truc qu'on voudrait réutiliser (dans un cadre professionnel ou pas).

      Désolé que tu y ai passé tout ce temps, alors que ça fonctionnait probablement dés le début… Et encore une fois, c'est indiqué dans le journal, ce qui est présenté ici, c'est un prototype, donc quelque chose qui est uniquement mis à disposition pour quiconque voudrait l'essayer, et absolument pas pour être utilisé dans un cadre professionnel…

      En tout cas, merci d'avoir pris le temps d'essayer ce logiciel, et de rédiger un commentaire qui soit plus constructif que la plupart de ceux que j'ai pu lire jusqu'à présent… Il me confirme que je suis vraiment pas doué en terme de communication…

      Freelance en ingénierie logicielle.

      • [^] # Re: Mais il n'y a vraiment pas de quoi...

        Posté par . Évalué à 8.

        Le seul but de ce journal, c'est de présenter un projet et de fournir un moyen simple de l'essayer. Si ce projet ne vous intéresse pas, il vous suffit de passer votre chemin (si possible, sans essayer de me convaincre de ne pas utiliser C++ pour faire du web ; ce n'est pas le sujet, et ça n'apporte absolument rien au débat). S'il vous intéresse, libre à vous de l'essayer, et de me faire remonter vos observations, que je lirais attentivement, via les commentaires.

        J'avais commencé à écrire une réponse et je suis tombé là dessus. Je ne sais pas si tu te moque de moi ou si c'est autre chose. Pour éviter de continuer à perdre mon temps je vais passer mon chemin.

        • [^] # Re: Mais il n'y a vraiment pas de quoi...

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

          Ce chapitre ne te concerne pas personnellement (d'où le vouvoiement, alors que j'ai utilisé le tutoiement pour m'adresser à toi juqu'à présent). C'est juste un résumé de l'objectif du journal, à l'intention de tout ceux qui liraient ce commentaire et pour qui cela ne serait pas clair.

          Quand je dis que je suis un mauvais communicant…

          Freelance en ingénierie logicielle.

      • [^] # Re: Mais il n'y a vraiment pas de quoi...

        Posté par . Évalué à 9.

        Cette bibliothèque me sert donc de vitrine commerciale, pour me faciliter la prospection. Mais surtout, j'envisage de monter une structure commerciale pour la valoriser d'une manière ou d'une autre.

        Puis

        Pourquoi devrais-je donner une raison ? Je donne à tout un chacun le moyen de tester ma bibliothèque pour qu'il puisse se forger sa propre opinion à son propos. Après, libre à lui d'en rester à sa stack bien-aimée ad vitam æternam, peu me chaut…

        Je crois que c'est mal parti pour la valorisation commerciale… Pourquoi donner une raison ? Bin parce qu'on a tous (ou presque) un métier, un temps limité pour tester les whatmille technos qui sortent quotidiennement. Donc d'un côté il y a les outils/langage qu'on maîtrise et qui sont (comme le rappelle Barmic) largement supportés et testés (donc facilité d'obtenir de l'aide). De l'autre il y a un truc visiblement novateur mais pas clair et l'auteur n'a aucune intention de nous expliquer ce qu'il apporte. Bon bin on va continuer avec ce qu'on connaît (et qui fonctionne). Ou on va tester des projets qui auront su se rendre intéressants, dont on comprend le fonctionnement. Rien que le côté appel à une API située dieu sait où pour faire tourner mon code, c'est rédhibitoire. Je préférerais que la doc me dise comment l'installer et y accéder sur localhost:8000 …

        J'admire ta motivation mais c'est à double tranchant. Parfois il faut faire une pause, réfléchir à l'objectif, et à la bonne façon d'y arriver. (Et aussi se demander si l'objectif en question est souhaitable, réalisable, …)

        Mes connaissances Java et C++ sont plutôt obsolètes donc je n'ai pas de conseil technique à te donner, mais trouve toi vite quelqu'un qui comprend ce que tu fais et qui saura le vendre. Comme ça ça t'évitera de faire fuir les potentiels intéressés, il pourra se consacrer à la communication et toi au code.

        • [^] # Re: Mais il n'y a vraiment pas de quoi...

          Posté par (page perso) . Évalué à -2. Dernière modification le 04/08/18 à 17:36.

          La seule raison que je puisse donner pour utiliser cette bibliothèque, c'est celle qui m'a motivée à la développer, c'est-à-dire pouvoir coder l'intégralité d'une application web en C++. Sauf, et je pense que l'ensemble des commentaires de ce journal l'ont clairement établit, que peu de personnes utiliseront cette bibliothèque pour cette raison. Au contraire même, le fait qu'il faille faire du C++ pour l'utiliser serait même plutôt, pour beaucoup de personnes, une raison de ne pas l'utiliser. Je ne critique pas, je constate. Du coup, je me suis bien gardé d'avancer cette raison.

          Avant de me lancer dans son développement, j'ai regardé ce qui existait, et j'ai constaté que beaucoup d'outils s'appuyaient sur MVC. J'ai regardé ce dont il s'agissait, et je n'en pas vu l'intérêt, sachant que ça fait des années que je développe des interfaces natives sans avoir à m'appuyer sur MVC. Là aussi, apparemment, je fais figure d'exception, semble-t-il, vu que, selon certains commentaires, MVC semble être aussi la norme en matière d'interfaces natives.

          Bref, n'ayant jamais utilisé l'un de ces outils basé sur MVC, je serais bien en peine d'avancer ne fût-ce qu'une raison qui pourrait pousser quelqu'un à délaisser son outil au profit de ma bibliothèque, et ce malgré tous les bindings que je pourrais réaliser pour faciliter l'accès à cette bibliothèque. C'est malheureux, mais c'est ainsi. En outre, ces personnes seront d'autant plus réticent qu'il leur a certainement fallu pas mal de temps pour maîtriser l'outil qu'ils utilisent. Il faudra donc de sacrées bonnes raisons pour les pousser à faire une croix sur cet investissement au profit de ma bibliothèque…

          Clairement, Le gros problème de ce projet, c'est moi. Ça lui serait nettement plus bénéfique si je pouvais me cantonner à l'aspect technique, et laisser quelqu'un de plus doué que moi en communication en faire la promotion. Sauf que, pour l'instant, je suis seul sur ce projet, et donc, je fais avec. Donc, je communique tant bien que mal, apparemment plutôt mal que bien, sachant qu'il est toujours préférable de mal communiquer que de ne pas communiquer du tout !

          Je ne sais plus si c'est dans ce journal ou l'autre que j'en parle, mais j'ai le projet d'animer des ateliers autour de cette bibliothèque. Le fait qu'elle soit disponible en plusieurs langages et simple à installer, combiné au fait qu'elle permet de manipuler, sans artifices particuliers, les concepts de base des technos web, à savoir HTML, CSS et DOM, je pense que cette bibliothèque est un bon outil d'initiation à ces concepts. J'ignore si ces ateliers seront, par ailleurs, profitables à ma bibliothèque, mais, là encore, mieux vaut faire ces ateliers que de ne rien faire du tout…

          Freelance en ingénierie logicielle.

          • [^] # Re: Mais il n'y a vraiment pas de quoi...

            Posté par . Évalué à 4.

            Où est le C++ ? Si c'est un framework web en C++, montre nous des exemples dans ce langage, on se contre fou des bindings en Java ou PHP.

            Pour moi c'est ta première erreurde communication.

            • [^] # Re: Mais il n'y a vraiment pas de quoi...

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

              https://github.com/epeios-q37/epeios/tree/master/apps/orgnzq/frontend/XDHTML, notamment les fichiers (.h/.cpp) prolog, login, main, column, field, fields, record et records.

              Les journaux correspondants :

              ou encore https://github.com/epeios-q37/epeios/tree/master/apps/mmuaq/frontend/XDHTML, notamment les fichiers (.h/.cpp) agent, agents, config, folders, mail, mails, prolog, login, main.

              Les journaux correspondants :

              mais tu ne vas probablement rien comprendre, parce que j'utilise un framework maison, et pas seulement pour la partie web. C'est pour ça que je n'en parle pas.

              Les bindings Java, Node.js, PHP… permettent de faire abstraction de ce framework.

              Freelance en ingénierie logicielle.

              • [^] # Re: Mais il n'y a vraiment pas de quoi...

                Posté par . Évalué à 5.

                Effectivement ton nommage particulier et tes macris sont un repoussoir à la lecture et à toute contribution. Je te conseillerais de revenir à un nommage classique et d'éviter ton style étrange avec tes macros.

                Je commence à comprendre un peu les choses avec tes billets précédents mais cela ne m'attire toujours pas à cause de la forme dans un premier temps. Pour le fond, le JavaScript à un intérêt pour faire travailler le navigateur et non le serveur.

                Penche toi plutôt sur le WebAssembly qui sera le futur des applications web lourdes et faite pour nous les codeurs C++.

              • [^] # Re: Mais il n'y a vraiment pas de quoi...

                Posté par . Évalué à 9.

                J'ai parcouru les journaux précédents et en fait je constate que ça fait 2 ans qu'on te dit les mêmes choses. Ton thread avec Benoar, datant de 07/2016, reprend à peu près tout ce qu'on a dit ici (l'objectif, les noms, les standards, …).

                Il t'explique aussi pourquoi tu auras beaucoup de mal à avoir des retours constructifs :

                Le problème c'est que je ne vais pas chercher des heures à comprendre ce que fait ta bibliothèque si j'ai l'impression qu'elle ne m'apporte rien. Pas de description, etc, je laisse tomber. Alors encore, si elle s'intégrait bien à l'existant, et que c'était utilisable en dehors de tout ton framework, pourquoi pas, mais je n'ai pas l'impression : tout semble très imbriqué, du coup je n'ai même pas espoir que cette fonctionnalité intéressante puisse être utilisée ailleurs. (déjà je fais du C, donc c'est niet)

                on ne comprend pas, donc, au lieu d'approfondir, ou de demander des éclaircissement au développeur si l'on a pas envie de se plonger dans le code (ce que je comprends tout à fait), on se répand en généralités sans rapports pour discréditer le framework en question.

                Essaye de penser que tu n'es pas au centre du monde : malheureusement, ton « standard » n'est pas le standard, et c'est en général plutôt à toi de t'adapter aux autres que l'inverse.

                Et je ne dis pas ça pour t'embêter, mais juste pour que tu remettes les pieds sur terre et te rende compte que personne ne s'intéressera à ton travail si tu le présente et le développe ainsi. Ce n'est peut-être pas ce que tu cherches, mais tu disais vouloir au moins avoir des retours, et je t'explique pourquoi je pense que tu n'en auras pas.

                Et 24 mois plus tard, tu t'obstines encore à pousser ton framework (certe, aujourd'hui masqué par une API) dont tu dis toi même qu'on ne va "probablement rien comprendre". Tu aimes ce que tu fais, c'est évident. Et en plus ça te sert professionnellement, donc tant mieux. Mais je crois que ça s'arrêtera là (chez toi et tes clients). C'est déjà très bien d'avoir une passion et de pouvoir en vivre mais en continuant sur cette voie, je doute que tu parviennes à ton objectif de "vitrine commerciale".

                Cela dit, je ne te dirai pas d'arrêter. Tu as développé ton "bébé", tu l'aimes, il te sert, continue. Mais pour faire rentrer de l'argent, regarde aussi ailleurs. La proposition de Belegar ci-dessus (WebAssembly) me paraît être la meilleure.

          • [^] # Re: Mais il n'y a vraiment pas de quoi...

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

            Avant de me lancer dans son développement, j'ai regardé ce qui existait, et j'ai
            constaté que beaucoup d'outils s'appuyaient sur MVC. J'ai regardé ce dont il s'agissait,
            et je n'en pas vu l'intérêt, sachant que ça fait des années que je développe des
            interfaces natives sans avoir à m'appuyer sur MVC. Là aussi, apparemment, je fais figure
            d'exception, semble-t-il, vu que, selon certains commentaires, MVC semble être aussi la
            norme en matière d'interfaces natives.

            Ce qui est assez "rigolo" dans l'histoire et dans ton analyse (et doit choquer plus d'une personne ici) c'est que le MVC à été développé POUR la conception des "interfaces natives" (ou parle plutôt de GUI d'ailleurs), et que le concept à tellement de vertus en terme d'organisation et de structuration de code, de maintenance et d'évolutivité … que des frameworks "MVC"-like se sont rapidement développés pour la conception d'interface WebUI.

            • [^] # Re: Mais il n'y a vraiment pas de quoi...

              Posté par (page perso) . Évalué à -2.

              Quand je me suis intéressé au développement d'interfaces natives, j'ai consulté la doc. et les tutos, pas de manière très approfondie, il est vrai, de toolkits comme Qt, wxWidgets, qui devait encore s'appeler wxWindows à l'époque, et d'autres dont je ne me souviens plus du nom. Or, je ne me souviens pas qu'il y soit jamais fait référence à MVC. Peut-être que je n'ai pas poussé ma lecture assez loin.

              Lorsque je me suis intéressé au développement d'interfaces web, j'ai également consulté la doc. et les tutos de différents framework, et là, il y est rapidement fait référence à MVC. Et pourtant, je n'ai pas l'impression d'avoir pousser ma lecture plus loin qu'avec les docs et tutos ci-dessus, d'où ma méprise.

              Freelance en ingénierie logicielle.

              • [^] # Re: Mais il n'y a vraiment pas de quoi...

                Posté par . Évalué à 5. Dernière modification le 05/08/18 à 15:28.

                Dans Qt, la partie MVC est visible dans les classes TableView, ListView et dans QML en général (le C++ pour la logique, le QML pour l'interface).

  • # concept "daté"

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

    Je ne vais pas reproduire les manquements déjà relevé dans le journal, si j'ai bien compris l'idée derrière tes librairies et tes interfaces l'idée c'est de développer des applications Web sans écrire de javascript ?

    En gros le framework se charge d'écrire le javascript nécessaire a binder le serveur ("l'application") et le navigateur et tout ce gère coté serveur ?

    Du coup au final l'application est en interface directe sur le web ? c'est donc un serveur web indépendant à chaque fois ?

    Personnellement en tant qu'admin-sys ce genre d'appli je n'ai pas confiance, ça implique un vecteur d'entrée sur mes systèmes qui n'a jamais été vraiment testé en terme de sécu…

    Pour packager une appli avec medias ça implique d'avoir un serveur web a coté juste pour les medias ?

    Dans tout les cas mon plus gros warning sur ta techno qui me fait dire qu'elle ne peut pas prendre de l'élan est tout simplement que ça va à l'encontre des besoins "primaires" des utilisateurs: de la réactivité.

    Les applis web actuelles cherchent toutes à optimiser les opérations faites 'en local' (sur le navigateur client) et à réduire les interactions coté serveur (réductions des échanges en nombres de requêtes, mise en caches des datas, stockages locaux au navigateurs, opérations asynchrones, …) car au final c'est ça qui coute le plus.

    Et au contraire d'un javascript généré dont on a pas le contrôle on va préférer un JS optimisé, "compilé" pour être testé et validé sur les différents navigateurs, voir traduit depuis un language superset un peu plus clean type typescript.

    Tes librairies traduisent d'un mode de fonctionnement client-serveur fort datant des débuts du web et qui sont à l'abandon maintenant

Suivre le flux des commentaires

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