Voici un mashup par Thriftshop XL qui mixe deux chansons: “In a World Gone Mad” par les Beastie Boys et “Where is My Mind?” des Pixies:
Et bien cela rend très bien !
Voici un mashup par Thriftshop XL qui mixe deux chansons: “In a World Gone Mad” par les Beastie Boys et “Where is My Mind?” des Pixies:
Et bien cela rend très bien !
J’utilise quotidiennement Local by Flywheel pour développer ou debugger des problèmes sur certains sites.
C’est une bonne alternative lorsque les hébergeurs ne proposent pas de site staging à leurs clients (les meilleurs hébergeurs proposent évidemment un staging, c’est la base).
L’autre jour, tournée de mises à jour suivie d’un reboot, je lance Local et patatras: il ne veut plus démarrer et visiblement reste bloqué sur une tentative de renouvellement de certificat TLS pour la machine virtuelle qui tourne sous Docker.
Si cela vous arrive, voici la marche à suivre. Il suffit de copier ces lignes d’instructions dans votre terminal. Concrètement, nous allons télécharger une nouvelle version du fichier ISO Boot2Docker et laisser le système se ré-provisionner.
Le processus implique de créer un alias (local-docker-machine
) pour la machine virtuelle docker “Local by Flywheel”, et ensuite de lancer la série de commandes suivantes sur cet alias.
Voici les commandes à lancer dans le terminal:
alias local-docker-machine="/Applications/Local\ by\ Flywheel.app/Contents/Resources/extraResources/virtual-machine/vendor/docker/osx/docker-machine"
local-docker-machine stop local-by-flywheel
rm -rf ~/.docker/machine/certs
local-docker-machine create local-cert-gen
local-docker-machine start local-by-flywheel
local-docker-machine regenerate-certs -f local-by-flywheel
local-docker-machine rm -f local-cert-gen
Code language: JavaScript (javascript)
Voici le résultat de ces commandes:
Creating CA: /Users/matt/.docker/machine/certs/ca.pem
Creating client certificate: /Users/matt/.docker/machine/certs/cert.pem
Running pre-create checks...
(local-cert-gen) No default Boot2Docker ISO found locally, downloading the latest release...
(local-cert-gen) Latest release for github.com/boot2docker/boot2docker is v19.03.5
(local-cert-gen) Downloading /Users/matt/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.5/boot2docker.iso...
(local-cert-gen) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(local-cert-gen) Copying /Users/matt/.docker/machine/cache/boot2docker.iso to /Users/matt/.docker/machine/machines/local-cert-gen/boot2docker.iso...
(local-cert-gen) Creating VirtualBox VM...
(local-cert-gen) Creating SSH key...
(local-cert-gen) Starting the VM...
(local-cert-gen) Check network to re-create if needed...
(local-cert-gen) Found a new host-only adapter: "vboxnet1"
(local-cert-gen) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: /Applications/Local by Flywheel.app/Contents/Resources/extraResources/virtual-machine/vendor/docker/osx/docker-machine env local-cert-gen
Docker machine "local-by-flywheel" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
Regenerating TLS certificates
Docker machine "local-by-flywheel" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
About to remove local-cert-gen
WARNING: This action will delete both local reference and remote instance.
Successfully removed local-cert-gen
Code language: JavaScript (javascript)
Vous n’avez plus qu’à lancer Local by Flywheel: lancement maintenant impeccable et toutes les machines virtuelles sont bien là.
jQuery possède une limitation qui peut s’avérer très gênante : on ne peut ajouter !important
à une propriété CSS en utilisant un script jQuery.
Par exemple, ceci ne fonctionnera pas:
jQuery('.foo').css('border', '4px #000 solid !important');
Code language: JavaScript (javascript)
alors que cette déclaration sera bien appliquée:
jQuery('.foo').css('border', '4px #000 solid');
Code language: JavaScript (javascript)
Pour contourner cette limitation, je vous propose plusieurs solutions.
C’est probablement la solution la plus simple : il suffit d’ajouter une classe votre élément avec addClass()
, puis de définir le code CSS relatif à cette classe.
Exemple:
jQuery('.foo').addClass('border-black');
Code language: JavaScript (javascript)
et on ajoute le code CSS suivant:
.border-black{
border: 4px #000 solid !important;
}
Code language: CSS (css)
Une autre solution est d’utiliser la fonction attr()
, avec une concaténation pour garder le style CSS inline s’il est déjà présent:
jQuery('.foo').attr('style', function(i,s) { return (s || '') + 'border:4px #000 solid !important;' });
Code language: JavaScript (javascript)
Toujours en utilisant la concaténation pour garder les styles inline existants, nous utilisons la propriété cssText
de la fonction css()
:
jQuery('.foo').css('cssText', jQuery('.foo').css('cssText')+'border: 4px #000 solid !important');
Code language: JavaScript (javascript)
Ce n’est pas parce que l’on utilise jQuery que nous devons oublier le vanilla JavaScript.
En l’occurrence, JS offre nativement la fonction style.setProperty()
qui nous permet d’appliquer notre style aisément:
jQuery('.foo').each(function(){
this.style.setProperty( 'border', '4px #000 solid', 'important' );
});
Code language: JavaScript (javascript)
Have fun!
Ces derniers temps, il n’est pas rare de constater que le serveur DNS de Free, utilisés par la Freebox, ne permettent plus de consulter certains sites. Or, l’utilisation d’un VPN permet d’accéder à ces sites sans problèmes.
Il est donc temps de changer l’adresse des serveurs DNS de la Freebox, on ne peut décemment pas utiliser un internet bridé par un tiers sans notre consentement.
Voici la marche à suivre, cela prend environ 1 minute à modifier. Nous allons utiliser les serveurs DNS de Cloudflare pour cet article:
Rendez-vous dans la console Freebox sur http://mafreebox.free.fr
Identifiez-vous.
Rendez-vous dans Paramètres de la Freebox > DHCP.
En serveur DNS1, mettez 1.1.1.1
En serveur DNS2, mettez 1.0.0.1
En serveur DNS3, gardez le DNS de Free en redondance: 192.168.0.254
Appliquez les changements pour sauvegarder la nouvelle configuration.
Voici ce que cela donne en image:
Une autre alternative est d’utiliser les DNS de Quad9:
DNS1: 9.9.9.9
DNS2: 149.112.112.112
Et voilà, les sites auparavant bloqués sont désormais accessibles.
Dernièrement, je suis tombé sur un os lors du renouvelement d’un certificat Let’s Encrypt d’un site qui tourne sur un serveur avec Plesk.
Il se trouve que le renouvellement était tout simplement impossible à cause d’une erreur 400 Bad Request:
Attempting to renew cert (example.com) from /etc/letsencrypt/renewal/example.com.conf produced an unexpected error: Failed authorization procedure. www.example.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://www.example.com/.well-known/acme-challenge/2VQAX5eA_dSyl1RB5MjfcHr9YinF8T7nw3Z6OxU5Zu4: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>400 Bad Request</title>\n</head><body>\n<h1>Bad Request</h1", example.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://example.com/.well-known/acme-challenge/e4Y1e16A6e3czI1106dJiz6BMqsKjJxz21XaqvrHLZQ: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>400 Bad Request</title>\n</head><body>\n<h1>Bad Request</h1". Skipping.
Code language: HTML, XML (xml)
Après avoir passé pas mal de temps à auditer le site, les .htaccess, la configuration du serveur… il se trouve que la solution est très simple – mais encore faut-il le savoir car cela n’est marqué nulle part!
Sous Plesk:
1. rendez-vous dans le workspace du site en question.
2. cliquez sur SSL/TLS certificates.
3. décochez la case Redirect from http to https:
Relancez maintenant le renouvellement du certificat Let’s Encrypt. Il devrait maintenant se renouveler sans aucun problème.
Here’s HONEYHONEY performing “Thin Line” at Music City Roots live from the Loveless Cafe in 2012:
Thin line
Walking a thin line
Staying out late at night
I’m not happy
Feeling low
It’s so hard these days to play my cards right
It’s about time
To start the show
I got tickets for my friends that want to go
And I wish you’d come down
Just come on by
Oh, I need your easy roll around of a good time
‘Cause I want whiskey when I’m sick
And a man when I’m well
But it’s nice to have them both sometimes
When I feel like raising hell
So don’t try and save me
I’ll be just fine
I’m getting used to walking on a thin line
Some days I try hard
To watch my mouth
To say the right things
But the wrong just slip right out
Oh, I ain’t no Southern belle
No Georgia peach
I guess all my good graces are too far out of reach
I sleep so deep each night
I’m lying in the bed we made
And when I get you off, babe
Well you know it’s give and take
So I don’t feel bad
When I get mine
Oh, I’m getting used to walking on a thin line
Sometimes I’m doing things half-ass wrong
Sometimes the words I sing are just some half-ass song
I get lost and I get found
Oh, and I’ll be good until I need another round
‘Cause I want whiskey when I’m sick
And a man when I’m well
But it’s nice to have them both sometimes
When I feel like raising hell
So don’t try and save me
I’ll be just fine
Oh, I’m getting used to walking on a thin line
No, don’t try and save me
I’ll be just fine
Oh, I’m getting used to walking on a thin line
Oh, I’m getting used to walking on a thin line
Lister les URLs de tous les articles publiés
J’ai récemment eu besoin de lister toutes les URLs des articles du site, pour les promouvoir sur les réseaux sociaux. L’un des services que j’utilise, SocialBee, permet de soumettre une liste de 100 URLs à chaque soumission du formulaire.
Il nous faut donc une liste d’adresse de 100 articles publiés, ce qui est très facile à obtenir grâce à wp-cli
. Voici la commande que j’ai écrite:
wp post list --field=url --post_status=publish --allow-root --posts_per_page=100 --paged=1
Code language: PHP (php)
Explications:
wp
est un alias de wp-cli
, installé sur le serveurpost
indique l’on va interroger les articleslist
: on va lister!--field=url
: on veut le champ URL--post_status=publish
: les articles publiés uniquement--allow-root
: parce que je suis en root--posts_per_page=100
: le nombre d’article à récupérer--paged=1
: le numéro de la pagination de la requêteIl vous suffit ensuite d’incrémenter la valeur de --paged
pour passer en revue toutes les pages de la requête.
Ou alors retirer totalement les arguments --posts_per_page=100 --paged=1
pour obtenir la liste complète des URLs de tous les articles publiés.
De temps en temps, il faut un peu faire le ménage sur nos disques durs et il est assez utile de chercher à savoir quels sont les dossiers qui prennent le plus d’espace disque.
Sous Linux et MacOS, voici la commande que je lance pour trouver tous les répertoires de plus de 500 Mo, classés par ordre d’importance:
du -m ~/Downloads/* | awk '$1 > 500' | sort -nr
Code language: JavaScript (javascript)
Voici le détail de la commande:
du
signifie disk usage-m
signifie que l’on souhaite la taille en Mo~/Downloads/*
est le chemin dans lequel se trouvent nos gros dossiers, là où se trouvent nos donnéesawk '$1 > 500'
capture le chemin du dossier lorsqu’il dépasse 500 Mosort -nr
permet de classer la liste du plus gros dossier au plus petitUne petite commande à garder sous le coude, cela permet d’éviter de perdre trop de temps à trouver le dossier le plus gourmand du disque!
J’ai récemment joué avec Composer pour Login Redirect Pro et je dois dire que cela simplifie énormément la gestion des dépendances lorsque vous écrivez du code qui fait appel à du code tiers.
Lors du changement de Mac, et après import de mes anciennes données sur la nouvelle machine, j’ai obtenu le message d’erreur suivant:
Composer: file_put_contents(./composer.json): failed to open stream: Permission denied
Code language: HTTP (http)
Si cela vous arrive, il s’agit très probablement d’un problème de droits utilisateur sur le répertoire en question.
Comme j’ai migré mes données d’une machine à l’autre, les droits ne sont pas ceux du nouvel utilisateur de la machine.
Dans le terminal, il vous suffit donc de lancer:
sudo chown -R $USER ~/.composer/
Code language: JavaScript (javascript)
Et voilà, Composer est de nouveau fonctionnel.
Chez l’un de mes clients, nous avons eu besoin de réinitialiser le mot de passe MySQL de l’utilisateur root
, qui a été oublié.
Je vous avais déjà décrit comment réinitialiser le mot de passe root d’un serveur MySQL ou MariaDB sous Ubuntu.
Comme le serveur tourne sous Debian, nous avons un moyen très simple d’avoir accès à la base mysql
pour modifier le mot de passe root
. Cela ne prend que quelques secondes.
Sous les systèmes à base Debian, il existe par défaut un utilisateur nommé debian-sys-maint
, qui se charge de routines de maintenance sur la base SQL et qui possède tous les droits d’administration sur toutes les bases de données.
Il se trouve que le mot de passe de l’utilisateur debian-sys-maint
est visible, en clair dans ce fichier:
nano /etc/mysql/debian.cnf
Copiez le mot de passe. Ensuite, connectez-vous avec debian-sys-maint
au serveur de base de données:
mysql -u debian-sys-maint -p
Vous êtes maintenant connecté au serveur de base de données, en tant qu’administrateur, sous l’utilisateur debian-sys-maint
.
Tous les utilisateurs de la base de données sont stockés dans la base mysql
donc on commence par la sélectionner:
use mysql;
Code language: PHP (php)
Et on peut maintenant changer le mot de passe de l’utilisateur root
avec une simple mise à jour du mot de passe:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('^*p4!_BHLn6Q&xuft*^5tjyby7^_$)d7_fgf&zec8#ExV@xY');
flush privileges;
Code language: JavaScript (javascript)
Il ne reste plus qu’à quitter MySQL monitor:
quit;
Voilà, le mot de passe de l’utilisateur root
est désormais changé. Vous pouvez vous identifier normalement avec le nouveau mot de passe que vous venez de définir plus haut:
mysql -u root -p
Enter password:
Une astuce toujours utile à garder sous le coude!
Sous WordPress 5.3.x et en utilisant wp-cli
, on peut obtenir cette erreur lors de la mise à jour de plugins et thèmes:
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
PHP Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Code language: HTTP (http)
Le tout répété cinq à six fois pour la mise à jour d’un plugin. En regardant le ticket trac qui rapporte ce problème, il s’agit d’une erreur qui était auparavant cachée (avec un @ devant la fonction) et qui est maintenant affichée.
Au -delà du fait de cacher ou ne plus cacher l’erreur, il semble qu’il manque une routine qui vérifie que le lien wp_filesystem
est bien actif avant de pouvoir l’utiliser.
En attendant que cela soit réglé dans une prochaine version de WordPress, voici ce que l’on peut ajouter au fichier wp-config.php
pour se débarrasser de l’erreur proprement:
if ( !defined( 'FS_METHOD' ) ):
define( 'FS_METHOD', 'direct' );
endif;
Code language: PHP (php)
Enregistrez le fichier, problème réglé !