Code d’initialisation en Java

Coding
Coding (Photo credit: Omer van Kloeten)

La lecture du tutoriel Java mérite que l’on s’y attarde, que ce soit pour le débutant ou bien pour celui qui vise l’excellence. Certains aspects du langage fort intéressants y sont bien expliqués, comme le code d’initialisation. On le trouve il est vrai rarement dans le code d’application métier mais plutôt dans le code de framework ou d’application standalone qui doivent initialiser de la “plomberie” comme une connexion de base de donnée ou l’activation d’un service de nommage. Mais il parait qu’il n’y a rien de tel que la lecture du code d’un bon framework pour apprendre à faire du bon code alors attardons nous sur les mécanisme offert pas le langage en matière d’initialisation.

Dans le tutoriel on distingue 3 types de code d’initialisation:

  • le code d’initialisation static
  • le code d’initialisation d’instance
  • le code d’initialisation de variable

L’initialisation statique pourra être utilisée pour s’occuper de choses globales à l’application et l’initialisation d’instance pour des aspect liée à l’instance comme par exemple pour faire un suivi des instances en utilisant une référence faible (weak reference). Le tutoriel présente une exemple de code d’initialisation de variable par une méthode final arguant que le contraire peu poser des problèmes. Peut-être… Un petit bout de code permet de voir comment tout cela s’articule.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package initinstancemenber;

/**
 *
 * @author thierry
 */
public class InitInstanceMenber {

    private int i = initMyIMember();

    {
        System.out.println("instance init code");
    }

    static {
        System.out.println("class init code");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        InitInstanceMenber a = new InitInstanceMenber();
        System.out.println("i=" + a.i);
        a= new InitInstanceMenber(){
            @Override
            protected int initMyIMember(){
                System.out.println("overriden init member");
                return 1;
            }
        };
        System.out.println("i=" + a.i);
    }

    protected int initMyIMember(){
        System.out.println("init member");
        return 0;
    }
}

Dont voici l’exécution:

run:
class init code
init member
instance init code
i=0
overriden init member
instance init code
i=1
BUILD SUCCESSFUL (total time: 0 seconds)

Les étiquettes en Java

English: A snippet of code in the Java program...
English: A snippet of code in the Java programming language written to illustrate syntax highlighting of keywords. (Photo credit: Wikipedia)

Les premières tasses de thé glacé passées, le tutoriel Java arrive sur les instructions de contrôle (branchement et boucle).  A l’époque où je développais couramment en Java, je n’utilisait que très peu les instruction break ou continue dans les boucles. L’utilisation d’étiquette était pour ainsi dire absente du code que je produisais. Pourquoi ? Tout d’abord parce qu’on a appris que les étiquettes (label) étaient utilisés dans d’autre langage pour faire des sauts (goto) et que cela était contraire à la programmation structurée, que l’on devait avoir un point d’entrée et un point de sortie unique, que cela simplifiait ainsi le code etc, etc. Et puis sans doute parce que la complexités des algorithmes de l’informatique de gestion ne nécessitait pas l’optimisation du flot de contrôle pour éviter des tours de boucle superflus.

Mais bien sûr si la performance est un critère comme par exemple en informatique financière, alors il vaut mieux sortir d’une boucle dès qu’on a fini le travail. Est-ce pour autant sacrifier le beauté du code et sa maintenabilité ? Non, car les étiquettes en Java ne servent qu’à nommer les blocs de boucles et on ne peut pas les mettre ailleurs pour faire des sauts dans tous les sens. Le code reste donc structuré. L’extrait de code suivant montre un exemple d’utilisation d’étiquette:

        premierNiveau:
        for (int i=0;i<100;i++){
            deuxiemeNiveau:
            for (int j=0;j<i*100;j++){
                boolean mustBreak = false;
                boolean mustContinueOutsideLoop = false;
                // code that decide if we must break or continue
                if (mustBreak){
                    break deuxiemeNiveau;
                }
                if (mustContinueOutsideLoop){
                    continue premierNiveau;
                }
                // very long running code here
            }
        }

Liste de paramètres variable des méthodes en Java

Depuis le JDK 1.5 qui fut une petite révolution il y a presque 10 ans de cela, il est possible de déclarer des méthodes ayant une liste de paramètre de taille variable afin de pouvoir appeler la méthode avec 1, 2 ou n’importe quel nombre de paramètre. Cela rappelait la fonction printf du langage C.

C’est en effet bien pratique d’appeler une méthode en lui passant le nombre d’argument que l’on veut. Une exemple canonique serait une méthode qui renvoie la concaténation des chaînes en paramètre.

String concat(String... arg){
    String concatenation = "";
    // corps de la méthode
    return concatenation;
}

Que l’on pourra appeler en faisant

String s = null;
s = concat("ma"," ","chaine"," ", "de", " ", "caractères"); // "ma chaine de caractère"

Il s’agit néanmoins d’un sorte de goodie du compilateur pour nous éviter de passer un tableau car c’est comme ça que l’on faisait avant. On déclarait la méthode comme suit:

String concat(String[] arg){
    // corps de la méthode
}

Puis lors de l’appel on s’efforçait de passe un tableau avec le surcoût de création de celui-ci:

String s = contact(new String[]{"ma"," ","chaine"," ","de"," ","caractères"});

Bien vu. On notera la limitation suivante, le paramètre variable doit être le dernier paramètre de la signature. Donc il ne peut y en avoir qu’un seul. On ne peut pas par exemple utiliser les points de suspension pour définir une méthode avec en premier lieu une liste d’un type et en second lieu une liste d’un autre type.

void neCompilePas(Object... lo, String... listStr) // le compilateur n'en veut pas
void compileBien(Object o, String... listStr) // on a le droit

Séparateur underscore dans littéral numérique en Java 7

Dès le début de la  lecture du tutoriel de Java 7 on remarque une nouvelle notation: l’underscore (blanc souligné) que l’on peut utiliser comme séparateur de groupe (millier, millions etc) afin d’augmenter la lisibilité des nombres écrits en valeur littérale. Cela donne :

int i = 0b1111_111001;

Qui est plus lisible que:

int i = 0b1111111001;

Salon les jeudis.com

Les jeudis.com organisent un salon 3 fois par an au CNIT de la Défense, regroupant une cinquantaine d’entreprise qui recrutent. C’est l’occasion pour les candidats de pouvoir se faire connaître directement auprès des recruteurs.  Aujourd’hui le salon se tenait dans ce contexte de morosité économique, alors c’est pour qui ce salon de recrutement ? Est-ce efficace ?

Tout d’abord peu entrain à me rendre dans un salon de recrutement car l’idée me rappelait une époque de crise en informatique, vers 2003 il me semble, où me rendant à un entretient du côté de Boulogne, je patientais dans la salle d’attente. Là, j’avais à côté de moi mes “compétiteurs” (une dizaine) pour reprendre le terme utilisé par un cabinet de recrutement: ils étaient tous costumés, encravatés et tiraient une mine d’enterrement. Alors l’idée de multiplier cela par 50 ne m’enchantait guère…

Une fois sur place, je retire mon guide du salon en échange d’un CV puis rentre sur la salon en feuilletant le dit guide. Ce dernier permet de connaître les entreprises présentes ainsi que leur besoin en recrutement: une telle cherche tel type de profil, une autre tel autre. Mais à peine que je dépassais l’accueil, je me fait alpaguer par une hôtesse qui me propose de lui remettre mon CV afin de le transmettre à l’ensemble des exposants. Bingo cela m’arrange d’autant plus que je n’ai pas pris un stock de CV avec moi.

Cependant puisque j’étais arrivé jusque là, je fis un tour des stands. Ce qui me frappe d’abord c’est la foule, il était 15h et les allées étaient bien encombrées. La crise peu-t-être ? Qui sont donc ces candidats ? De nombreux jeunes diplômés, certains pas encore diplômés à la recherche de stages. Devant certains stands de grosses SSII, d’impressionnantes queues s’étaient formées. Les candidats avaient l’air peu joyeux presque aussi morbides que les encravatés de 2003. Fuyant cette cohue, je me dirige alors vers un stand ayant moins d’affluence, petite SSII, et y laisse un CV. Plus loin je m’arrête au stand d’une société utilisatrice spécialiste du transport de personne. Je tente une approche détendue et suis frappé par l’incapacité de mon interlocuteur de cerner mon profil. Il a été obligé d’aller demander à son collègue pour finalement me dire que mon profil ne correspondait pas à ce qu’ils recherchent. Pourtant en regardant le guide du salon, si si et en allant sur le site web de l’entreprise on peut même y voir un poste en MOE avec mon profil. Je continue de déambuler dans les allées et croisent quelques candidats quadragénaires, ici un spécialiste du testing…  Finalement me restant une cartouche dans mon barillet à CV, je retourne au stand d’une banque. Là mon interlocuteur réagit correctement à mon approche détendue et me répond avec la même décontraction. Il semble intéressé  et en fin de compte je lui laisse mon dernier CV.

Plus de CV, la cohue, la chaleur, je quitte le salon avec une certaine satisfaction, celle de ne pas y avoir perdu mon temps. C’était une première pour moi et la prochaine fois s’il y a lieu, c’est promis, je viendrai avec quelques exemplaires de CV en plus.

Réapprendre Java

Duke, the Java Mascot, in the waving pose. Duk...
Duke, the Java Mascot, in the waving pose. Duke images are now Free Graphics see duke:Project Home Page for more details. (Photo credit: Wikipedia)

En informatique tout va vite, très vite même. C’est sans doute le métier ayant l’obsolescence des connaissances la plus grande. Du moins dans sa partie pratique. Dans mon cas, Java a été mon fond de commerce mais il est grand temps de réactualiser mes connaissances à ce sujet. Non pas par amour du code quoique… mais plutôt par approche pragmatique. Je l’ai d’ailleurs écrit sur ce blog avec un poil de provocation: “la technique d’abord”. Cela simplement pour dire que l’on ne peut réaliser que ce que la technique permet donc il faut maîtriser la technique si on veut réaliser de grande chose.

Pour se mettre jour commençons par le commencement. Un petit tout sur le site de Sun…. oooops, pardon, Oracle pour aller télécharger un Netbeans et un JDK…. 7. La 8 est dans les tuyaux mais bien connaître la version 7 (en faite 1.7) sera déjà un ravalement de façade parfait afin de faire du code au goût du jour et utilisant pleinement les possibilités offertes par la technique. Si l’on veut rester libre les versions OpenJDK peuvent être utilisées en lieu et place des JVM Oracle. D’ailleurs Oracle certifie les implémentation OpenJDK comme étant les références. Par défaut c’est le JDK 1.6 qui est installé sur Debian, mais un petit tour sur le gestionnaire de paquet permet de disposer d’un JDK 1.7. Pour Netbeans cependant la version qui est dans le dépôt Debian est la 7.0, donc un passage obligatoire par une installation manuelle si on veut la dernière Netbeans 7.3. Au choix aller chez netbean.org ou bien chez oracle pour télécharger l’ensemble JDK et Netbeans.

Une fois équipé des bons outils, nous nous lançons dans le réapprentissage. Pour cela les tutoriaux de Sun devenu Oracle me rappellent de lointains souvenirs quand sur les stations UltraSparc de la fac j’apprenais la javanaise en 1998. Heureusement que ma mémoire est encore bonne et me permet de sauter rapidement ce qui n’a pas changé. Pour les changements des billets d’humeurs viendrons s’ajouter à ce blog après une tasse de thé glacé.

Bye bye Ubuntu Bonjour Debian

English: Debian GNU/Linux 6.0 ("Squeeze&q...
English: Debian GNU/Linux 6.0 (“Squeeze”) with GNOME. Polski: Debian GNU/Linux 6.0 (“Squeeze”) z GNOME. (Photo credit: Wikipedia)

 

Utilisant Ubuntu depuis 2006, j’ai pu constater les changements de la distribution au fil du temps. Si au début le bureau était celui de GNOME certes simple, mais très rapide pour la bête de course que j’avais, il s’est transformé au fur-et-à-mesure des mises à jours (tous les 6 mois) en devenant plus beau, plus sexy et plus gourmand en ressource.

 

Aussi lorsque mon PC portable est revenu à la vie, je me suis empressé de mettre à jour Ubuntu 9.10 vers son remplaçant au goût du jour. Les difficultés d’installations ont alors commencé. Ne disposant pas de lecteur optique fonctionnel, je me tourne donc vers une installation par clé USB. Un bug empêche alors l’installation du gestionnaire de démarrage GRUB sur le disque dur. Pour le contourner l’utilisation de l’ISO d’installation “alternate” me permit d’effectuer une installation en mode texte (semi-graphique). Enfin une Ubuntu récente ! J’ai préféré la 12.04 qui est une LTS dont le support va jusqu’en 2017. Au fil du temps Canonical (la société qui est derrière Ubuntu) a réduit la durée de support de ces produits non LTS. Cela ce comprend car avec le rythme de sortie des versions, une tous les 6 mois, cela fait beaucoup de version à maintenir. Ne souhaitant pas faire de mise à jour de version tout les 6 mois, l’utilisation d’une LTS est pour moi obligatoire, d’autant plus que les non LTS ont une durée de support de 9 mois seulement. Autant dire qu’une on LTS n’est pas destinée au grand public.

 

Une fois Ubuntu installé sur vieux portable, je commence à jouer avec en installant un bon vieux Netbeans. Je remarque alors des artefacts d’affichage qui n’est corrigé par aucune des différentes version disponibles du pilote graphique. Par ailleurs le bureau très beau devenait inutilisable à cause de ces bugs graphiques. C’est alors que je me suis dit pourquoi pas revenir à un OS reconnu pour sa stabilité et ayant un long historique ou pourquoi pas une distribution vraiment libre estampillée par la FSF ?

 

Finalement j’opte pour une Debian. Le bug de l’installateur de Ubuntu est en fait aussi présent dans celui de Debian dont est issu Ubuntu. L’usage de premier disque de la distribution DVD permit de mener à bien l’installation. Et voilà, mon vieux portable est mu par un OS stable et au goût du jour. Le bureau de Debian est assez jolie, plus sobre que celui d’Ubuntu et finalement cela me convient bien !

La main dans le cambouis

English: Samsung Logo Suomi: Samsungin logo
English: Samsung Logo Suomi: Samsungin logo (Photo credit: Wikipedia)

De retour du réparateur, mon ordinateur portable était devenu muet. Pourtant l’OS indiquait bien la présence d’un périphérique audio et malgré tous les réglages que j’ai pu essayer, l’ordinateur restait muet comme une carpe. Je fini par me résoudre à la conclusion que le problème venait d’un élément non logiciel comme par exemple un haut-parleur non branché. Grâce à de la documentation trouvée sur le net (désassemblage d’un Samsung Q45) j’ai mis la main dans le cambouis pour désosser mon portable.

Je fis alors une découverte surprenante. Mon réparateur avait oublier de rebrancher les connecteur des hauts-parleurs ! Une fois cet oubli réparé, mon portable retrouva toutes ces cordes vocales et fit tonner le son grésillard de ces petits hauts-parleurs internes. Par la suite en voulant jouer avec la webcam intégrée je remarquai que le micro n’enregistrait aucun son. Mon portable était également devenu sourd ! Après quelques réglages infructueux, je repris les tournevis et remis le patient sur le billard… Le connecteur du micro était également débranché, Grrrrrr….. encore un oubli de mon réparateur !

Enfin maintenant mon portable est comme neuf: écran réparé, haut-parleur et micro rebranché, disque dur fonctionnel. A moi les joiesde l’informatique nomade !

Réparation écran noir Samsung Q45

English: Typical computer shop in Montgallet s...
English: Typical computer shop in Montgallet street in Paris. Français : Boutique d’informatique typique de la rue Montgallet à Paris. (Photo credit: Wikipedia)

Mon ordinateur portable était en panne depuis 3 ans et comme je ne m’en servais pas je n’avais pas cherché à le réparer depuis. Étant de passage à Montgallet (Paris 12e) dans ce lieu mythique des passionnés de matériel informatique afin de changer l’alimentation de mon PC fixe qui a rendu l’âme au bout de presque 7 années de service, j’ai remarqué un grand nombre de magasin de réparation d’ordinateur portable. Je me suis dis que ce serait peut-être l’occasion de ressusciter mon ultra portable.

Le symptôme de mon Samsung Q45 était un écran noir qui bloquait le démarrage du système sur 1 beep long suivi de 2 beep court. L’expression “google est ton ami” fut encore une fois vérifiée. Le verdict: problème de carte graphique. Je me suis alors souvenu pourquoi je l’avais mis de côté. Sur les ordinateur portable il n’y a pas de carte graphique à proprement parler. Le contrôleur graphique (puce) est soudé à la carte mère. C’est donc un composant non remplaçable par l’utilisateur. Est-ce que les magasins de Montgallet allaient pourvoir m’aider ?

L’un d’entre eux (Solution mobile) décrivait exactement mon problème et présentait en toute transparence la solution. La réparation étant laborieuse, entre 200 à 300 soudures à refaire, le résultat n’est pas garanti. J’y suis allé et moyennant une centaine d’euro, mon ordinateur sorti des ténèbres. Mon vieux portable (vieux car il date de 2007) a donc repris du service. Restait encore à régler le problème du disque dur non reconnu par le BIOS et les hauts-parleurs qui n’émettent aucun son que j’ai découvert après avoir booter sur un disque USB.

Le disque dur non reconnu ne mettait en cause le disque lui-même car le réparateur avait essayé un disque neuf qui n’était pas non plus reconnu. Ce dernier m’a suggérer d’installer un pilote… hum hum, il ne savait pas qu’il parlait à un informaticien. Pas de reconnaissance du disque par le BIOS je n’ai aucune chance d’installer quoi que ce soit dessus. Le problème semblait être matériel et non logiciel. Le disque lui même n’étant pas en cause, je craignais qu’un autre composant sur la carte mère ne fût HS. Là encore “google est ton ami” : le coupable semblait être la nappe qui relie disque à la carte mère. Elle est très fragile. Constituée d’une sorte de circuit imprimé sur une feuille de plastique. Si on la plie le circuit imprimé casse. Or la mienne était bien pliée… Une dizaine d’euro plus tard grâce à EBay, mon portable reconnu le disque et une nouvelle vie, muette,  commença pour lui.