Tutoriel JShell: Utilisation

Ce tutoriel JShell est une démonstration par la pratique de l’utilisation (et l’utilité) de cet outil. Comme c’est souvent le cas dans ce site personnel, c’est une succession d’exercices pratiques à effectuer et se rendre compte du résultat par soit même. Il s’agit ici de l’utilisation courante de l’outil dans ses deux volets: les commandes JShell et l’exéction d’instructions Java.

Cet tutoriel fait partie d’une serie de quatres articles qui permettront de se familiariser, suffisament, avec JShell afin de pouvoir l’utiliser efficacement et augmenter la productivité avec Java:

  1. Tutoriel JShell: Installation et concepts
  2. Cet article: Tutoriel JShell: Utilisation
  3. Tutoriel JShell: Scripts et scripts de démarrage
  4. Tutoriel JShell: Personnalisation et Import de librairies externes

1. Les variables dans JShell

Quand on exécute une instruction Java qui retourne une valeur, JShell crée automatiquement une variable pour y stocker cette valeur. Exécuter dans l’environnement JShell:

10 + 15

L’affichage de retour indique qu’une variable qui s’appelle $1 contient le résultat de cette opération simple:

$1 ==> 25

On peut obtenir plus d’information à ce sujet grâce à la commande JShell:

/vars

Cette commande affiche la liste des variables en indiquant leurs types. On peut également améliorer le retour d’information immédiat. Exécuter:

/set feedback verbose

Si on exécute, après cela, l’opération d’addition modifiée:

10.2 + 15.3

Maintenant le retour immédiat est plus explicite. JShell nous informe tout de suite qu’il a créé une variable $2 de type double et affiche son contenu.

Remarquer que les variables créées implicitement portent un nom qui commence par le caractère $ suivi par un indice qui s’incrémente à chaque nouvelle création.

On remarque également que le type de la variable créée s’adapte au type du résultat de l’instruction exécutée.

Les variables peuvent être également indiquées explicitement avec un nom plus significatif. Dans ce cas le type doit être également indiqué:

double rayon = $2

Vérifier avec la commande /vars que le contenu de la variable rayon est bien égale à celui de la variable $2. Le résultat d’une instruction peut également être affecté
à une variable explicite:

double surface = Math.pow(rayon,2) * Math.PI

Ce qui calcule la surface d’un cercle en élevant son rayon au carré et en multipliant le résultat par π .

2. Vérifier le comportement de Java avec JShell

Une des applications importantes de JShell est de pouvoir vérifier rapidement les résultats retournés par des instructions Java. Exécuter les trois instructions suivantes l’une après l’autre:

Math.round(23.4999999)
Math.round(23.5000001)
Math.round(23.5000000)

Ce test montre que la methode Math.round(double) retourne bien la valeur arrondie à l’entier le plus proche du décimal passé en paramètre (les deux premières exécutions).

Il montre surtout que si la valeur est à mi-chemin entre deux valeurs entières, c’est l’entier supérieur qui est retourné.

Maintenant, on se propose de tester un comportement, souvent mal compris, des instances de classes. Mais d’abord partons d’un environnement propre. Exécuter:

/vars
/list

La session JShell accumule, au fur et à mesure qu’on l’utilise, une liste de variables et d’instructions (snippets) qui ont été créées et exécutées.

On peut remettre l’environnement à zéro, notamment pour commencer de nouveaux tests. Pour cela exécuter:

/reset

Après une éventuelle vérification, exécuter les instructions dans l’ordre:

Date d1 = new Date()
Date d2 = d1
Date d3 = (Date)d1.clone()
/vars

La dernière commande permet d’afficher les 3 variables d1, d2 et d3 avec leur valeur qui est la même. Maintenant, modifions la valeur de d1 pour mettre l’heure à minuit:

d1.setHours(0)
/vars

L’explication du résultat, qui est tout à fait normal, est que la variable qui contient une instance de classe n’est en réalité qu’une référence d’un emplacement mémoire qui contient, lui, les données de cette instance. Il faut comprendre le contenu de ces variables comme une adresse de mémoire et non l’instance elle-même. Ceci dit, les trois instructions font ce qui suit:

  1. Créé une instance de la classe Date et affecte la référence à cette instance (adresse mémoire de l’instance) à la variable d1.
  2. Affecte la valeur de d1 à d2. C’est la référence à l’instance qui est affectée. Donc d1 et d2 pointent sur la même instance.
  3. La méthode clone() créé une nouvelle instance dont les données sont identiques à l’instance clonée. d3 contient donc la référence d’une autre instance de la classe Date.

3. Tester le code d’une méthode

A titre d’exemple, on se propose de développer une méthode qui calcule la clé d’un numéro de sécurité sociale en France. Bien qu’assez triviale, cette méthode nécessite plusieurs instructions qui s’enchaînent. Pour saisir l’ensemble du code, suivre le contenu qui correspond à une ligne de code par l’appui sur la touche [ENTREE], comme dans tout IDE. Commençon par la première ligne:

long cle(String numero) {

Après la touche [ENTREE], JShell répond par:

...>

Et attend la suite des lignes. Continuer la saisie, ligne par ligne:

...> String n = numero.replaceAll("2A", "18");
...> n = n.replaceAll("2B", "19");
...> long ln = Long.parseLong(n);
...> long resultat = 97 - (ln % 97);
...> return resultat;
...> }

A la saisie de la dernière ligne qui constitue, syntaxiquement, la fin de la méthode, JShell termine la saisie et affiche un message qui nous informe (sous reserve qu’il n’y a pas d’erreur de saisie) que la méthode a été créée. On peut le vérifier par la commande:

/methods

On peut également l’exécuter:

cle("2690299341732")

Bien entendu vous pouvez utiliser votre propre numéro de sécurité sociale (les 13 chiffres) pour calculer et vérifier la clé.

Ceux qui sont nées en Corse remarqueront qu’il y a un bug dans ce code qu’il faudra, donc, corriger. Pour le faire on doit éditer la méthode. C’est la commande edit qui permet cela. D’abord parametrons un éditeur de texte disponible sur le système utilisé. Pour ma part j’utilise vi:

/set edit vi

Puis

/edit cle

L’éditeur paramétré s’ouvre avec le texte du code de la méthode et on peut alors le modifier. Remplacer le nombre 18 dans la 2eme ligne par 19 et le nombre 19 dans la 3eme ligne par 18. Ensuite enregistrer la modification et quitter.

Share

Tutoriel JShell: Installation et concepts

JShell est l’utilitaire Shell (ou REPL, pour Read Eval Print Loop) du langage de programmation Java. Un tel outil manquait cruellement à Java jusqu’à sa récente version 9 où il a été introduit. JShell permet d’augmenter considérablement la productivité du développement avec ce langage. Il permet, notament, d’ffectuer de manière très simple, rapide et intéractive des tests d’exécution d’instructions Java (snippets).

Cet article a pour objectif de présenter la manière d’installer ainsi que les concepts d’utilisation de cet outil. Il fait partie d’une serie de quatre articles qui permettront de se familiariser, suffisament, avec JShell afin de pouvoir l’utiliser efficacement et augmenter la productivité avec Java:

  1. Cet article: Tutoriel JShell: Installation et concepts
  2. Tutoriel JShell: Utilisation
  3. Tutoriel JShell: Scripts et scripts de démarrage
  4. Tutoriel JShell: Personnalisation et Import de librairies externes

1. Installer JShell

JShell fait partie du JDK. Il a été introduit à la version 9 de Java et de ce fait il faudra installer au minimum la version 9 du JDK pour pouvoir y avoir accéder. Sur Ubuntu installer la variante headless d’OpnenJDK 9 ou plus.

sudo apt install openjdk-11-jdk-headless

Après cela JShell sera disponible. La vérification peut se faire par la commande:

jshell -version

Cette commande répond par l’affichage de la version de JShell. La version majeure retournée (premier nombre) doit être la même que celle du JDK installé.

2. Les bases de fonctionnement de JShell

JShell est utilisé, principalement, de manière interactive. Son interface est une console interactive en ligne de commande. Pour y accéder utiliser la commande:

jshell

Suite à cela on obtient le prompt suivant qui attend la saisie de commandes à la syntaxe JShell ou Java.

|  Welcome to JShell -- Version 10.0.1
|  For an introduction type: /help intro

jshell> _

A chaque commande introduite (saisie de la commande + [Entrée] du clavier), JShell répond immédiatement par l’affichage du résultat de la commande ou par un message d’erreur si la syntaxe est fausse ou qu’une erreur d’exécution s’est produite.

  • Les commandes propres à JShell commencent toujours par le caractère slash: /
  • Toute commande introduite qui ne commence pas par ce caractère doit être conforme à la syntaxe Java.

3. Les commandes JShell

Ces commandes qui commencent obligatoirement par le caractère slash servent à contrôler le fonctionnement de l’outil. Une commande particulière permet d’avoir une aide à propos de ces commandes:

/help

Affiche une liste exhaustive des commandes disponibles (relative à la version utilisée, bien entendu). On peut également afficher l’aide d’une commande en particulier quand on connait sa syntaxe:

/help exit

Affiche une aide sur la commande JShell exit. Grâce à cette commande, on sait maintenant qu’il faudra utiliser la commande /exit pour quitter la console JShell.

De la même manière, déterminer la fonction de la commande history. Ensuite utiliser cette commande pour voir le résultat:

/history

Cette commande permet d’afficher l’hitorique de toutes les commandes exécutées depuis le début de la session JShell courante. Si tout va bien le résultat devrait être donc:

/help
/help exit
/history

4. Exécuter une instruction Java

Dans la console JShell exécuter la commande:

exit

La réponse est un message d’erreur. Pourtant, on l’a vu, exit est bel et bien une commande correcte de JShell. L’explication est dans l’absence du caractère slash au début. Cette absense fait en sorte que JShell considère qu’il s’agit d’une instruction Java. exit n’est pas une instruction Java valide, d’où l’erreur.

Exécuter maintenant l’instruction (faire attention à la syntaxe, le mieux est de faire un copier/coller):

"Java JShell".substring(5,11)

La réponse doit être:

$1 ==> "JShell"

Cette réponse signifie que maintenant une variable appelée $1 contient la valeur chaine de caractère ‘JShell‘.

Explication: A l’exécution de l’instruction Java qui retourne un résultat, JShell crée une variable qui s’appelle $x, x étant un nombre entier, et lui affecte le résultat de l’instruction. Ensuite il affiche le contenu de cette variable. Pour s’en rendre compte, exécuter maintenant:

System.out.println($1)

La méthode substring(iDebut, iFin) de la classe String, retourne une sous chaine de caractère qui commence à l’indice de cracatère iDebut et fini à l’indice iFin. D’où le résultat obtenu.

Exécuter maintenant l’instruction modifiée:

"Java JShell".substring(5,12)

L’indice de caractère (de fin) maximum dans cette chaine étant 11 (car elle contient 11 caractères), cette instruction lève l’exception java.lang.StringIndexOutOfBoundsException exactement comme à son exécution dans un programme Java.

Share

Mise à jour du système Ubuntu de la version 16.04 à 18.04 LTS

Le système GNU/Linux Ubuntu est le système conseillé, par ce site personnel, pour une machine de bureau destinée au développement logiciel. Récemment, en fin Juillet 2018 plus exactement, la mise à jour vers la dernière version stable 18.04 (la précédente étant la 16.04) a été considérée par la communauté de cet OS comme fiable. Personnellement je constate que cette nouvelle version est suffisamment stable et fiable et je peux confirmer cette information.

Cet article présente la manière de procéder pour effectuer cette mise à jour. Les pré-requis pour cette procédure sont:

  • Le système est déjà à la version 16.04 LTS.
  • La machine dispose d’une connexion à Internet.

1. Désinstaller les logiciels expérimentaux

La durée moyenne de cette procédure de mise à jour est assez longue. Avec un accès standard de type ADSL à Internet, elle ne durera pas moins d’une heure. Cette durée dépend de la quantité de logiciels installés sur le système. Il en résulte que si vous avez installé des logiciels à titre expérimental, comme un navigateur web supplémentaire par exemple, il serait avantageux de les désinstaller.

2. S’assurer de la mise à jour de la version actuelle 16.04

Pour cela, lancer successivement et dans l’ordre les commandes:

sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo apt dist-upgrade

En moyenne,  cette procédure dure quelques minutes.  On obtient un état complètement à jour de la version 16.04 du système, à la fin de cette partie.

3. Installer le gestionnaire système de mise à niveau de versions

Sur un système Ubuntu on dispose d’un gestionnaire de mise à niveau de version qui facilite cette procédure. Si ce n’est déjà fait, il convient d’installer cet utilitaire. la commande suivante permet de s’en assurer:

sudo apt install update-manager-core

Cette commande nous en informera dans le cas où l’utilitaire est déjà installé.

4. Installer la nouvelle version 18.04 LTS

A ce stade, il suffit de demande à l’utilitaire de gestion de mise à niveau de procéder à cette opération:

sudo do-release-upgrade -d

C’est la partie la plus longue de la procédure. D’abord les paquets de la nouvelle version sont téléchargés, ensuite installés. Durant cette partie de la procédure, notamment vers la fin, l’utilitaire pourra marquer des arrêts pour poser des questions auxquelles il faudra répondre. Les réponses à ces questions seront généralement de type Oui/Non mais la procédure sera bloquée pendant ce temps.

5. Redémarrer la machine

A la fin de l’installation il convient de redémarrer la machine pour accéder à la nouvelle version du système et en profiter.

6. Java sur Ubuntu 18.04

La nouvelle version d’Ubuntu installe et configure par défaut la version 11 de Java (le JRE, et oui il semblerait que l’équipe Ubuntu est hyper futuriste). Ceci pourrait entraîner des dysfonctionnements d’applications Java, même récentes. Eclipse ou JXplorer, à titre d’exemple peuvent rencontrer ce type de problème. Dans ce cas il faudra ajuster la version par défaut de Java à une version plus ancienne ou paramétrer l’application concernée pour utiliser une version plus ancienne. L’article de ce blog à ce sujet permet d’avoir plus de détails au sujet de cette configuration de Java.

En réalité la version installée par défaut du JRE est la dernière version 10, même si le nom du paquet installé et sa configuration indiquent que c’est la version 11. Celle-ci ne sera effectivement disponible qu’en Septembre 2018 !

Share

pgAdmin 4: Utilisation courante par la pratique

Postgres pgAdmin 4 permet de créer toute sorte d’objets du serveur de bases de données PostgreSQL. Ces objets peuvent être des bases de données (BDD), des schémas, des tables, des utilisateurs.. Cet outil permet également d’exécuter des requêtes SQL.

L’accomplissement de ces tâche est conditionné par les droits de l’utilisateur qui sert à la connexion au serveur paramétré. Pour pouvoir agir sans limitation, il faut se connecter avec un utilisateur qui a les droits du super-administrateur.

Cet article fait partie d’une série qui concerne le serveur de bases de données PostgreSQL et son utilisation dans un environnement de développement:

  1. Installation de base de PostgreSQL
  2. Utiliser Postgres pgAdmin 3 pour administrer PostgreSQL
  3. Installer PostgreSQL 10
  4. Reconfigurer l’installation par défaut de PostgreSQL 10
  5. Utiliser PostgreSQL 10 dans un environnement de développement
  6. Postgres psql pour administrer le serveur PostgreSQL
  7. Postgres pgAdmin 4 : installation et configuration
  8. Cet article: Postgres pgAdmin 4: Utilisation courante

Affecter un mot de passe au super-administrateur

pgAdmin ne pemet de paramétrer une connexion au serveur en local par le socket Unix. Pour cela on doit d’abord affecter un mot de passe au super-administrateur qui est l’utilisateur/développeur authentifié sur la machine de bureau. On utilise psql:

psql -d postgres

Une fois connecté, exécuter:

alter user jdupond with encrypted password 'mpjdupond';

Ajouter un serveur avec une connexion super-administrateur

Afficher le menu contextuel de l’objet Serveurs de développement puis sélectionner: Create / Server... Ceci affiche la fenêtre de paramétrage d’un nouveau serveur.

postgres pgadmin

Saisir le nom du serveur dans le champ Name: « Serveur local superadmin« . Ensuite passer à l’onglet (à sélectionner en haut de la fenêtre) Connection. Dans cet onglet renseigner les valeurs des champs comme indiqué dans la copie d’écran.

A la fin de la saisie, enregistrer avec le bouton Save.

Créer une base de données

Afficher le menu contextuel du serveur Serveur local superadmin puis sélectionner Create / Database..

Dans le 1er onglet qui s’affiche par défaut:postgres pgadminSaisir le nom de la base de données: bdtest
Choisir le propriétaire de la BDD dans la Combobox Owner: jdupond
Saisir un commentaire: Base de données pour tester pgAdmin

Activer, ensuite, le deuxième onglet Definition.postgres pgadmin– Sélectionner dans la Combobox Encoding: UTF8
– Sélectionner dans la Combobox Character type: fr_FR.UTF-8

Sélectionner, ensuite, le dernier onglet SQL

postgres pgadmin

Après la saisie des paramètres de création de la base de données, on a la possibilité d’examiner le code SQL qui servira à sa création effective.

Créer un schéma

Pour créer un schéma dans la nouvelle base de données créée, on utilise le menu contextuel de cette BDD: Create / Schema…postgres pgadmin
Ce menu permet d’accéder à la fenêtre de création de schéma:
postgres pgadmin
La saisie des paramètres et l’enregistrement par le bouton Save, permet d’achever la création du schéma commerce.

Créer une table

Pour créer une table dans le nouveau schéma créé, on utilise son menu contextuel: Create / Table…

Ce menu permet d’accéder à la fenêtre de création de table:

Renseigner les données de l’onglet General comme indiqué, puis sélectionner l’onglet Columns qui permet de définir les champs de la table.

S’agissant d’une création de table, le tableau de cet onglet est initialement vide. Utiliser le bouton mentionné « Ajouter un champ » pour ajouter les trois champs de la table. Après chaque ajout, paramétrer le champ comme indiqué puis enregistrer avec le bouton Save pour créer la table.

Ajouter ou modifier les données contenues dans une table

Pour modifier les données contenue dans la table produits, on utilise son menu contextuel: View/Edit Data / All Rows. Les 3 autres menus servent quand il y a déjà une grande quantité de données.  

Ce menu permet d’accéder à la zone d’édition des données de la table qui apparaît dans le volet droit de l’interface.

 

Share