Masquer automatiquement le clavier lorsque le champs perd le focus

Un champs texte sous Android ouvre un clavier virtuel quand il obtient le focus mais ne le masque pas automatiquement quand il le perd, ce qui peut sembler assez dérangeant quand on clique ailleurs et que le clavier reste au milieu.

Ce petit bout de code est à insérer dans votre activité, il surcharge juste la méthode dispatchTouchEvent() pour automatiquement masquer le clavier virtuel d’un champs EditText qui perd le focus.

 

Déplacer son dossier Google Drive

Parmi toutes les solutions de Cloud Storage qu’il peut exister, le Google Drive est l’une des plus utilisées même si parfois, on ne s’en rend même pas compte.

Google Drive s’installe facilement avec une configuration par défaut, certes facile mais pas très personnalisable.
Il en arrive qu’on veut parfois déplacer son dossier Google Drive, afin d’alléger son SSD par exemple.

Étape 1 : Fermer Google Drive

Vous trouverez l’icône du triangle tricolore logo-drive dans votre barre d’icône à droit de la barre des tâches. Cliquez-dessus, allez dans les paramètres GoogleDrive-BoutonParametres puis cliquez sur « Quitter Google Drive ».

Étape 2 : Déplacer le dossier

Le dossier par défaut de Google Drive se nomme Google Drive (Wouuuah) et se trouve votre dossier utilisateur, vous le trouverez un peu partout, il porte généralement votre nom, il s’agît de « C:\Utilisateurs\VotreNom\Google Drive ».
Il vous reste plus qu’à lui trouver une place ailleurs, Couper/Coller le.

Étape 3 : Relancer Google Drive

Relancez Google Drive et alors là, c’est le drame, il ne trouve plus son dossier… mais non, il affiche juste une alerte. Pour rectifier ça, il suffit d’ouvrir la petite icône logo-drive à nouveau. Il vous propose alors d’enregistrer un dossier, cliquez ensuite sur « Localiser le dossier… », sélectionnez le nouvel emplacement de Google Drive, confirmez et laissez le faire son travail maintenant.

Le logiciel peut évoluer avec le temps mais le principe devrait rester le même, n’hésitez pas à me dire en commentaire si quelque chose change.

Live stream entre PHP et JavaScript

Nous voulons ici communiquer un flux du serveur vers le client, la meilleure solution que j’ai trouvé pour ça, c’est l’EventSource, c’est une classe javascript qui utilise le protocole Event Stream.
Ce protocole utilise un format statique assez simple, il est reconnu par la majorité des grands navigateurs et il permet d’envoyer continuellement des données au client sous forme d’événement. On en entend peu parler sur l’internet français, c’est dommage, c’est facile à utiliser et vraiment pratique. Nous allons voir comment l’utiliser avec PHP et Javascript.

L’Event Stream

Ces événements peuvent posséder 4 propriétés, nous n’utiliserons que les champs type et data ici, si vous le souhaitez, vous pouvez retrouver toutes les propriétés d’un event sur mozilla.org.

Le champs data est le plus important, il peut fonctionner tout seul, il contient les données à envoyer.
Voici un exemple simple:

data: Des données\n\n

Sur plusieurs lignes:

data: Des données\n
data: sur plusieurs lignes\n\n

Avec un type spécifié:

type: status\n
data: Nouveau statut\n\n

Vous pouvez ainsi remarquer que pour fermer un événement, on utiliser un double \n alors que pour terminer une ligne, on n’en met qu’un.

Le champs type permet de faire varier le type d’événement envoyé au navigateur et ainsi, on pourra envoyer des événements sous des formats totalement différents sans aucun soucis. Par défaut, le type est « message ».

Son implémentation en PHP

On veut à présent permettre à un script PHP accéder par une page web de diffuser un flux Event Stream en continu avec pour seule condition d’arrêt la déconnexion de l’utilisateur.

On commence par configurer PHP.

Voici un exemple de flux en PHP.

L’Event Source en JavaScript

Côté JavaScript, l’event source fonctionne entièrement en programmation orientée événement, ce qui signifie que vous n’allez pas interagir avec, juste réagir aux événements.

Il y a des événements qui peuvent être retournés par l’API, comme « error » et « open » mais autrement, vous pouvez enregistrer un événement selon le type que vous pouvez recevoir, si aucun listener n’est trouvé pour un type de message, le message est ignoré.
Ainsi, si mon serveur envoie des événements de type « status », je pourrais faire :

Il est ainsi très simple de recevoir des événements depuis notre application PHP mais il faut garder à l’idée que c’est unidirectionnel et que vous ne pouvez ni interagir avec le flux, ni le modifier, c’est le serveur qui décide ce qu’il envoie.
Après vous pouvez faire des scripts plus complexes qui vont permettre au script PHP de récupérer des commandes via un autre appel en AJAX.

Sources

Utilisation des envois d’événements côté serveur (server-sent events) sur mozilla.org
Stream Updates with Server-Sent Events sur html5rocks.com [en]

 

Live stream d’une console SSH en PHP

J’ai récemment eu le besoin de créer un stream live entre une application PHP et un serveur debian via SSH2 dans lequel une commande tail -f est lancée, cette commande permet de récupérer immédiatement dans le flux de sorti les modifications apportées au fichier, notamment les nouvelles lignes.
Pour ce faire, c’est très simple me direz-vous, on ouvre une connexion SSH2, on exécute la commande et on attend les résultats dans le flux, oui mais il faut faire ça proprement et de manière coordonnée.

Pour établir une connexion SSH, il existe nativement des fonctions ssh2_* dans PHP qui viennent avec la lib php5-ssh2, j’ai développé une classe qui utilise ses fonctions de manière à interagir avec un objet plutôt qu’une ressource, le but n’étant pas ici de vous montrer comment utiliser cette classe, je passerai sur sa configuration, si vous avez des questions, n’hésitez pas à commenter.

Pour ce faire, d’abord, on configure PHP.

On récupère ensuite notre flux de données en SSH.

Le flux ne doit surtout pas être bloquant si vous souhaitez qu’il continue lorsque votre utilisateur se déconnecte.

Il est important de laisser notre serveur souffler un peu alors si la ligne est vide, on le laisse dormir un peu.
Ici, on s’arrête proprement si l’utilisateur s’est déconnecté, d’où l’utilisation de connection_aborted().

Enfin, on ferme proprement notre flux et sa connexion SSH2.

Ainsi le processus web se termine, la connexion SSH est fermée et le processus sur notre serveur SSH s’est arrêté.

Ma bibliothèque SSH2 : Voir sur GitHub

[FIX] Problème de correspondance entre client MySQL et les entêtes

Le problème

Suite à la mise à jour de ce WordPress vers 4.5, j’ai récemment obtenu l’erreur suivante:

Warning: mysqli_real_connect(): Headers and client library minor version mismatch. Headers:50546 Library:50625

Nous allons donc voir ensemble comment la résoudre, sachant que les numéros de version peuvent être différents et que le correctif peut quand même s’appliquer correctement.

Comme bibliothèque PHP pour interagir avec MySQL, j’utilisais php5-mysql comme à peu près tout le monde mais apparemment, il y a un problème avec elle et MySQLi n’hésite pas à remonter une erreur à PHP s’il trouve un problème de concordance entre les versions, alors que concrètement, ces discordances n’ont aucun impact sur l’utilisation de MySQL.

Pour réparer cela, j’ai d’abord mis à jour le serveur, ce qui a mené à une mise à jour de mysql-client et une de php5-mysql, j’étais donc plutôt optimiste, mais ça n’a rien changé au problème.

La solution

La solution qui fonctionne [dans mon cas au moins] est d’installer php5-mysqlnd à la place de php5-mysql et de redémarrer le serveur web et le serveur MySQL.