Décès de ma marraine Mimi photo 1

Décès de ma marraine Mimi

Ma Marraine, Micheline Gonati, est décédée samedi dernier au cours d’un accident de la route sur l’autoroute A1, à la suite d’un malaise cardio-vasculaire.

raquette fleurs vertes deuil2

Mimi, tu as choisi de quitter cette terre ce samedi
Dans la paix du Grand Sommeil
Car ta tâche ici-bas était accomplie.
Tes yeux se sont fermés doucement,
Comme pour nous chuchoter
Qu’au bout de la nuit, il y a l’aurore,
Qu’au bout de l’hiver, il y a le printemps,
Qu’au bout de la mort, il y a la Vie.

Mimi, nous ne t’oublierons pas.
On se souviendra toujours de ton rire sonore,
De tous les bons moments passés ensemble
A parler des petits riens de la vie,
Émaillées de piques acerbes aussi parfois,
Et d’impatiences, car nul doute, quelle Rebelle,
Si anticonformiste, tellement ivre de liberté !
Mais toujours restera le souvenir
De ton linge repassé à la perfection,
De ta passion pour les chats et le jardin,
Des albums photos consignant avec soin
Famille, naissances, mariages et communions
De la valeur que tu accordais à la santé
Toujours prête à envoyer Le remède miracle,
De ton amour inconditionnel des enfants,
Toujours prête à conseiller, aider, éduquer
Offrant temps, amour, énergie sans compter,
Sans jamais demander rien en retour.

Mimi, nous t’avons tous profondément aimée,
Amis, Parents, tes Neveux Matthieu et Julia
Le petit Jules qui a illuminé ton cœur et ton âme,
Tes compagnons de route professionnelle,
Confrères, collègues, patients et élèves
Merci de nous avoir honorés de ta présence,
De ton talent, de ton courage, de ton abnégation,
Du bonheur que tu nous as offert.
Tu seras toujours là, présente.
Présente dans le vent qui souffle,
Dans la neige qui scintille,
Dans le chant des oiseaux,
Dans la douce pluie d’automne,
Dans l’étoile qui brille dans la nuit.

Mimi, le temps est venu d’ouvrir tes Ailes de Lumière,
De prendre ton essor et de t’envoler vers la Liberté,
Confiante d’emprunter ce Chemin de Paix, de Joie,
De Sagesse, de Connaissance, libre de tous obstacles
Et de rencontrer à ton arrivée les Êtres que tu as aimés
Qui t’attendent pour partager une nouvelle vie astrale
Vibrante, inspirante où inscrire et rêver ton Grand Rêve.

Mimi, au seuil de ce voyage initiatique de l’âme,
Souviens-toi de toutes tes bonnes Actions,
Sois protégée, entourée d’Amour, de Lumière
Et accompagnée de nos profondes bénédictions.

On pensera toujours à toi Marraine, tu es à jamais dans les cœurs de tous ceux qui ont eu la chance de te connaître. Je t’aime et je pense fort à toi, toujours.

Steven Wilson - The Raven That Refused To Sing photo

Steven Wilson – The Raven That Refused To Sing

The Raven That Refused to Sing (And Other Stories) est le troisième album solo du musicien britannique Steven Wilson, sorti le 25 février 2013 sur le label Kscope Music Record.

Bien qu’il ne puisse pas être considéré comme un album-concept, toutes les chansons ont pour thème des histoires surnaturelles, à l’instar de la chanson éponyme, The Raven That Refused To Sing:

La chanson The Raven That Refused to Sing raconte l’histoire d’un vieil homme qui attend la mort avec impatience. Il repense à une époque de son enfance durant laquelle il était incroyablement proche de sa sœur aînée, qui est morte alors qu’ils étaient tous deux très jeunes.

L’homme est convaincu qu’un corbeau qui visite son jardin est en vérité une manifestation de sa sœur. Le fait est que celle-ci avait l’habitude de chanter pour lui à l’époque de leur enfance, dès qu’il avait peur ou ne se sentait pas en sécurité, et cela avait une influence apaisante sur lui. Ignorant qu’il ne s’agit que d’un simple corbeau, il finit par penser que si le corbeau chante pour lui, ce sera la preuve que sa sœur est revenue pour l’emmener avec lui dans l’au-delà.

Jouent sur cet album Steven Wilson (chant), Guthrie Govan (guitares), Nick Beggs (basse), Marco Minnemann (drums), Adam Holzman (keyboards), et Theo Travis (saxophone / flute). L’album a été produit et mixé par le légendaire Alan Parsons, qui a produit l’album The Dark Side of the Moon de Pink Floyd.

Installer LineageOS (Android 9.0 Pie) sur le OnePlus One photo

Installer LineageOS (Android 9.0 Pie) sur le OnePlus One

lineageos

Aujourd’hui, j’ai installé LineageOS (Android 9.0 Pie) sur mon OnePlus One, histoire de lui redonner un second souffle et de bénéficier des dernières mises à jour de sécurité Android.

Le OnePlus One (OPO) est sorti en mai 2014, il a donc quelques années derrière lui et tourne sous CyanogenMod 13, c’est-à-dire Android 6.0.1 (Marshmallow). Autant dire qu’il n’a pas vu de correctifs de sécurité depuis quelques années!

Étape 1: activer le débogage USB

Sur le téléphone, on commence par activer le mode développeur:

  1. Ouvrez Paramètres > A propos du téléphone.
  2. Tapez 7 fois sur le numéro de build.
  3. Vous venez d’activer le mode développeur!

Grâce au mode développeur, vous avez maintenant accès à des options qui n’étaient pas visibles auparavant et qui vont nous être nécessaires.

Pour activer le débogage USB:

  1. Ouvrez Paramètres > Options pour les développeurs
  2. Activez l’option Débogage Android
  3. Désactivez l’option Mettre à jour la récupération CyanogenMod (sinon l’installation du recovery sera impossible).

Étape 2: installation d’ADB

Android Debug Bridge (adb) est un outil de développement qui facilite la communication entre un appareil Android et un ordinateur. Cette communication s’effectue soit par câble USB, soit en WiFi.

Branchez votre OnePlus One en USB.

Téléchargez les derniers pilotes ADB issus du SDK Android puis décompressez l’archive.

Ouvrez le terminal, rendez-vous dans le répertoire platform-tools et listez ensuite votre téléphone avec cette commande:

./adb devices

Résultat:
List of devices attached
b4be4c53	deviceCode language: PHP (php)

Notre OnePlus One est bien détecté. On reboot en mode fastboot:

./adb reboot bootloader

On liste les appareils détectés par fastboot:

./fastboot devices

Résultat:
b4be4c53    fastboot

Attention, c’est la commande qui va effacer vos données donc pensez à sauvegarder avant!

On déverrouille le bootloader avec:

./fastboot oem unlock
                                                    OKAY [  0.168s]
 Finished. Total time: 0.168s

La partition est effacée, le téléphone va rebooter deux fois puis vous présenter le choix de la langue… comme au premier jour.

Comme c’est un reset de l’appareil, il faut de nouveau activer le débogage USB (étape 1).

Étape 3: installation de TWRP (custom recovery)

Téléchargez TWRP pour OnePlus One (bacon) puis placez le fichier dans le dossier platform-tools, c’est plus commode.

Connectez le téléphone en USB. Ouvrez le terminal et entrez:

./adb reboot bootloader

Puis, on vérifie que fastbootdétecte bien le téléphone:

./fastboot devices
b4be4c53	fastboot

Et on flash TWRP:

./fastboot flash recovery twrp-3.2.3-20190125-bacon.img

Sending 'recovery' (12068 KB)                      OKAY [  0.382s]
Writing 'recovery'                                 OKAY [  0.224s]
Finished. Total time: 0.643sCode language: JavaScript (javascript)

Lire la suite

Activer SSH sous CPanel photo 4

SSH : solution pour l’erreur “Permissions 0644 for ‘id_rsa.pub’ are too open”

Lors d’une connexion SSH sur le serveur d’un client chez WPEngine, je suis tombé sur le message d’erreur suivant:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/matt/.ssh/id_ed25519.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/matt/.ssh/id_ed25519.pub": bad permissionsCode language: PHP (php)

Voici la commande que j’avais entré:

ssh -i ~/.ssh/id_ed25519.pub -o IdentitiesOnly=yes EXAMPLE@wEXAMPLE.ssh.wpengine.netCode language: JavaScript (javascript)

Au lieu d’utiliser ma clé privée, j’ai utilisé ma clé publique (id_ed25519.pub) qui – comme elle est publique – bénéficie de droits plus large que la clé privée.

Il faut donc relancer la commande en retirant l’extension .pub du chemin de la clé, pour que la clé privée soit prise en compte:

ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes EXAMPLE@wEXAMPLE.ssh.wpengine.netCode language: JavaScript (javascript)

Dès lors, plus de problème de connexion et la connexion sur le serveur WPEngine se fait sans souci:

  ____  _____  _____
 ╱   ▕ ▕    ▕ ▕    ▕
▕    ▕ ▕    ▕ ▕    ▕
▕____▕  ╲___╱  ╲___▕                                      ▫
 ____           ____     ▃  ▃  ▃  ▃▃▃    ___   __    __      __   ___
▕    ▕    _    ╱   ▕     █  █  █ ▕█▀▀▙  ▕___) |  ▕  ╱  ▕ ▕  |  ▕ ▕___)
▕    ▕   ( )  ▕    ▕      ██ ██  ▕███▛  ▕     |  ▕ ▕   ▕ ▕  |  ▕ ▕
▕____╱    ‾    ╲___▕       █ █   ▕█      ╲__╱ |  ▕  ╲__▕ ▕  |  ▕  ╲__╱
 ____    ___   ___                                  ___╱
▕    ╲  ╱   ╲ ▕    ╲
▕    ▕ ▕    ▕ ▕    ▕
▕____╱ ▕____▕ ▕____▕

WP Engine Shell - PHP 7.3
Obtenir le statut de toutes les jails fail2ban photo

Obtenir le statut de toutes les jails fail2ban

fail2ban jails 1280x853

Si vous utilisez fail2ban sur votre serveur dédié – et vous devriez! – il peut être vraiment utile de lister les statuts de toutes les jails fail2ban.

Cela permet de voir quelles sont les jails actives et de vérifier qu’il n’y a aucun problème de configuration.

On peut obtenir le statuts de toutes les jails fail2ban avec la commande suivante:

fail2ban-client status | sed -n 's/,//g;s/.*Jail list://p' | xargs -n1 fail2ban-client statusCode language: JavaScript (javascript)

Voici un exemple de résultat de la commande:

Status for the jail: pam-generic
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:
Status for the jail: postfix
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	4482
|  `- File list:	/var/log/mail.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	223
   `- Banned IP list:
Status for the jail: sasl
|- Filter
|  |- Currently failed:	4
|  |- Total failed:	14126
|  `- File list:	/var/log/mail.log
`- Actions
   |- Currently banned:	4
   |- Total banned:	1927
   `- Banned IP list:	45.148.10.70 46.38.144.17 46.38.144.202 46.38.144.32
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:Code language: PHP (php)

A garder dans sa trousse à outils!

MySQL: résoudre l'erreur "Incorrect datetime value" lors d'opérations sur les tables photo

MySQL: résoudre l’erreur “Incorrect datetime value” lors d’opérations sur les tables

mysql logo compressor 1280x662

Depuis le passage du site sur le nouveau serveur, ORION, j’utilise MySQL 8 en lieu et place de MariaDB, histoire de tester les les gains de performance.

Or, avec la nouvelle configuration de MySQL par défaut, vous pouvez obtenir cette erreur lors de simples opération de maintenance comme l’optimisation des tables:

example.wp_comments: Table does not support optimize, doing recreate + analyze instead
example.wp_comments: Invalid default value for 'comment_date'
example.wp_comments: Operation failed
example.wp_et_social_stats: Incorrect datetime value: '0000-00-00 00:00:00' for column 'comment_date' at row 1
example.wp_et_social_stats: Invalid default value for 'comment_date'
example.wp_et_social_stats: Table does not support optimize, doing recreate + analyze instead
example.wp_et_social_stats: Invalid default value for 'sharing_date'
example.wp_et_social_stats: Operation failedCode language: JavaScript (javascript)

Cela est dû à un changement de configuration, notamment dans la directive sql_mode depuis MySQL 5.7.

Voyons-donc ce que contient la directive par défaut. Identifiez-vous sur le serveur MySQL:

mysql -u root -p

Puis vérifiez le contenu de la variable de configuration sql_mode:

show variables like 'sql_mode';Code language: JavaScript (javascript)

Résultat:

+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                 |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)Code language: JavaScript (javascript)

Ce qui pose problème, ce sont ces deux directives: NO_ZERO_IN_DATE et NO_ZERO_DATE.

Deux solutions s’offrent à nous : éditer la valeur directement depuis la console mysql ou alors depuis le fichier de configuration my.cnf.

Méthode 1 : éditer la valeur de sql_mode depuis la console MySQL

Si vous vous trouvez toujours dans la console mysql, vous pouvez lancer la reqête suivante, qui enlève les drapeaux NO_ZERO_IN_DATE et NO_ZERO_DATE à notre directive sql_mode:

SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';Code language: JavaScript (javascript)

Relancez ensuite le serveur:

service mysql restart

Méthode 2 : éditer la valeur de sql_mode depuis le fichier de configuration MySQL (my.cnf)

Nous allons donc éditer notre fichier de configuration MySQL:

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Et ajouter (ou modifier) la variable de configuration sql_mode en l’amputant des valeurs NO_ZERO_IN_DATE et NO_ZERO_DATE:

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Enregistrez le fichier puis redémarrez le serveur mysql:

service mysql restart

Vous pouvez désormais lancer des requêtes de maintenance ou de modification de la structure des tables de la base de données sans problèmes.

nevez vue du ciel

Névez, vue du ciel

Voici une magnifique vidéo de l’Office de Tourisme de Névez qui nous montre quelques plages et coins entre terre et mer sur la commune de Névez, dans le Finistère:

Entre Quimper et Lorient et plus précisément entre Pont-Aven et Concarneau, Névez, station littorale Sensation Bretagne, est idéalement située.

Elle permet de se poser pour un week-end ou pour un séjour dans un coin adorable, préservé et calme.

Sa situation remarquable permet aussi de découvrir très facilement toutes les richesses du Finistère et de la Bretagne Sud.

Les paysages sont préservés, et très diversifiés, les longues plages de sable fin flirtent avec les criques rocheuses. Eaux turquoise, anses sauvages, petits ports nichés au fond des rias telle est la carte de visite de ce petit coin de paradis finistérien.

Un vrai coin de paradis! <3

PS : petit jeu – saurez-vous retrouver tous les endroits capturés par le drone?

Utiliser Git pour envoyer du code versionné sur Github photo

Utiliser Git pour envoyer du code versionné sur Github

Git – et son homologue Github – permet de versionner votre code afin de pouvoir commenter les changements de code, revenir en arrière et annuler une modification en cas de problème, tenir une feuille de route, accepter des demandes de modifications venant d’autres développeurs (pull requests) et permettre la collaboration de plusieurs personnes sur un même projet.

Voici un petit tuto pour vous donner les commandes essentielles qui permettent de créer le dépôt, ajouter du code et l’envoyer sur Github.

Installation de Git

Commençons par l’étape obligatoire qui est l’installation de Git sur votre système d’exploitation:

MacOSX : résoudre l’erreur xcrun: error: invalid active developer path

Sous MacOSX, lorsque vous lancez une commande git, vous pouvez obtenir le message d’erreur suivant:

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrunCode language: JavaScript (javascript)

Cela signifie qu’il vous manque les outils de développement XCode. Cela peut arriver après chaque mise à jour d’OSX donc vous pouvez les installer avec:

sudo rm /Library/Developer/CommandLineTools -rf
sudo xcode-select --install

Créer un nouveau dépôt Git et l’associer à votre dépôt GitHub

Placez-vous dans le répertoire qui contient votre code. On crée un nouveau dépôt Git avec:

git init

Cela initialise votre répertoire avec les dossiers cachés de git. On ajoute maintenant l’adresse de notre dépôt sur GitHub:

git remote add origin https://github.com/example/example-projectCode language: JavaScript (javascript)

Nous allons maintenant pouvoir ajouter notre code.

Ajouter et valider votre code

Pour ajouter des fichiers, on utilise la directive add:

git add *
git add <filename>Code language: HTML, XML (xml)

Ensuite, on valide avec un message qui explique la validation des changements:

git commit -m "Ajout des fichiers du projet"Code language: JavaScript (javascript)

A ce stade, le fichier est dans le HEAD de git, mais pas encore dans votre dépôt distant. On l’envoie donc sur GitHub avec:

git push origin master

Pour mettre à jour votre dépôt local vers les dernières validations qui se trouvent sur GitHub (attention, cela écrase les fichiers locaux!), exécutez la commande:

git pull

Voilà, c’est un petit mémo simple mais il permet déjà de se servir des principales fonctions de git.

jQuery : sélectionner un élément dont l'ID ou la classe commence ou finit par une chaîne photo 1

jQuery : sélectionner un élément dont l’ID ou la classe commence ou finit par une chaîne

Il peut arriver que l’on ait besoin de sélectionner un élément dont l’ID ou la classe commence ou finit par un nom défini, pour pouvoir le modifier ou le manipuler.

Évidemment, si il possède un ID ou une classe bien défini, on utilisera son ID ou sa classe. Par contre, si aucune classe n’est définie par exemple, il faudra utiliser une expression régulière (regex).

On peut faire cela très simplement avec jQuery.

Sélectionner tous les éléments dont l’ID commence par toto_

Prenons un petit exemple, nous allons chercher à sélectionner tous les élements dont l’ID commence par toto_:

jQuery('[id^=toto_')Code language: JavaScript (javascript)

Le signe ^ signifie que l’on se place en début de chaîne dans l’expression régulière. Ensuite, il suffit d’indiquer la chaîne à chercher, c’est-à-dire toto_ dans notre cas.

S’il s’agit d’un champs de formulaire <input>, on trouvera donc:

<input id="toto_01" type="number" />
<input id="toto_02" type="number" />
<input id="toto_03" type="number" />Code language: HTML, XML (xml)

Sélectionner tous les éléments dont l’ID finit par _toto

Cherchons maintenant à sélectionner tous les éléments dont l’ID finit par _toto:

jQuery('[id$=_toto')Code language: JavaScript (javascript)

Cette fois, on utilise l’argument $, qui signifie la fin d’une chaîne de caractères.

Exemple concret : remplacer le type de tous les champs de formulaire dont l’ID finit par -money

J’ai récemment eu à modifier le comportement d’une page de réglages d’un plugin pour WooCommerce.

En substance, les champs étaient de type number, ce qui est problématique car ils ne permettent que des nombres entiers. Or, s’agissant d’un système de conversion de devises, il était primordial d’avoir accès à des nombres flottants, avec des virgules.

La solution est de cibler tous les champs finissant par -moneyet d’en changer le type de number à text, ce qui se fait très facilement avec la requête suivante:

jQuery('[id$=-money]').attr('type', 'text');Code language: JavaScript (javascript)

Et si l’on veut cibler les classes?

Dans les exemples précédents, il suffit de remplacer le mot id par le mot class.

Flipsyde - Someday photo

Flipsyde – Someday

[Chorus]
Someday we gonna rise up on that wind you know
Someday we gonna dance with those lions
Someday we gonna break free from these chains and keep on flyin’

[Verse 1]
They tellin’ me it’s all good just wait
You know you’re gonna be there someday
Sippin’ on Jim Beam ok
Gotta get these things one day
Till then do another line you know
Searching for that other high
Stop or I gotta steal then steal
Kill or I’m gonna be killed
I got a sack in my pocket
Conscious yellin’ drop it
You know we’re gonna lose it someday
And we tryin’ to hold it all together but the devil is too clever so
I’m gonna die you gonna die we gonna die Someday one day I said

[Chorus]
Someday we gonna rise up on the wind you know
Someday we gonna dance with those lions
Someday we gonna break free from these chains and keep on flyin’

[Verse 2]
Try to lie but it ain’t me Ain’t me
Try to look but I can’t see
Can’t stop right now cause I’m too far and I can’t keep goin’ cause it’s too hard
In the day in the night it’s the same thing
On the field on the block it’s the same game
On the real if you stop then it’s no pain but if you can’t feel pain then it’s no gain
Rearrange and you change and it’s all bad and you try to maintain but you fall back
And you crawl and you slip and you slide down
Wanna make it to the top better start now
So I hold my soul and I die hard
All alone in the night in the graveyard
Someday one day I’m gonna be free and they won’t try to kill me for being me
Hey someday

[Chorus]
Someday we gonna rise up on that wind you know
Someday we gonna dance with those lions
Someday we gonna break free from these chains and keep on flyin’

If you know how this is
Gonna see it’s not that easy
Don’t stop get it till it’s done
From where you are or have begun
I said keep on try a little harder to see everything you need to be
Believe in your dreams
That you see when you’re asleep

[Chorus]
Someday we gonna rise up on that wind you know
Someday we gonna dance with those lions
Someday we gonna break free from these chains and keep on flyin’