Mon Carnet d'adresses

Comme beaucoup de personnes qui commencent la programmation, on commence par de petits programmes simple comme "hello world" puis un peu plus gros avec une calculatrice, puis un carnet d'adresse,... jusqu'à de gros projets bien plus ambitieux. Ici, je vais vous présenter mon carnet d'adresse qui se voulait simple d'utilisation mais qui offrait tout de même quelques fonctionnalités intéressantes.

Pour l'interface graphique j'utilise le framework Qt car il est très puissant et pourtant assez simple d'utilisation. Il se paye le luxe en plus d'être très bien documenté alors pourquoi se priver? Nous voyons donc sur mon carnet d'adresse une liste à droite qui correspond aux groupes de contacts. On peut évidemment les éditer, en rajouter et en supprimer. A droite, nous avons la liste de contact qui correspond au groupe sélectionné et les informations qui y figurent sont paramétrables, c'est à dire, que l'on peut sélectionner les informations à afficher ou désafficher en faisant un clic droit sur la barre du tableau. On peut aussi déplacer des contacts dans un autre groupe en faisant un drag&drop ou via les menus. Regardons donc maintenant comment on créer un nouveau contact! Pour celà, vous l'aurez deviné, on clique sur le bouton "Nouveau" ou bien, on fait appel au menu contextuel de la liste de contacts et voilà ce qui s'affiche.

Nous avons donc une boite de dialogue comportant 3 onglets représentants en quelque sorte 3 niveaux d"informations du contact, en premier lieu : les informations personnelles, puis les informations privée et professionnelle. Tous les contacts sont ensuite enregistrés dans un simple fichier comportant les classes sérialisées avec leur hash afin de vérifier à l'ouverture du programme que le fichier n'a pas été corrompu. L'image ci-dessous montre le contenu du menu "fichier", on voit que l'on peut importer des contacts (csv, format inventé .ls ou format MAB). Le format MAB est utilisé par Thunderbird et j'en parlerai un peu plus bas.

Vous avez surement vu que l'on pouvez imprimer via ce menu... mais que peut-on imprimer me direz vous? En fait, en sélectionnant un groupe et en faisant une impression, le programme créé auparavant un tableau comportant des informations préselectionnées par mes soins (en effet, on ne peut pas mettre toutes les informations dans le tableau, une feuille A4 même en format paysage ne suffirait pas) puis affiche la fameuse boite de dialogue d'impression. Le menu "edition" permet de modifier les contacts mais aussi de les déplacer comme pour le drag&drop, le menu "affichage" permet d'afficher ou de désafficher la toolbar. Le menu "outils" lui contient le sous menu exportation qui ouvre la boite de dialogue ci-contre:

En fonction du type d'export choisi, la boite de dialogue devait permettre à l'utilisateur de choisir les groupes de contacts concernés mais aussi les informations à exporter, seulement je n'ai pas continuer plus loin et ce sont donc des paramètres prédéfinis quelque soit l'export pour le moment. Qui sait, peut-être qu'un jour je le continuerai!

Il y a une dernière fonctionnalité dont il me faut parler, il s'agit de la synchronisation avec les contacts Thunderbird. Actuellement, elle est transparente pour l'utilisateur car elle s'effectue à chaque redémarrage du programme en allant chercher le fichier de donnée de Thunderbird et ces contacts sont affichés dans le groupe nommé "Contacts Thunderbird" (très original n'est-ce pas?). Pour réussir cette fonctionnalité il m'aura fallu beaucoup de temp car le format de fichier utilisé par Thunderbird est assez peu utilisé et est même humainement peu compréhensible contrairement à du XML ou éventuellement du JSON quand on prend le soin de faire les sauts de ligne et l'indentation évidemment. Heureusement, il existait un parser créé par une personne tierce afin de récupérer les informations de ce type de fichier mais sans aucune documentation si ce n'est le code lui même. Il m'aura donc fallu faire un peu de reverse engineering et surtout de beaucoup de tests pour l'utiliser correctement.

Même si je m'engage dans une pente glissante, je vais tenter d'expliquer comment fonctionne un fichier MAB (ou mork):

Pour commencer, voilà à quoi ça ressemble (et encore il n'y a qu'un contact et pas toutes les informations renseignées!) :

Comme vous le voyez c'est assez imbuvable... Alors comment ça fonctionne? Et bien au début du fichier se trouve ce qui ressemble à une table de correspondance par exemple : B8 correspond à l'élément LastModifiedDate non utile pour mon programme mais qui permet tout de même de savoir si le contact à été modifié récemment. Si l'on descend plus bas après la chaine de caractère suivante : @$${1{@, on commence enfin à avoir les données des contacts. C'est très ressemblant du tableau de correspondance mais ne nous y trompons pas, il ne suffit pas de se dire que 81 correspond à mon nom entier comme on pourrait le croire car dans le tableau de correspondance 81 fait référence à un tout autre élément! Alors quoi? Comment on récupère les données dans l'ordre? Et bien en fait, dans le second paragraphe après les caractères {-1:^80 {(k^BC:c)(s=9)} nous avons une sorte de table de correspondance qui va nous permettre de remettre les choses dans l'ordre. Nous avons donc une série d'éléments entre parenthèses comme ceci : (^87^81) ou bien (82=). La première parenthèse m'indique que l'élément 87 du contact correspond à l'élément 81 du tableau de correspondance! Enfin, on peut récupérer le nom complet! Mais le second? Alors lui il indique juste que l'élément 82 du tableau de correspondance n'est pas renseigné! Drole de façon de gérer les données n'est-ce pas? Surtout que pour courronner le tout, le tableau de correspondance de chaque contact est différent! Je ne vous raconte pas le nombre d'heures que j'ai passé à comprendre le système et surtout à l'interfacer avec mon logiciel! En tout cas ce fut un plaisir d'y parvenir!

Voilà les sources du programme pour ceux que ça intéresse

Sources

Recovery Search

Alors que j'étais technicien de maintenance dans un grand centre de réparation informatique (laptop, desktop et all in one dont Apple), j'ai eu l'occasion de faire une quantité de restauration système phénoménale. En effet, à chaque changement de disque dur, on se doit de remettre l'OS d'origine avec les pilotes et les logiciels constructeurs et partenaires préinstallés. Heureusement, les images disques (Ghosts autrement nommés) permettent de faire une copie conforme et de la restaurer autant de fois que nous le souhaitons sur une machine vierge. Bien sûr, nous traitions de multiples modèles ayant chacun un Ghost dédié et stocker dans différents disque dur. Afin de les retrouver facilement, les techniciens avaient pris pour habitude d'éditer un fichier excel avec une liste des images pour chaque disque dur. Chaque Expert de pôle tenait à jour les images disques des constructeurs dont il avait la charge.

Personnellement, je trouvais la lecture du fichier excel fastidieuse et y chercher la bonne image n'était pas forcément aisé d'autant que si nous avions le malheur d'aller chercher un disque qui se trouvait être déjà pris, on devait retourner lire le fichier excel pour y chercher un autre emplacement (heureusement, certaines images étant fréquemment utilisées on les copiaient en double ou triple). Je me suis donc mis à réfléchir à la façon de rendre la recherche plus rapide.

C'est de là qu'est né Recovery Search (encore un nom original n'est-ce pas?) un logiciel qui au départ devait simplement rechercher les informations dans des fichiers textes... Mais, en utilisant Qt, j'en ai profité pour l'améliorer et améliorer mes propres connaissances, en utilisant les classes du module QtSql qui permettent de gérer des bases de données SQL. Etant dans une infrastructure déjà établie et simple technicien, je me voyais mal utiliser une base de donnée MySql pour ce simple logiciel. C'est là que j'ai découvert SQLite. Permettant de gérer des bases de données contenues dans un simple fichier en local, il permet d'être utilisé pour des applications portables et est bien largement suffisant pour l'utilisation que j'en aurais. Il m'aura tout d'abord fallut récupérer tous les fichiers excel de tous les pôles pour en récupérer les données et créer la base de donnée. Un export csv et un petit programme m'a permit de créer la base de donnée en très peu de temps. Ayant une base utilisable, il ne me restait plus qu'à développer le logiciel qui l'utiliserait.

Voilà donc quelques images, interface très moderne n'est-ce pas?

Et ci-dessous l'interface qui permet l'édition de la base de donnée. Accessible par le bouton "gestionnaire d'images" en bas de l'interface d'accueil et accessible seulement par mot de passe pour éviter qu'un technicien lambda s'amuse à trifouiller! (mot de passe hashé bien sûr)

Je pense que les images parlent d'elles-même mais je laisse les fichiers sources ci-dessous.

Sources

Vidéothèque (en cours)


Comme beaucoup de monde, j'aime avoir mes films sur le PC et alors que je commençais à en avoir une quantité grandissante, une centaine environ, il devenait difficile d'en chercher un en particulier. A ce moment là je commençais à chercher un logiciel de vidéothèque qui prendrait en charge mes films et leur rajouterait du contenu mais surtout permettrait de rendre la recherche et la mise en page beaucoup plus agréable. Une sorte de XBMC ou MyCinema pour ceux qui connaissent. Cherchant toujours à progresser, je me suis dit que je devrais le développer moi même et j'ai commencé à me renseigner sur la façon de procéder afin de récolter les données de mes films automatiquement (synopsis, casting, ratings, statistics, runtime,...) et j'ai découvert que le site Allociné proposait un API pour rechercher dans leur base de donnée. Le principe est simple, on envoit une requête avec des paramètres PHP (GET) dans lesquels on indique le type de recherche (search, movie, tvseries, episode, person,...) les mots clés si c'est une recherche de type "search" ou le code de l'élément si c'est une recherche des autres types et le serveur renvoit un fichier XML ou JSON selon là encore les paramètres renseigné et il suffit d'en parser le contenu pour récupérer une quantité d'information laissant libre cours à nos fantaisies.

Url d'exemple envoyé au serveur qui renvoit plusieurs films correspondant à la recherche avec les informations essentielles : http://api.allocine.fr/rest/v3/search?q=avatar&count=20&page=1&filter=movie&format=xml

Nous avons donc le type de recherche, les mots clés dans le paramètre "q", le nombre d'éléments maximum que le serveur doit nous renvoyer par le paramètre "count", le numéro de page de la recherche (en effet si le nombre d'éléments retournés est grand, plusieurs pages sont accessibles) à laquelle accéder, le filtre qui indique le type d'éléments que l'on veut recevoir (on peut en spécifier plusieurs en faisant "filter=movie,tvserie,person,episode").

Et voilà comment je récupère ces données pour les afficher dans une boite de dialogue demandant à l'utilisateur de sélectionner le film qui correspond à celui qu'il a sur sa machine. Pour le moment, je n'ai pas encore développé l'interface principale, et donc la recherche ne se fait qu'en dur dans le code pour réaliser mes tests. Et je n'ai d'ailleurs pas continué plus pour le moment, comme je l'ai indiqué ce logiciel est toujours en cours de développement. Voilà quand même une image de l'interface qui s'ouvre à la fin d'une recherche multiple (la fameuse boite de dialogue)