Être ou ne pas être… Python

Voilà bien longtemps que je me dis qu’il faudrait me mettre à Python. Selon les adeptes de ce langage, une fois qu’on y a touché, c’est comme le crack. Ou disons comme le fondant au chocolat.

Mais il n’y a pas moyen, je n’arrive pas à m’y coller… Et à chaque fois que j’essaie de me lancer pour un nouveau projet, je tombe toujours sur le même problème: Python 2 ou python 3?

Beaucoup de librairies ne sont disponibles qu’en Python 2, alors que Python 3 existe officiellement depuis… 2008. Oui, 9 ans. Et à chaque fois, les librairies qui me seraient utiles pour le projet du moment n’ont pas été portées sur Python 3, alors finalement je pars sur du bon vieux C#.

Allez, je réessaye, on verra bien… Cette fois, j’ai trouvé Pillow, le portage de PIL en Python 3, qui devrait faire l’affaire. En avant Guingamp!

[PS] Je viens d’apprendre que le serpent qui se mord la queue est un symbole qui s’appelle Ouroboros L’image provient du site http://www.animogen.com. Il a l’air malin maintenant…

Créer des templates dans Atom

Salut les barbus!

Vous qui programmez (et je sais qu’il y en a, pas la peine vous cacher!), peut-être utilisez-vous l’éditeur Atom?

C’est ce que j’utilise, en tout cas pour développer en C++ sur mes différents joujoux (choux, cailloux, genoux, hiboux, joujoux, poux… oui c’est bien un x… Mais c’est bizarre à lire quand même), Arduino, ESP8266 et Teensy.

Et s’il y a bien une chose qui me fatigue, c’est de devoir toujours taper la même chose à chaque fois que je crée une nouvelle classe:

maclassequitue.h:

maclassequitue.cpp:

Ce n’est pas grand chose, mais c’est monstre rébarbatif de devoir se taper ça à chaque fois.

J’ai trouvé un plugin Atom permettant de créer des templates pour générer ce qu’on veut en deux coups de cuillère à pot. Il s’appelle Atom Smart Templates.

Une fois installé, voici comment j’ai créé ma template pour générer les deux fichiers à partir d’un nom de classe:

  • Menu Packages/Smart Templates/Open templates folder
  • Dupliquer le répertoire de la template de base (BaseTemplate), et l’appeler cpp (nom totalement arbitraire)
  • Virer tout sauf le fichier index.js (qui contient la configuration de notre template)
  • Créer deux fichiers: header.template et implementation.template (noms tout aussi arbitraires)

Le plus gros est fait 🙂

Voici le contenu de mon index.js:

La variable params contient la liste des paramètres à demander à l’utilisateur pour pouvoir générer les fichiers.

Chaque item généré dans la fonction rules prend en source nos deux fichiers .template, et construit leurs noms finaux en fonction du paramètre ClassName qui a été saisi.

Ensuite, nous devons créer notre fichier header.template:

Et le fichier implementation.template:

Facile, non? Et surtout maintenant, quand je veux créer une nouvelle classe, je n’ai qu’à faire un clic droit dans le répertoire concerné, Create files from template, clic sur C++ class, je rentre le nom de ma classe et paf!

Mais c’était quand déjà ? (partie 2)

Salut à tous!

Allez, je mets les pieds dans le plat. Vous vous rappelez mon dernier article à l’arrière goût nostalgique? Non? Mais siiiii… Il est juste en dessous, là… J’expliquais que cet article avait pris le pas sur ce que je désirais réellement écrire ce jour-là. Hé bien voilà, depuis longtemps, je cherche des dates. C’est con hein, mais par exemple, « C’était quand la dernière fois que j’ai changé de caleçon? »

Pardon? Ah. On me fait signe en régie que cet exemple n’est pas génial. Disons plutôt « je fais le plein de ma voiture tous les combien? Et combien ça me coûte, en cumulé? »

Ou encore « c’était quand la dernière fois que j’ai eu mal au crâne? » Ça pourrait être intéressant de savoir si j’ai plus souvent mal à la tête le vendredi ou le samedi, par exemple. Ou plus l’hiver que l’été.

Alors j’ai attrapé mon plus beau clavier et j’ai développé une application web qui permet justement de tracer les événements de ma vie, qu’ils soient ponctuels ou récurrents (c’est surtout intéressant pour les récurrents), et dont je veux pouvoir retrouver les dates plus tard, voire établir des statistiques. statistics-exampleJe peux aussi faire un rapprochement entre les répétitions du vendredi soir et le mal de crâne du samedi matin (bien que cette corrélation fût déjà établie…)

Et surtout, plus que tout: je saurai enfin tous les combien on change la pile de la pendule du salon! Non mais c’est vrai quoi, elle les bouffe ou bien?

Alors j’ai mis en ligne whenwas.it, et je l’utilise évidemment, puisqu’à la base je l’ai conçu selon mes besoins.

J’y note les cafés que je bois, les jours où j’achète des clopes, les matins où je me lève avec le mal de crâne, quand je fais le plein (et dans ce cas j’indique les montants pour pouvoir calculer automatiquement des cumuls), et pas mal d’autres événements récurrents.

Je me suis dit que ce genre d’application pourrait être utile à pas mal de monde, alors les inscriptions sont ouvertes.

L’interface est responsive, et construite à base d’agrumes avec le très agréable framework materializecss.

Mais qu’est-ce que que je raconte avec mes citrons… Voyez plutôt:

when-was-it-nico

Et si vous pensez que ça peut vous être utile, alors n’hésitez pas!

Tschüss!

Interfaces de programmation pour ESP8266

La première question qu’on se pose quand on reçoit un ESP8266, c’est…

« Ah merde, mais comment je vais programmer ce machin? »

Il y a besoin de 4 fils : +, -, Rx et Tx, donc la première chose, c’est de se procurer un convertisseur USB-série. Le point crucial, c’est la tension de sortie de ce convertisseur. Elle doit être de 3.3v à la fois sur le Vcc ET sur le Tx. Le risque avec du 5V, c’est tout bêtement de griller l’ESP.

L'interface USB-série
L’interface USB-série. On peut voir en bas le sélecteur 5V-3.3V, et en haut le bouton reset.

L’ESP8266 01 a des broches au pas de 2.54mm, mais n’est pas utilisable dans une breadboard à cause de la position des broches. Donc soit on y va avec des fils et des connecteurs Dupont, soit un se fait un petit circuit imprimé pour connecter tout ça à l’adaptateur USB-série. Au début, j’utilisais la première méthode, mais j’ai finalement opté pour un petit circuit imprimé…

Vert jaune rouge... Rastaman!
Vert jaune rouge… Rastaman!

A gauche, il y a un emplacement pour un cavalier. Il sert à faire démarrer l’ESP8266 en mode programmation.

Oui, je n'avais que des connecteurs femelles à 8 contacts...
Oui, je n’avais que des connecteurs femelles à 8 contacts… C’est joli le scotch…
Et l'ensemble connecté sur le PC, prêt à être programmé!
Et l’ensemble connecté sur le PC, prêt à être programmé!

Le truc avec l’ESP8266, c’est qu’il se décline en je ne sais combien de versions différentes. J’ai aussi un 12e sous la main, et pour lui, l’emplacement des broches est un peu plus particulier, dans le sens où elles sont espacées de 2mm, et non de 2.54mm. Du coup j’ai dû commander des headers au pas de 2mm afin de faire un programmateur et adaptateur.

Il est juste glissé entre les headers pour faire le contact. Pas de soudures, c'est cool!
Il est juste glissé entre les headers pour faire le contact. Pas de soudures, c’est cool!

Après coup, je me dis que j’aurais pu placer les headers pour faire en sorte que l’ESP8266 soit carrément enfiché sur les headers. Mais là, ça va pile poil.

Il faut un cavalier en permanence entre la GPIO15 et la masse pour qu’il démarre (ça il faut le savoir…), et un autre en bas pour mettre la GPIO0 à la masse (ça c’est pour le mode programmation).

Côté connection au PC, c’est le même principe.

Un peu plus gros mais ça va bien :)
Un peu plus gros mais ça va bien 🙂

 

Fonctionnalités très appréciables dans l’IDE Arduino

Adieu l’équipe!

J’avais envie d’écrire un petit article pour saluer les évolutions de l’IDE Arduino.

Par rapports aux débuts, il y a eu à mes yeux deux avancées majeures: le gestionnaire de cartes et le gestionnaire de librairies.

Le gestionnaire de cartes

Aujourd’hui, l’IDE Arduino est utilisable avec de nombreux microcontrôleurs, par forcément Atmel.

Parmi les cartes notables que j’ai pu utiliser, il y a la Teensy 3.x et l’ESP8266.

Evidemment, le protocole d’upload des programmes vers l’un ou l’autre des microcontrôleurs est différent, et l’IDE doit savoir comment communiquer.

Pour cela, on a le menu Outils>Types de cartes, et on peut sélectionner la bonne. Mais quid des cartes non listées dans ce menu?

Et bien c’est pas compliqué.

Avant tout, il faut éventuellement ajouter la source du package pour obtenir le driver de cette carte, dans les préférences de l’IDE:

arduino-esp-preferences

Puis on va dans Outils>Types de cartes>Gestionnaire de cartes et nous avons à disposition une liste de cartes pour lesquelles on peut installer le driver, et paf! il n’y a plus qu’à la sélectionner dans le menu pour la programmer. Sympa! (bon, pas de pot, la Teensy n’apparait pas dans cette liste, il faut installer Teensyduino, un complément disponible sur le site du constructeur). Donc plutôt pratique le gestionnaire de cartes.

arduino-esp-boards

Le gestionnaire de librairies

Alors là c’est encore mieux! Tu as dégoté un nouveau composant et tu n’as pas le cœur à te farcir la datasheet pour comprendre comment discuter avec lui? Comme je te comprends… Prenons à tout hasard le DHT22, qui est un capteur de température/humidité assez répandu. Hé bien pas de prise de tête: on va dans Croquis>Inclure une bibliothèque>Gérer les bibliothèques. Une liste se charge, on tape DHT22 dans le filtre en haut, et paf! on tombe sur DHT sensor library by Adafruit.

arduino-dht22-librairy

Il n’y a plus qu’à cliquer sur le bouton installer, et on se trouve non seulement avec la librairie disponible, mais il y a aussi des exemples disponibles dans Fichier>Exemples! C’est-y pas beau, ça? Hein?

arduino-dht22-exemples

J’ai particulièrement apprécié cette fonctionnalité avec un capteur que j’avais acheté il y a quelque temps, et qui est une vraie merde à programmer: le MLX90614. C’est un thermomètre IR directionnel. Ça permet d’obtenir la température d’un objet sans contact. Mais alors pour communiquer avec, amuse toi si tu n’as que la datasheet sous la main… C’est un protocole I2C modifié, le truc bien relou. Hé bien l’autre jour j’ai tapé MLX dans le champ de recherche du gestionnaire de librairies, et j’ai eu le plaisir de pouvoir utiliser le capteur hyper simplement. Merci à Adafruit d’avoir écrit cette classe… Et d’ailleurs en regardant le code, c’est pas si long… Respect 🙂

Communiquer avec Adafruit IO en PHP

Salut tout le monde!

Voilà un moment que je n’ai rien posté, mais j’ai de bonnes raisons… Bricolage intensif sur l’ESP8266 (merci Sandrine de Bloguelinux) sur lequel je ferai très bientôt un gros billet 🙂

Bref, pour aujourd’hui, je vais vous parler de la plateforme Adafruit IO, qui est un superbe environnement pour stocker les données d’objets connectés.

La structure des données est simple et efficace: on crée des feeds, qui sont de simples listes de valeurs.

Chaque élément d’un feed a une valeur (une température par exemple), et éventuellement des coordonnées GPS.

Pour ma part, j’ai utilisé un capteur DHT22, et l’ESP8266 balance les données de température et d’humidité relative dans deux feeds.

Et avec les feeds, on peut (entre autres) afficher des courbes :

adafruit io graphique
Ça caille encore un peu dans le salon…

https://io.adafruit.com/toxnico

L’interaction avec AdaFruit IO pour envoyer ou lire les données se fait par une API REST; du coup je me suis dit qu’il serait intéressant d’avoir la possibilité, en PHP, de charger la dernière valeur de chaque feed pour l’afficher sur un site web par exemple.

Alors j’ai écrit cette petite librairie sous GPL v2 pour permettre à tout le monde de récupérer facilement ses données : https://github.com/toxnico/php-adafruitio

Vos retours et impressions sont les bienvenus!

A très bientôt pour une grosse aventure ESP8266 🙂

Plugin WordPress pour bloquer les tentatives d’intrusion (et les spams de commentaires?)

Si comme moi, vous avez un site qui tourne sous WordPress, vous avez probablement des dizaines de tentatives d’intrusion par jour.

Pendant un temps, j’ai utilisé le plugin All in one WordPress Security. Il bloque les adresses IP après 3 tentatives de login infructueuses, et vous envoie une notification. C’est très bien mais je l’ai trouvé un peu trop lourd pour ce que je cherchais à faire, à savoir sécuriser ma page de login.

Ne trouvant pas de solution simple pour masquer cette putain de page, j’ai décidé d’écrire mon propre plugin qui fait le boulot. C’était l’occasion d’apprendre à développer des plugins WordPress, hé bien ce n’est pas si compliqué que ça en a l’air! Accessoirement, il bloque aussi les appels XML-RPC. Et comme side effect non prévu et très intéressant, les spams de commentaires… Je ne sais pas pourquoi, mais c’est ce que je constate chez moi en tout cas 🙂

Pour la petite histoire, j’ai tenté de le vendre via la plateforme codecanyon (je ne mets pas le lien, c’est volontaire car à mon humble avis ce sont des raclures). Pour ça, j’ai packagé mon petit bouzin, j’ai documenté le code à mort et je leur ai envoyé pour qu’ils l’analysent et le publient.

Deux semaines plus tard, j’ai reçu un email me disant que mon plugin a été refusé. Pourquoi? Parce que. Merci les gars pour la précision des explications, et allez vous faire empapaouter.

Alors tant pis pour la vente, je l’ai mis sous GPL2 et je l’ai publié sur Github.

Mais il marche comment ton plugin?

Le principe est très simple. Normalement, quand on veut s’authentifier sur un site WordPress, on tombe sur la page wp-login.php et on a accès au formulaire login/mot de passe.

Hé bien une fois que ce plugin est activé, il faut juste ajouter un paramètre de votre choix dans l’URL pour que la page de login soit visible. Par exemple, wp-login.php&dirty=marmotte

C’est tout. Vous pouvez essayer chez moi si vous voulez.

Vous pouvez aussi essayer d’envoyer des requêtes POST directement sur wp-login.php, même si le login/mot de passe est correct, si la clé n’est pas là ça ne passera pas;)

Et donc, je disais plus haut que ce plugin vous permet aussi de désactiver le XML-RPC, qui est un web service permettant d’effectuer des opérations sur WordPress depuis des applications tierces. C’est un vecteur important d’attaques brute force, et il est activé par défaut alors que la plupart du temps il n’est pas utile.

Et les spams de commentaires?

Alors ça, c’est le point imprévu de ce plugin.

Je soupçonne que les spambots se basent sur la présence d’une page wp-login.php pour savoir si on est sur wordpress, et à partir de là, ils savent comment poster un commentaire de façon automatique.

Ici, comme il n’y a plus de wp-admin.php standard, ils ne sauraient pas comment envoyer un commentaire. Enfin c’est mon analyse, je ne sais pas si elle est correcte… Toujours est-il que sur mon blog, j’ai zéro spam détecté par akismet, et rien en file d’attente. C’est plutôt cool du coup. N’hésitez pas à me faire un petit retour si ce n’est pas le cas chez vous, et dans ce cas je corrigerai cet article.

Voici l’archive du plugin à installer dans WordPress : wp-login-door.zip

wp-login-door sur GitHub

Et si ce plugin vous plait, pourquoi pas faire un petit don?

A bientôt!