Journal Java 9 est dehors

PostĂ© par (site web personnel) . Licence CC By‐SA.
Étiquettes :
43
22
sept.
2017

Bonjour Nal,

Je t’écris pour t’informer de la sortie de la nouvelle et trĂšs attendue version majeure de Java, l’une des plus grosses plates‐formes de dĂ©veloppement du marchĂ©. Voici un petit tour des nouveautĂ©s :

Titre de l’image

Victime de jmod

La principale nouveautĂ© est l’introduction d’un systĂšme de modules. Ce systĂšme mĂ©rite un journal complet, mais le principal apport sera le « debloat » (un peu) de l’environnement d’exĂ©cution et des applications Java.

Dans les poĂšmes de jshell

Un outil jshell permet de jouer avec le langage en ligne de commande et utiliser le langage pour faire du script : pratique pour remplacer des scripts Shell ou Python !

 jshell> double PI = 3.1415926535
 PI ==> 3.1415926535
 | created variable PI : double
 jshell> volume(2)
 | attempted to call method volume(double) which cannot be invoked until method cube(double) is declared
 jshell> double cube(double x) { return x * x * x; }
 | created method cube(double)
 | update modified method volume(double)
 jshell> volume(2)
 5ăƒ‰ăƒ« ==> 33.510321637333334
 | created scratch variable 5ăƒ‰ăƒ« : double

Applet mon numéro

Une excellente nouvelle : le greffon Java pour navigateur va rejoindre Flash et Silverlight dans le purgatoire des technologies pénibles.

What string color

Les chaßnes de caractÚres prendront moins de place en mémoire si elles contiennent des caractÚres latin 1.

Ramasse‐miettes, chouette, c’est sympa

G1 sera dĂ©sormais le ramasse‐miettes par dĂ©faut. L’idĂ©e est de privilĂ©gier la faible latence. Des impacts sont Ă  prĂ©voir sur les applications en production : il faudra faire des tests sĂ©rieux pour voir s’il y a un gain ou perte, chaque application ayant des besoins et des objectifs diffĂ©rents.

Trololog

Une nouvelle API de journalisation minimaliste a Ă©tĂ© ajoutĂ©e. Je n’ai pas compris pourquoi ce changement, l’API actuelle n’étant pas bien compliquĂ©e.

UTF-8 vaincra

Les fichiers *.properties pourront enfin ĂȘtre Ă©crits en UTF-8. Ces fichiers, souvent utilisĂ©s pour l’internationalisation, Ă©taient limitĂ©s Ă  l’ISO-8859-1 (latin 1)...

Autres changements

  • les chauves seront contents d’apprendre l’ajout d’une API pour manipuler des TIFF ;
  • la gestion des hautes rĂ©solutions (HiDPI) permettra de ne plus saigner des yeux sous GNU/Linux et Windows ;
  • GTK 3 est enfin gĂ©rĂ©, il faudra toutefois l’activer via la propriĂ©tĂ© jdk.gtk.version.
  • # DĂ©pĂȘche ?

    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  6.

    Ce nourjal mĂ©riterait une dĂ©pĂȘche.

    • [^] # Re: DĂ©pĂȘche ?

      PostĂ© par . ÉvaluĂ© Ă  4.

      M'enfin, j'ai mĂȘme pas appris si l'implĂ©mentation libre de Java suit vers cette version 9 ou pas?

      ⚓ À g'Auch TOUTE! http://afdgauch.online.fr

      • [^] # Re: DĂ©pĂȘche ?

        PostĂ© par . ÉvaluĂ© Ă  5.

      • [^] # Re: DĂ©pĂȘche ?

        PostĂ© par . ÉvaluĂ© Ă  6.

        C'est l'implémentation de référence, donc oui, ça suit.

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: DĂ©pĂȘche ?

          PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

          ça suit, donc oui, C'est l'implémentation de référence.

          ça précÚde, non ? Selon le principe du « _release early, release often _»

          Me gourre-je ?

          • [^] # Re: DĂ©pĂȘche ?

            PostĂ© par . ÉvaluĂ© Ă  5.

            Me gourre-je ?

            Oui. C'est « me gourré-je », me semble-t-il ;)

    • [^] # Re: DĂ©pĂȘche ?

      PostĂ© par . ÉvaluĂ© Ă  8.

      Clairement !

      Mais il faudrait sans doute compléter un peu. La liste complÚte des nouveautés est ici.

      Dans les nouveautés sympathiques (non citées dans le journal), je vois aussi :
      - les méthodes privées dans les interfaces (pour partager le code entre méthodes default ou static)
      - les fabriques statiques pour les collections immuables : Set.of(...), List.of(...), Map.of(...)
      - implémentation de Reactive Streams (classe Flow)

      Bon bien sĂ»r, tout le monde ne s'intĂ©resse pas aux mĂȘmes fonctionnalitĂ©s !

      • [^] # Re: DĂ©pĂȘche ?

        PostĂ© par . ÉvaluĂ© Ă  5.

        • les fabriques statiques pour les collections immuables : Set.of(...), List.of(...), Map.of(...)

        Enfin!

  • # Latin-1 :'(

    PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  3.

    C'est triste de voir des strings en Latin-1 plutĂŽt qu'en UTF-8 qui aurait fait ganger Ă  peu prĂšs autant de place.

    Pour le logging, apparament le but est d'avoir un support pour les logs directement dans le coeur de Java, afin d'éviter que tous les autres modules (ou presque) dépendent de java.util.logging.

    • [^] # Re: Latin-1 :'(

      PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  5.

      C'est une question de performances je suppose : UTF-8 utilise des caractĂšres qui n'ont pas tous la mĂȘme longueur (en octets), ce qui complexifie pas mal les traitements.

      La connaissance libre : https://zestedesavoir.com

    • [^] # Re: Latin-1 :'(

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  1.

      Avant UTF-16, maintenant UTF-8, non ? du moins c'est ce que j'en déduis..

      • [^] # Re: Latin-1 :'(

        PostĂ© par (Mastodon) . ÉvaluĂ© Ă  4.

        Non, pas du tout. En fait, avant, tout Ă©tait codĂ© en UTF-16. Maintenant, un objet String contient un nouveau champ qui prĂ©cise l'encodage utilisĂ©. Ça va ĂȘtre latin1 si possible, ou UTF-16 sinon. Pour le dĂ©veloppeur, ça ne devrait rien changer, c'est un dĂ©tail d'implĂ©mentation et l'API publique ne change pas.

    • [^] # Re: Latin-1 :'(

      PostĂ© par . ÉvaluĂ© Ă  -1.

      Je trouve surtout triste de voir implĂ©mentĂ©e une solution qui pour faire Ă©conomiser de la mĂ©moire aux pays anglophones va faire perdre de la mĂ©moire Ă  tous les pays qui n'ont pas leur alphabet entier dans Latin-1. Les compagnies de haute technologie ont beau ĂȘtre majoritairement amĂ©ricaine, je trouve tout ça trĂšs regrettable. Alors oui, ça n'est qu'un flag par chaĂźne de caractĂšres, mais sur des milliards de chaĂźnes de caractĂšres, ça fait beaucoup de gĂąchis.
      Désolé, votre alphabet est un alphabet de seconde zone, revenez plus tard.

      • [^] # Re: Latin-1 :'(

        PostĂ© par (Mastodon) . ÉvaluĂ© Ă  4.

        Les strings, ça ne sert pas qu'Ă  afficher du texte Ă  destination de l'utilisateur, et donc, mĂȘme pour une application affichĂ©e en chinois (par exemple), il y aura probablement beaucoup de chaines de caractĂšres qui sont codables en latin1 : requĂȘtes SQL, chemins vers des fichiers, URLs, messages pour les logs, etc.

        Au final, on gagnera de la place sur tout ça, et ça risque bien de largement contrebalancer le fait qu'on doive stocker un flag supplémentaire sur chaque objet string.

    • [^] # Re: Latin-1 :'(

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

      CPython a implémenté une optimisation similaire dans Python 3.3:
      https://www.python.org/dev/peps/pep-0393/

      Si une chaĂźne ne contient que des caractĂšres dans U+0000-U+00FF ("Latin1") : 1 octet par caractĂšre. Que dans U+0000-U+FFFF ("BMP") : 2 octets par caractĂšres. Sinon ("Astral"), 4 octets par caractĂšre (dĂ©solĂ© pour vos jolis emojis). Du coup, "toto" prend 4 octets au lieu de 16 avec Python 2 (en ignorant les entĂȘtes des objets).

      • [^] # Re: Latin-1 :'(

        PostĂ© par . ÉvaluĂ© Ă  1.

        En Python 2 "toto" prend 4 octets, tu confonds avec u"toto" ;-)

  • # AH ah ah ...

    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  10.

    Bon c'est dredi on se lĂąche un peu :

    Un outil jshell permets de jouer avec le langage en ligne de commande et utiliser le langage pour faire du scripting: pratique pour remplacer des scripts shell ou python!

    Bon courage :)

    • [^] # Re: AH ah ah ...

      PostĂ© par . ÉvaluĂ© Ă  2.

      bah en fait ils introduisent aussi de la compilation ahead of time, donc si tu fais un script java, tu compile, et ça démarre trÚs vite (ce qui a souvent été le problÚme du scripting en java).

      rien Ă  voir avec jshell ceci dit :)

      • [^] # Re: AH ah ah ...

        PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

        Je n'ai rien contre Java (ou presque ... trop de machine virtuelle 1.6 1.7 1.8)
        C'est un excellent langage mondialement reconnu avec des librairies et des outils exceptionnels, j’espùre avoir compris ce que sont : TOMCAT / JBOSS / HIBERNATE / ElasticSearch

        mais

        pour remplacer des scripts shell ou python!

        honnĂȘtement j'ai du mal Ă  le croire, Java est toujours "fortement typĂ©" non ... ou il a plus Ă©voluĂ© que ce je croyais ...

        Attention je dis pas que c'est impossible, mais difficile Ă  croire quand on connais le shell et python et un peu java
        A mon humble avis ... of course

        • [^] # Re: AH ah ah ...

          PostĂ© par . ÉvaluĂ© Ă  4.

          Quel est selon toi la contrainte à faire un langage de script avec un langage fortement typé ?

          • [^] # Re: AH ah ah ...

            PostĂ© par (site web personnel) . ÉvaluĂ© Ă  5.

            Par expérience :

            Les cas sont rares ou il y a besoin de typage en shell, je stocke généralement des chaßnes, nom de de fichiers le plus souvent
            des chemins ou listes de chaĂźnes

            d'ailleurs des qu'il faut calculer ( un entier, une date etc ...) je bascule en python, ou qu'il faut soigner une présentation comme un rapport de sauvegarde par mail

            Il est vrai que je scripte du shell "portable" une vieille habitude de l'époque ou il y avait plusieurs Unix en circulation.
            parfois on m'a imposer du ksh et c'est plus facile.

            Et parfois certaines "applications" mélangent script shell + langage plus évolué comme Perl ou Python

            Et quand je dis application il s'agit de lire un fichier de vérifier un format, d'en extraire certaines données de le transférer sur un autre serveur, de générer du SQL et de l'injecter dans une base de données puis d'envoyer un compte rendu et un mail pour prévenir.

            C'est possible de faire la mĂȘme chose en java complĂštement ou partiellement c'est sur, mais certaines formes d'Ă©criture en shell sont tellement pratique et efficace qu'il serait dommage de s'en passer

            ex : [ -d $REP ] || mkdir $REP # l'équivalent java (idem python / perl) doit prendre un peu plus de lignes :)

            Autre exemple découvert derniÚrement :

            timeout 5h synchro.sh

            Si le script synchro.sh met plus de 5h alors il sera "killer"

            pratique pour effectuer des synchronisation partielle en automatique

            Certains outils sont tellement pratique et efficace qu'il est dommage de ne pas les apprendre

            Ainsi j'aimerais savoir quel est l'équivalent python de JBOSS et HIBERNATE en aussi abouti

            • [^] # Re: AH ah ah ...

              PostĂ© par . ÉvaluĂ© Ă  2.

              ex : [ -d $REP ] || mkdir $REP # l'équivalent java (idem python / perl) doit prendre un peu plus de lignes :)

              Pour python du moins, pas vraiment. C'est peut ĂȘtre un poil moins rapide/intuitif par contre.

              os.path.isdir(d) or os.mkdir(d)

              Merci de prendre le commentaire ci-dessus avec: un peu de recul, le premier degré, et si possible le second !

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel) . ÉvaluĂ© Ă  5.

                Pour python le code exact serait plutot :

                import os
                d = 'toto'
                os.path.isdir(d) or os.mkdir(d)

                En shell :

                REP=toto
                [ -d $REP ] || mkdir $REP

                Si tu pouvais compléter en java vu mon niveau cela me prendrais trop longtemps (stp ne serait ce que pour ma culture personnelle)

                Ensuite je veux récupérer le premier argument de la ligne de commande

                en shell :
                REP=1ăƒ‰ăƒ«
                [ -d $REP ] || mkdir $REP

                cela risque de rajouter pas mal de choses en python comme en java, mais c'est normal
                ces langages n'ont pas le mĂȘme usage.

                python comme java nécessite plus de réflexion préalable avant de pondre un traitement qui tourne
                le shell est parfait dans son rÎle de "glue" et par son universalité et sa disponibilité.

                J'ai des scripts shell Ă©crit au siĂšcle dernier qui tourne encore cela risque d'ĂȘtre moins vrai pour python et java
                mais ces langages font un peu plus de chose que ce vénérable sh

                IL est vrai que je faisais déjà du shell avant les premiÚres versions de java et de python

                Et dans son rĂŽle le shell sera difficile Ă  dĂ©boulonner, mĂȘme M$ l’intĂšgre sur ses OS :) (ok c'est pas un rĂ©fĂ©rence)

                Pour finir une petite touche de méchanceté gratuite et assumée (l'apanage des sysadmins :) )
                sur une machine devant tourner 24/24 7/7 tu préféres : 10 scripts java ou 10 scripts shell ...

                • [^] # Re: AH ah ah ...

                  PostĂ© par . ÉvaluĂ© Ă  3.

                  cela risque de rajouter pas mal de choses en python comme en java, mais c'est normal
                  ces langages n'ont pas le mĂȘme usage.

                  En python, pas vraiment, c'est trĂšs simple:

                  import sys
                  import os
                  rep = sys.argv[1]
                  os.path.isdir(rep) or os.mkdir(rep)

                  Je dirais mĂȘme qu'au contraire, on gagne en ligne des qu'on dĂ©passe le cas trĂšs simple. Par exemple, on peut tester si une option est passĂ©e en argument sans devoir se soucier de l'ordre des arguments:

                  if "--my-arg-1" in sys.argv:
                   action_1()
                • [^] # Re: AH ah ah ...

                  PostĂ© par (site web personnel) . ÉvaluĂ© Ă  6.

                  Pour finir une petite touche de méchanceté gratuite et assumée (l'apanage des sysadmins :) )
                  sur une machine devant tourner 24/24 7/7 tu préféres : 10 scripts java ou 10 scripts shell ...

                  Si tu dois tourner 24/7 désolé mais Java (et encore mieux Scala, mais bon je reste dans tes choix).
                  Plus le typage est fort moins tu as de risque de surprise à l'éxecution, donc shell est presque le pire choix.

            • [^] # Re: AH ah ah ...

              PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

              ex : [ -d $REP ] || mkdir $REP # l'équivalent java (idem python / perl) doit prendre un peu plus de lignes :)

              new java.io.File(rep).mkdir()
              

              De rien.

              P.S. : il se passe quoi avec ton code si REP contient un espace ?

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel) . ÉvaluĂ© Ă  4.

                Bon faut ĂȘtre honnĂȘte ça fait pas exactement pareil (ça crĂ©e le dossier mais s'il existait dĂ©jĂ  ça renvoie false). LĂ  c'est bon :

                File f = new File(rep); f.isDirectory() || f.mkdir()

            • [^] # Re: AH ah ah ...

              PostĂ© par . ÉvaluĂ© Ă  4.

              AprĂšs c'est quand mĂȘme beaucoup une question de goĂ»t, et surtout d'expĂ©rience.

              Quand je lis ça :

              [ -d $REP ] || mkdir $REP

              Je me dis : OK, je vais crĂ©er un rĂ©pertoire, mais c'est quoi le truc avant ? Ah oui, la syntaxe shell permet de "tester" en utilisant une syntaxe qui fait penser Ă  un argument (le "-p"). Évident pour celui qui fait du shell depuis 15 ans, cryptique pour celui qui en fait peu ou prou.

              En bon développeur java, le code code java correspondant (comme celui fourni par Sufllope plus bas) me semble infiniment plus clair, et donc plus maintenable.

              Et puis, $REP c'est quoi ? Une simple chaĂźne, ou une liste de fichiers/rĂ©pertoires ? Et comment se comporte mkdir si tu lui passes plusieurs rĂ©pertoires ? Tout ça, un expert shell va le savoir sans avoir besoin d'aller consulter man ; lĂ  oĂč un dĂ©veloppeur java va prĂ©fĂ©rer itĂ©rer sur une liste et tester pour chaque rĂ©pertoire ce qui se passe, et comment se comporter en cas d'erreur.

              Alors, comme dit Ă©galement plus bas, java n'a pas Ă©tĂ© pensĂ© pour l'Ă©criture rapide de scripts. Mais en ce qui me concerne, l'Ă©criture rapide de script est souvent une mauvaise solution Ă  un problĂšme. Mauvaise solution qui peut quand mĂȘme ĂȘtre la meilleure par manque de temps, du coup je sais quand mĂȘme faire du shell...

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel) . ÉvaluĂ© Ă  8.

                Vous savez quoi ... vous m'avez convaincu que l'informatique a évolué ...
                je ne vais pas scripter en java, mais j'ai compris que c'était possible, et pas qu'en java d'ailleurs ...

                Bon je vais de ce pas rejoindre le mouvement de libération des vieux de Huguette et Raymond ...

              • [^] # Re: AH ah ah ...

                PostĂ© par . ÉvaluĂ© Ă  3. DerniĂšre modification le 01 octobre 2017 Ă  14:29.

                [ -d $REP ] || mkdir $REP

                Je ne comprends pas la différence (fonctionnelle) que ça peut faire avec un simple mkdir $REP ?

                Il faudrait effectivement mettre des guillemets doubles autour de $REP, c’est une chaĂźne, pas un entier, donc la valeur peut inclure des espaces et il faut dans ce cas Ă©viter qu’elle soit splittĂ©e en N tokens...

                Sinon moi aussi en shell je prĂ©fĂšre Ă©crire des trucs comme : [ ... ] && ... ou [ ... ] || ..., en regroupant Ă©ventuellement Ă  l’aide d’accolades, plutĂŽt qu’utiliser le mot clĂ© if, c’est juste une question de concision. Ce n’est en rien cryptique. On peut Ă©galement utiliser la commande test implicitement (Ă  la place du crochet ouvrant) c’est tout aussi limpide.

                Et puis, $REP c'est quoi ? Une simple chaßne, ou une liste de fichiers/répertoires ?

                J’aurais appelĂ© la variable $REPS si c’était une liste (aka "tableau" en shell) :) Je fais d’ailleurs pareil en Python, une variable « au pluriel », c’est une liste (ou un set, bref, un itĂ©rable...), je trouve ça plus plaisant que prĂ©fixer chaque variable avec son type : l_truc, i_machin, etc... (ou je sais ma mĂ©thode prĂ©sente des inconvĂ©nients, pour les cas Ă©quivoques j’utilise le prĂ©fixage ou bien je trouve un synonyme qui termine pas par un s au singulier...)

                Et comment se comporte mkdir si tu lui passes plusieurs répertoires ? Tout ça, un expert shell va le savoir sans avoir besoin d'aller consulter man ;

                Un expert ? Si tu sais pas comment se comporte mkdir avec plusieurs arguments je dirais que tu n’as mĂȘme pas le niveau basique pour utiliser un shell *NIX, tu devrais mĂȘme pas avoir Ă  relire les scripts de quelqu’un d’autre, non ?

                Et puis... Je ne suis ni un expert ni un dĂ©butant, la commande man je l’utilise sans retenu, je vois vraiment pas pourquoi je devrais me farcir la mĂ©moire avec toutes les options de toutes les commandes... et souvent j’ouvre le man simplement pour vĂ©rifier que ma mĂ©moire est bonne...

                lĂ  oĂč un dĂ©veloppeur java va prĂ©fĂ©rer itĂ©rer sur une liste et tester pour chaque rĂ©pertoire ce qui se passe, et comment se comporter en cas d'erreur.

                C’est tout a fait possible en shell, comme avec n’importe quel langage, c’est en rien une obligation d’appeler une seule fois mkdir _o_

                En Java aussi je suppose que tu as le choix entre itérer sur la liste ou bien passer la liste directement à la fonction de base (built-in) qui crée les répertoires.

                • [^] # Re: AH ah ah ...

                  PostĂ© par . ÉvaluĂ© Ă  2.

                  [ -d $REP ] || mkdir $REP
                  Je ne comprends pas la différence (fonctionnelle) que ça peut faire avec un simple mkdir $REP ?

                  Dans pas mal de cas on s'en fiche. Mais si on écrit des scripts qui tiennent la route ça pose problÚme.

                  Ca évite l'affichage d'un message d'erreur.
                  On peut remplacer par mkdir "$REP" >/dev/null mais ce n'est pas mieux.

                  Et ça évite de générer un code de retour !=0 (utile par exemple si le script contient set -o errexit
                  On peut remplacer par mkdir "$REP" || true mais pareil, ce n'est pas mieux.

                  Si on veut la totale ça fait mkdir "$REP" >/dev/null || true

            • [^] # Re: AH ah ah ...

              PostĂ© par (site web personnel) . ÉvaluĂ© Ă  4.

              [ -d $REP ] || mkdir $REP

              Je sais que c'est pas le sujet mais, c'est quoi l'intĂ©rĂȘt par rapport Ă  un mkdir -p $REP ?

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel, Mastodon) . ÉvaluĂ© Ă  5.

                ça ne crée pas les dossiers parents s'ils n'existent pas.

                • [^] # Re: AH ah ah ...

                  PostĂ© par . ÉvaluĂ© Ă  3.

                  Je dois pas ĂȘtre bien rĂ©veillĂ© mais je comprends pas la diffĂ©rence avec un simple mkdir $REP qui ne crĂ©era pas non plus les parents (et qui ne fera rien si $REP est dĂ©jĂ  un rĂ©pertoire) ?!

                  Si $REP est un fichier (pas rĂ©pertoire) existant il n’y a, sauf erreur, pas de diffĂ©rence non plus : le mkdir crĂ©era rien du tout.

                  Quelqu’un pour m’expliquer ?

                  • [^] # Re: AH ah ah ...

                    PostĂ© par . ÉvaluĂ© Ă  2.

                    Si le fichier existe dĂ©jĂ  (que ce soit un rĂ©pertoire ou pas), mkdir Ă©chouera (code de retour > 0) avec un message d'erreur, ce n'est pas la mĂȘme chose que ne rien faire.

                    • [^] # Re: AH ah ah ...

                      PostĂ© par . ÉvaluĂ© Ă  3.

                      Oui ok...

                      Ce n’est pas la mĂȘme chose mais le rĂ©sultat sera le mĂȘme, avec en plus, l’information que le rĂ©pertoire existe dĂ©jĂ  indiquĂ©e sur stderr :)

                      Bon, c’est vrai que si le fait que le rĂ©pertoire existe dĂ©jĂ  n’est pas une erreur on peut justement souhaiter ne rien avoir sur stderr...

                      Merci pour ta réponse.

                      • [^] # Re: AH ah ah ...

                        PostĂ© par . ÉvaluĂ© Ă  2.

                        Il n'y a pas que ça, si on a activĂ© dans le script l'option set -e, alors si le mkdir Ă©choue le script s'arrĂȘte lĂ .
                        Et mĂȘme sans ça, si on est dans une fonction et que le mkdir est la derniĂšre commande de la fonction, alors son code de retour devient le code de retour de la fonction, ce qui n'est peut-ĂȘtre pas ce qu'on voulait.

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

                C'est vrai que si l'on regarde de plus prĂšs cela n'a d'intĂ©rĂȘt que si tu veux du scripts portable sur des vieux unix du siĂšcle dernier encore en activitĂ©.
                Ce qui je le conçois maintenant n'a quasiment plus d’intĂ©rĂȘt

              • [^] # Re: AH ah ah ...

                PostĂ© par . ÉvaluĂ© Ă  5.

                Yen a pas. Ça permet juste de montrer que:
                1) gĂ©rer des fichiers/rĂ©pertoires, c’est toujours beaucoup plus compliquĂ© qu’ils n’y parait
                2) le Shell est (ironiquement) horrible pour faire ça. Entre autres, on ne sait pas si ne pas crĂ©er les rĂ©pertoires intermĂ©diaires est un bug ou une feature, parce que l’api de mkdir fouette.

                En l’occurence, son script vol en morceau si ya un espace (ou potentiellement autre charactere chelou) dans $REP. Bon courage pour comprendre ce qu’il se passe aussi si ya une typo dans le nom de la variable.
                La leçon de l’installeur de steam qui faisait un rm -rf /$variable a pas a Ă©tĂ© retenue visiblement - utiliser des variables Ă  la rache dans les manipulations de fichiers, c’est super dangereux.

                • [^] # Re: AH ah ah ...

                  PostĂ© par (site web personnel) . ÉvaluĂ© Ă  3.

                  Ceci dit :

                  Un script bash n'est a l'origine que la suite des commandes que l'on aurait tapé à la main
                  donc pas d'analyse juste une suite d'instructions Ă  reproduire sans utilisateur

                  Ce n'est pas la mĂȘme dĂ©marche pour un script python ou java ou grosso modo j'ai des donnĂ©es en entrĂ©es
                  sur lesquelles je vais appliquer un certain traitement puis générer éventuellement des données en sorties

                  • [^] # Re: AH ah ah ...

                    PostĂ© par . ÉvaluĂ© Ă  2.

                    Je dis peut-ĂȘtre une connerie, mais si tu tapes [ -d "$REP" ] || mkdir "$REP"

                    ... Les espaces sont gérés non ?

                    • [^] # Re: AH ah ah ...

                      PostĂ© par . ÉvaluĂ© Ă  2.

                      Tout à fait, j'hallucine encore de voir des scripts ou exemples sans "" autour des variables désignant des fichiers ou des répertoires; et par extension toutes variables, sauf lorsque l'on souhaite en séparer les champs.
                      Bien sur on peut aussi jouer sur l'IFS, mais ça devient plus technique ;)

                      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

                      • [^] # Re: AH ah ah ...

                        PostĂ© par . ÉvaluĂ© Ă  3.

                        Tout à fait, j'hallucine encore de voir des scripts ou exemples sans "" autour des variables désignant des fichiers ou des répertoires; et par extension toutes variables

                        Pas tout à fait d’accord. Je n’en mets pas quand $VAR contient un entier.

                        Je dirais que dans un script bien Ă©crit c’est la prĂ©sence de guillemets qui te permet de dĂ©terminer qu’il s’agit d’une variable de type chaĂźne, pas d’un entier ou un tableau.

                    • [^] # Re: AH ah ah ...

                      PostĂ© par . ÉvaluĂ© Ă  1.

                      Sans les guillements, il y a quand mĂȘme une certaine gestion des espaces:

                      $ REP="foo bar"
                      $ [ -d $REP ] && mkdir $REP ; echo $?
                      bash: [: foo: binary operator expected
                      2
                      

                      ok, je sors ...

                      • [^] # Re: AH ah ah ...

                        PostĂ© par . ÉvaluĂ© Ă  2. DerniĂšre modification le 28 septembre 2017 Ă  10:52.

                        Mais si tu utilise explicitement bash, alors il n'y a pas de problĂšme avec la version [[ ]], qui n'est pas une commande et sait distinguer les variables:

                        [[ -d $REP ]] || mkdir "$REP"

                        (mais pour mkdir, là il faut protéger bien entendu)

        • [^] # Re: AH ah ah ...

          PostĂ© par . ÉvaluĂ© Ă  3.

          Java est toujours "fortement typé" non

          Python est aussi fortement typé.

          AprÚs, je pense que l'auteur trollait avec sa phrase. On ne va pas commencer à remplacer tous les scripts bash par du Java. Par contre, les scripts lié au build ou pour avoir un langage de script dans une application, ça peut avoir du sens d'uitliser ça plutÎt que tu bash ou du Python.

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

          • [^] # Re: AH ah ah ...

            PostĂ© par (site web personnel) . ÉvaluĂ© Ă  1.

            Il peut l'ĂȘtre mais c'est pas obligatoire :)

            D'ailleurs le terme exact c'est typage dynamique ou statique => Typage Fort

            • [^] # Re: AH ah ah ...

              PostĂ© par . ÉvaluĂ© Ă  8.

              Typage fort/faible, ça n'a rien à voir avec dynamique/statique et d'ailleurs, c'est exactement ce qui est dit dans le lien que tu donne. Python et Java sont fortement typés mais Python est typé dynamiquement et Java statiquement.

              « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

              • [^] # Re: AH ah ah ...

                PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

                Alors c'est le coté dynamique qui me plaßt

                • [^] # Re: AH ah ah ...

                  PostĂ© par . ÉvaluĂ© Ă  3.

                  est-ce que c'est le cÎté dynamique ou le fait de ne pas avoir besoin d'expliciter les types ? (cf caml, scala, typescript...)

                  • [^] # Re: AH ah ah ...

                    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

                    Certainement ...

                    • [^] # Re: AH ah ah ...

                      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

                      Alors désolé de t'en rajouter une couche, mais aux deux dimensions "fort - faible" et "statique - dynamique" tu peux en ajouter une troisiÚme : la qualité de l'inférence.

                      Par exemple Scala est fortement et statiquement typé, mais infÚre beaucoup de choses, là ou Java infÚre que dalle.

                      • [^] # Re: AH ah ah ...

                        PostĂ© par . ÉvaluĂ© Ă  3.

                        Par exemple Scala est fortement et statiquement typé, mais infÚre beaucoup de choses, là ou Java infÚre que dalle.

                        Si, java faisait déjà un peu d'inférence en java 7, avec l'opérateur "diamant" qui permet d'écrire ça

                        List<String> lst=new ArrayList<>();

                        à la place de ça

                        List<String> lst=new ArrayList<String>();

                        Ensuite, les lambda de java 8 reposent beaucoup sur l'inférence pour déduire quelle interface l'expression lambda implémente et quels sont les types des paramÚtres éventuels de l'expression.
                        Ça permet par exemple, ayant une variable Map<String,Integer> map, de faire

                        map.forEach((k,v) -> System.out.println("double of "+k+": "+v*2));

                        oĂč java 8 dĂ©duit tout seul que k est de type String et v de type Integer, Ă  la place de

                        map.forEach(new BiConsumer<String, Integer>() {
                         public void accept(String k, Integer v) {
                         System.out.println("double of "+k+": "+v*2);
                         }
                        });

                        Et pour les lambda qui implémentent une méthode qui retourne une valeur (comme java.util.function.Function) il déduit tout seul le type de retour en fonction du résultat de l'expression, ou en fonction du return si on met un bloc de code dans la lambda.

                        Et pour aller plus loin, li y a le JEP 286, qui malheureusement n'a pas été inclus dans java 9 et dont on espÚre que ce sera pour java 10.

                        • [^] # Re: AH ah ah ...

                          PostĂ© par (site web personnel) . ÉvaluĂ© Ă  1.

                          Au temps pour moi, je me suis arrĂȘtĂ© Ă  Java 6 mais c'est vrai dans les versions suivantes ils ont bien bĂ»chĂ© Ă  copier Scala :-P

                        • [^] # Re: AH ah ah ...

                          PostĂ© par . ÉvaluĂ© Ă  1. DerniĂšre modification le 29 septembre 2017 Ă  15:23.

                          Hou la faut pas confondre.

                          En java une Collection<String> est la mĂȘme chose que Collection tout court; c'est du sucre syntaxique pour Ă©viter d'Ă©crire des connerie (le compilo les repĂšres), mais ne change en aucun cas le type sous-jacent; ce qui fait qu'on ne peut pas Ă©crire

                          void plop(Collection<String> bidule)
                          {
                           //...
                          }
                          void plop(Collection<Integer> bidule)
                          {
                           //...
                          }

                          les deux fonction plop ayant la mĂȘme signature; pour quelqu'un venant du c++ et ayant l'habitude d'utiliser 2/3 template, cette limitation est trĂšs chiante.

                          Le coup du diamond (<>) est juste une facilité d'écriture; qui évite d'écrire de la redondance.

                          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

                          • [^] # Re: AH ah ah ...

                            PostĂ© par . ÉvaluĂ© Ă  3.

                            Les génériques ne sont pas que du sucre syntaxique (contrairement au "foreach" introduit dans java 5 et au "try with resource" introduit dans java 7), il sont perdu à l'exécution, mais le compilateur les vérifie vraiment et n'acceptera pas que tu donne une variable déclarée comme Collection à une fonction qui attends une Collection.
                            Avec quoi crois-tu que je les confonde?

                            Quand à ton exemple, ça s'appelle de la surcharge, et c'est orthogonal avec l'inférence ce sur quoi je répondais).

                • [^] # Re: AH ah ah ...

                  PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

                  Donc un langage fortement et statiquement typé, mais avec de l'inférence de type correcte pourrait te plaire ?

                  J'utilise tous les jours Haskell pour "scripter": le code est concis grùce à l'inférence, mais j'ai beaucoup plus d'outils à ma.disposition pour m'exprimer et économiser du temps tout en rendant le code un peu plus robuste. (Les scripts qui plantent au bout de 45 minutes à cause d'une variable mal nommée cela m'énerve ;)

  • # .

    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  6.

    Les fichiers *.properties pourront enfin ĂȘtre Ă©crits en UTF-8. Ces fichiers, souvent utilisĂ©s pour l'internationalisation, Ă©taient limitĂ©s Ă  ISO-8859-1...

    En réalité avec des outils un tant soit peu modernes, on peut les écrire en UTF-8 depuis longtemps. Mais c'était une entorse à la norme JEE sans garantie de fonctionnement dans tous les conteneurs, certes.

    • [^] # Re: .

      PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

      avec des outils un tant soit peu modernes

      tu mets eclipse et notepad++ ainsi que vi dans le lot ? Il y a emacs aussi ? (eh oh c'est encore dredi !)

      • [^] # Re: .

        PostĂ© par (site web personnel) . ÉvaluĂ© Ă  2.

        Pendant des années j'ai écrit des .properties en UTF-8 avec Eclipse, donc oui je le mets dans le lot des outils qui le permettent. Je n'utilise pas vraiment N++ ni vi ni emacs mais je doute qu'ils refusent d'éditer des .properties en unicode.

        • [^] # Re: .

          PostĂ© par . ÉvaluĂ© Ă  2.

          Soit je n'ai pas compris la blague de BAud, soit il n'utilise que les éditeurs pour hipsters à la Atom IDE (fraßchement sorti ce mois-ci (pas Atom mais Atom augmenté de modules "Language Server Protocol" pour en faire un IDE)).
          Je code sous ViM en UTF-8 depuis des annĂ©es, je n'imagine pas qu'Emacs OS n'en soit pas capable. MĂȘme notepad.exe le fait.

  • # Compact Strings

    PostĂ© par (site web personnel) . ÉvaluĂ© Ă  7.

    Les chaßnes de caractÚres prendront moins de place en mémoire si elles contiennent des caractÚres latin1.

    Ah enfin ! Ça va pouvoir faire chuter le prix de la RAM !
    -->[]

  • # Écrivons en français

    PostĂ© par . ÉvaluĂ© Ă  -4.

    'Java 9 est dehors' est la traduction littérale de l'anglais 'java 9 is out'.
    Équivalent en français: 'java 9 est sorti'.

Suivre le flux des commentaires

Note : les commentaires appartiennent Ă  celles et ceux qui les ont postĂ©s. Nous n’en sommes pas responsables.