Comparer le type d’un objet en Java

Il peut être intéressant dans certains cas de stocker différents types d’objets dans une ArrayList. Ceci implique que tous les objets aient un niveau d’abstraction supplémentaire pour être contenus dans cette liste. Le problème va être d’identifier chaque type d’objet lorsque l’on voudra les sortir de cette liste.

Prenons un exemple concret. Nous souhaitons créer un objet « Carte » qui peut contenir un « Nom« , un « Prenom » et plusieurs « Email » tous héritant de la classe « ElementCarte« . Ne sachant pas quels éléments seront ajoutés à la carte, il est plus simple de créer une ArrayList de « ElementCarte » dans laquelle se trouveront les différents éléments.

Le problème sera lorsque nous souhaiteront exploiter les données enregistrées. Le plus intéressant serait de caster chaque donnée, mais comment savoir à quel type spécifique il correspond ? C’est là qu’intervient instanceof. Il permet de tester le type d’un objet. On pourra donc faire quelque chose comme :

for (ElementCarte ec : maListe) {
    if (ec instanceof Nom) {
        //Alors l'élément est de type Nom
    }
}

Chaque élément peut ainsi être traité en temps que son type et pas en temps que la classe dont il hérite.

Ajouter et enlever des composants dans Glassfish

Le fournisseur de persistance (Persistence Provider) utilisé de base avec Glassfish est EclipseLink. Malheureusement, j’avais besoin d’utiliser Hibernate pour un projet. Il m’a donc fallut l’installer.

Grâce à l’update center, ceci est devenu très simple. Il faut tout d’abord commencer par installer ce dernier si ce n’est pas déjà fait. Il suffit d’exécuter updatetool dans le dossier bin à la racine de l’installation de Glassfish.

Une fois l’update center installé, il suffit de cocher Hibernate JPA dans les composants disponibles pour qu’il soit rajouté à Glassfish.

Voyons maintenant la procédure pour désinstaller un composant précédemment installé par ce biais. Il faut passer par l’outil pkg situé dans le même répertoire bin que tout à l’heure. En effet, il n’est pas possible de décocher un composant pour le supprimer. Il est possible de lister les noms exacts de tous les composants actuellement installés en faisant :

pkg list

Il ne reste plus qu’à supprimer ceux que l’on veut à l’aide de la commande :

pkg uninstall <PACKAGE NAME>

Vous voilà prêt à éviter les erreurs de type :

Exception while preparing the app : java.lang.ClassNotFoundException: org.hibernate.ejb.HibernatePersistence

Améliorer sa barre d’édition WordPress

Les options de la barre d’édition de WordPress sont assez succinctes de base et ne permettent pas de faire beaucoup plus que le minimum. Cependant, comme d’habitude avec WordPress, il existe des plugins qui permettent de booster un peu ses options sans avoir à taper de code dans la partie HTML des articles.

Celui que j’ai testé et adopté pour ma part est TinyMCE Advanced. J’en avais eu besoin au tout début afin de pouvoir intégrer un tableau dans un article WordPress mais il permet vraiment de faire énormément plus. Il est possible de rajouter des émoticônes, d’intégrer des vidéos, des tableaux, des symboles, …

Il est facilement modulaire et on peut aisément choisir les options que l’on souhaite rajouter à la barre afin de ne pas risquer de la surcharger.

Vous pourrez aussi trouver plus d’informations sur le site officielle de TinyMCE Advanced.

Hard Reset Android avec ADB

Je possède une tablette Android avec un firmware de développement sur lequel j’ai essayé de mettre les Google Apps afin de profiter du Play Store. Le problème que j’ai rencontré est que les paquets que j’avais téléchargé n’étaient pas compatible avec la version d’Android qui tourne sur ma tablette (4.0.4) et après une redémarrage, j’ai eu le droit à une tablette qui rebootait à l’infini.

Impossible donc de passer par la remise aux configurations d’usine depuis l’écran de paramètres. Après quelques essaies, j’ai trouvé la solution qui a fonctionné.

ADB (Android Debug Bridge) est l’utilitaire fournit avec le SDK Android pour agir sur un matériel connecté à l’ordinateur directement. Il est presque possible de tout faire depuis lui à l’aide de simples lignes de commandes.

J’ai donc éteint ma tablette puis l’ai branchée à mon ordinateur. Celle ci a commencé à démarrer tout en se connectant à l’ordinateur même si la boucle infinie s’est remise en place.

Je suis allé dans le dossier d’installation de mon SDK Android (Pour moi C:\Program Files (x86)\Android\android-sdk), et suis allé cherché ADB dans le dossier platform-tools. D’ici, j’ai pu taper

adb.exe shell

afin de rentrer dans le mode de commande d’ADB et agir sur ma tablette. Une erreur « Device Not Found » peut avoir lieu, Pour la corriger, désinstaller le pilote de connexion du matériel puis le débrancher et le rebrancher.

Un fois connecté sur le périphérique visé, il suffit de taper

recovery --wipe_data

pour que la tablette soit vidée et remise à 0. Un autre cas peut survenir. La première fois, ma tablette a simplement réussi à fini de booter en me marquant un message « Mode Sécurisé » en bas à gauche. Ce fut cependant suffisant pour accéder aux paramètres et demander un factory reset normalement. Je ne suis cependant pas sûr que ce soit le wipe data qui m’ait fait passer dans ce mode. C’est peut-être un appuie long sur le bouton de volume – qui en est le responsable mais je ne compte pas refaire planter ma tablette pour vérifier donc dans le doute essayez.

En tout cas vous retrouverez une tablette comme neuve et vous pourrez installer Google Play depuis les bons paquets compatibles.

Google Calendar dans Lightning sous Thunderbird

Je venais de rédiger la moitié de cet article avant de faire une petite recherche Google qui me fit en supprimer une grande partie. L’API CalDAV que je voulais décrire et que j’utilise depuis 2 ans bientôt pour avoir mon Google Agenda dans Lightning va être fermée le 16 Septembre 2013. Cette API n’a toujours été disponible qu’à titre expérimental mais je pensais vraiment que Google l’intégrerait à terme pour rester sur un format ouvert. Il s’avère que non. Je ne vais donc pas décrire la manière que j’utilise depuis des années celle ci tombant bientôt en désuétude pour seulement parler de la version utilisant un plugin supplémentaire. 

Lightning est particulièrement puissant et il ne lui manque que Google Calendar de base pour être complet. Il prend en effet déjà les calendriers CalDAV, iCalendar et les WCAP. Afin de pouvoir synchroniser son Calendrier Google avec Lightning, il est nécessaire d’installer un autre plugin qui va rajouter cette option à notre plugin d’agenda. Celui ci est Provider for Google Calendar.

Une fois ce plugin rajouté, il va falloir aller chercher l’adresse de son calendrier Google. Pour ceci, il faut se rendre sur https://www.google.com/calendar/, cliquer sur la flèche à gauche de l’agenda que l’on souhaite synchroniser et sélectionner Paramètres de l’agenda. Dans la page qui apparaît  descendre jusqu’à Adresse URL privée et copier l’adresse donnée par le bouton XML.

Nous avons maintenant le lien de notre Agenda. Rendons nous alors dans Lightning, Créer un nouvel agenda et sélectionner Sur le réseau. Puis, dans la fenêtre qui suit, sélectionner Google Calendar et coller le lien que l’on a trouvé dans la zone Emplacement.

Une fois vos configurations personnelles terminées, vous voila avec un Google Calendar synchronisé et disponible dans votre client mails Thunderbird.

Supprimer les mails en doublon dans Thunderbird

Après avoir importé les mails de mon père depuis Windows Live Mails dans son nouveau Thunderbird, de nombreux mails étaient en double. Ceci était dû à des sauvegarde importées puis sauvegardées puis réimportées au fur et à mesure des réinstallations de sa machine. De très nombreux doublons qu’il aurait été bien fastidieux de supprimer à la main.

Heureusement encore, un plugin existe pour résoudre notre problème et son nom est particulièrement explicite : Supprimer les messages en double (Alternatif)

Plusieurs moyens existent de l’utiliser.

  • Soit vous voulez supprimer tous les messages en double quel que soit le dossier dans lequel les doubles sont trouvés (Supprime tous les doublons même s’il peut être nécessaire de refaire des tries de mail qu’on avait réalisé auparavant) et vous sélectionnez le dossier racine de tous les autres mails.
  • Soit vous voulez supprimer les doublons dans chaque dossier sans se préoccuper du fait qu’un doublon peut se trouver dans un autre dossier et vous sélectionnez les dossiers un par un.

Un fois le dossier sélectionné, faire un clic droit dessus et sélectionner Supprimer les doublons. Une fenêtre apparaît alors demandant quels sont les mails à garder et ceux à supprimer.

Vous vous retrouvez enfin avec une boîte propre dans laquelle aucun doublon ne subsiste.

Migrer de Windows Live Mail à Thunderbird

Thunderbird est, selon moi, le meilleur MUA (« Mail User Agent« , soit logiciel de messagerie) existant. Il est un parfait exemple de logiciel libre poussé par une communauté gigantesque. Il offre des compatibilités de base avec les logiciels comme Microsoft Outlook, Microsoft Outlook express et bien d’autres et permet une évolutivité sans pareil. Cependant, aucune option n’existe actuellement pour importer les mails depuis Windows Live Mail (anciennement Windows Mail).

Windows Live Mail enregistre tous les emails automatiquement sous la forme de fichiers .eml que Thunderbird sait lire mais n’importe pas comme ça. Heureusement, comme WordPress, Thunderbird est extrêmement riche en plugins développés par la communauté et qui permettent de rajouter des fonctionnalités facilement. Celui dont nous avons besoin ici s’appelle ImportExportTools.

Une fois téléchargé et installé dans les modules complémentaires de Thunderbird, Il faut créer un dossier local nommé par exemple Import. Un clic droit dessus, Importer/Exporter au format <.mbox> / <.eml> -> Importer tous les fichiers <.eml> depuis un dossier -> aussi depuis les sous dossiers et aller sélectionner votre dossier situé dans C:\Users\<USERNAME>\AppData\Microsoft\Windows Live Mail.

Tous les mails devrait désormais s’importer en local et récursivement. Devant la grande quantité de mails que j’avais à traiter (un compte d’environ 50 000 mails), j’avais l’impression qu’aucune action n’avait lieu (j’ai appris après que le logiciel peut mettre beaucoup de temps sans donner signe de vie). J’ai donc fait cette opération sur chaque sous-dossier que je cherchais à importer.

Je me suis donc retrouvé avec tous les mails présents dans Windows Live Mail importés dans Thunderbird correctement avec tous les noms/dates/dossiers respectés comme auparavant.

Il faut savoir que ceci ne sert que quand les mails ne sont disponibles qu’en local (C’est souvent le cas sur des quantités aussi énormes de mails car les serveurs de mails limitent à de bien moins grandes quantités). Si vous utilisez seulement vos comptes en IMAP, il suffit de configurer votre compte sous Thunderbird pour qu’il aille se synchroniser et récupérer tous vos mails comme avant.

Kit d’informations sous Linux

Il est toujours intéressant de collecter un certain nombre d’informations sur son système soit de manière répétée, soit occasionnellement. Voici un survol des principales commandes qu’il est bon de connaitre car on vient toujours à les utiliser :

  • apropos <mot>
    Affiche les commandes avec une courte définition en rapport avec <mot>
  • cat <fichier>
    Affiche le contenu texte de <fichier>
  • cat /proc/version
    Affiche la version de son noyau, son nom et la version du compilateur utilisé
  • df
    Affiche des informations sur les partitions
  • du
    Estime la place occupée par les fichiers et répertoires présents dans le dossier courant
  • find <mot>
    Recherche récursivement <mot> dans un répertoire
  • free
    Affiche la quantité de mémoire vive et swap utilisée
  • groups
    Affiche les groupes auxquelles appartient un utilisateur ou par défaut l’utilisateur qui lance la commande
  • id
    Permet d’afficher l’UID et le GID des utilisateurs du système
  • locate <mot>
    Recherche <mot> dans tous les répertoires
  • ls <direction>
    Liste les fichiers et/ou dossiers de <direction> ou par défaut du répertoire courant
  • lsmod
    Affiche le statut des modules du noyau Linux (fichier /proc/modules)
  • lspci
    Affiche les informations sur les bus PCI (donc de la plupart des périphériques)
  • more <fichier>
    Affiche <fichier> dans le shell page par page
  • mount
    Affiche la liste des disques montés. Permet aussi de monter des partitions et périphériques
  • printenv
    Affiche les variables d’environnement de l’utilisateur
  • ps
    Affiche les processus actifs du système
  • pstree
    Affiche les processus actifs du système sous forme d’arbre
  • pwd
    Affiche le chemin du répertoire actuel
  • stat <fichier>
    Affiche des informations sur un <fichier>
  • top
    Affiche des informations en continu sur l’activité du système
  • uname
    Affiche le type de système
  • uptime
    Affiche l’uptime (temps depuis lequel le système est allumé)
  • w
    Liste les utilisateurs connectés et quel programme ils utilisent actuellement
  • whois <URL ou IP>
    Affiche les informations de domaine de <URL> ou de <IP>
  • whatis <commande>
    Affiche la description despages de manuel de la <commande> correspondante
  • whereis <fichier>
    Recherche rapide de <fichier> dans tout le système
  • which <commande>
    Localise une <commande> sur le disque
  • who
    Affiche les utilisateurs connectés au système

Hasher une chaîne de caractères en Java

Une notion élémentaire de sécurité informatique est de ne jamais stocker un mot de passe en clair. La moindre brèche de sécurité qui donnerait accès à la base de stockage des comptes utilisateurs aurait des conséquences catastrophiques.

Pour éviter un tel problème, on prend l’habitude systématique de hasher les mots de passe. On prend aussi l’habitude de faire ce que l’on appelle « saler » les mots de passe mais je reviendrai là dessus à la fin.

En Java, le code suivant retourne le hash sous la forme d’un tableau de byte. Son avantage est de ne pas se limiter au seul hash MD5.

public byte[] hasher(String toHash, String algorythm) {
	byte[] hash = null;

    try {
    	hash = MessageDigest.getInstance(algorythm).digest(toHash.getBytes());
    } catch (NoSuchAlgorithmException ex) {
    	Logger.getLogger(Hasher.class.getName()).log(Level.SEVERE, null, ex);
    }

    return hash;
}

Le hash MD5 produit un résultat sur 128 bits. Il est le plus souvent écrit comme une suite de 32 caractères hexadécimaux. Cependant, grâce à ce code, on peut aussi hasher des chaines en SHA-1, SHA-256, …

Il existe plusieurs manières de transformer ce tableau de byte en chaîne de caractères lisible. La plus simple que j’ai trouvé est celle ci :

public String toReadable(byte[] hash) {
    StringBuilder stringBuilder = new StringBuilder();
    for (byte byt : hash) {
        String hex = Integer.toHexString(byt);
        if (hex.length() == 1) {
            stringBuilder.append(0);
            stringBuilder.append(hex.charAt(hex.length() - 1));
        } else {
            stringBuilder.append(hex.substring(hex.length() - 2));
        }
    }
    return stringBuilder.toString();
}

On obtient ainsi un hash de n’importe quelle chaîne, et ce, dans l’algorithme que l’on souhaite.

Maintenant, je vais vous expliquer ce que l’on appelle le sel (salt) et quel est son intérêt.

Un sel est une séquence de bits dont le but est de modifier une séquence originel, dans notre cas, un mot de passe. La séquence peut être aléatoire ou choisie, mise avant ou après, voire même imbriquée. Le but de ce sel est de rendre unique la séquence finale afin de compliquer la tâche d’un attaquant éventuel. Le sel contre particulièrement bien les attaques que l’on appelle attaque par dictionnaire en diminuant les chances que la chaîne se trouve dans l’un d’entre eux.

De plus, même si le hash final ainsi que le sel sont trouvés, il faudrait générer un dictionnaire par sel. Autant dire une tâche longue et fastidieuse à laquelle aucun attaquant ne se lance tellement sa rentabilité est faible.

Conventions de nommage en Python

Python est un langage dont la force principale est d’obliger les développeurs à opter pour un code clair et indenté. Ainsi, je me suis demandé jusqu’où allaient leurs exigences et notamment avec les conventions de nommage. Celles ci, dont le respect est indispensable dans d’autres langages, s’avèrent volontairement inutiles en Python.

Ainsi, il n’y a pas de manière particulière dictée de nommer un paquet ou une variable. Python résume d’ailleurs sa philosophie en deux phrases :

Explicit is better than implicit.

et

Namespaces are one honking great idea — let’s do more of those!

Ces deux phrases sont tirées de The Zen of Python de Tim Peters (PEP 20). Ce sont d’ailleurs ces PEP (Python Enhancement Proposals) que les développeurs suivent pour structurer leurs codes. La PEP 8 dicte les règles s’appliquant aux variables et donne des exemples précis de chaque cas.

Le choix de faire sauter un certain nombre de conventions comme les « com.name.projectname.groupname.filename » est en partie dû au fait que les import Python permettent de faire :

import com.name.projectname.groupname.filename as shortfilename

et ainsi permettre un gain de place énorme en évitant nombre de répétitions inutiles.