Jethro Tull - Aqualung photo

Local : importer une base de données depuis le shell

Local possède une version d’Adminer dans les options de chaque site qui est très utile puisqu’elle permet d’accéder rapidement à la base de données, ou d’importer une petite base de données.

Par contre, s’il s’agit d’importer une base qui fait plus de 80 Mo, mieux vaut se tourner vers un outil un peu plus robuste: le shell.

Accéder au shell depuis Local

Et cela tombe bien : Local possède son propre shell, accessible sur simple clic-droit sur le nom du site sur lequel vous souhaitez ouvrir une fenêtre de terminal:

local open site shell new 1280x787

Voici la marche à suivre : Démarrez votre site > sélectionnez le nom du site > clic-droit > Open Site Shell

Importer une base de données dans un site Local

Lorsque j’ai besoin de répliquer un site rapidement, je copie la base données dans le répertoire app du site Local en question.

Pour mon site de test (skyminds-2020 ), le chemin sur ma machine est /Users/matt/Local Sites/skyminds2020/app . C’est dans ce dossier que je place le fichier SQL à importer.

Ensuite, dans le shell Local, il suffit de faire un simple import SQL dans la base qui, par défaut, s’appelle local (et ce, pour tous vos sites Local, bien qu’elles soient toutes indépendantes).

L’utilisateur est root et le mot de passe root également, ce qui est plutôt pratique.

Le shell est par défaut sous app/public donc on remonte d’un cran dans l’arborescence pour pointer vers notre fichier (qui se trouve dans /app ).

Voilà ce que cela nous donne:

mysql -u root -proot local < ../db.sql

Résultat:

mysql: [Warning] Using a password on the command line interface can be insecure.
bash-3.2$Code language: HTTP (http)

L’importation de la base de données SQL ne prend que quelques secondes, alors que cela se plante allégrement lorsque l’on utilise Adminer.

A utiliser sans modération, cela ne vaut vraiment pas le coup de s’embêter avec une interface graphique (ou à placer le fichier dans le répertoire d’adminer comme il l’indique sur la page d’importation).

WordPress: retirer l'option de supprimer les plugins dans l'interface d'administration photo

WordPress: retirer l’option de supprimer les extensions dans l’interface d’administration

C’est assez rare comme demande mais je me suis exécuté : comment faire pour retirer le lien qui permet de supprimer les extensions désactivées dans l’interface d’administration, même si l’on est administrateur ?

Et bien c’est assez simple, il suffit de filtrer le tableau des liens. Voici deux exemples simples pour mettre cela en place.

Retirer le lien de suppression pour toutes les extensions

Voici le code qui vous permet de retirer le lien “Supprimer” qui se trouve en dessous de chaque extension sur la page Extensions:

<?php
/*
Plugin Name: Disable Plugin Deletion
Plugin URI: https://www.skyminds.net/wordpress-retirer-option-supprimer-extensions/
Description: Disable all plugins' deletion links on the plugins page.
Version: 1.0
Author: Matt Biscay
Author URI: https://mattbiscay.com
*/
add_filter( 'plugin_action_links', 'sky_disable_plugin_deletion', 10, 4 );
function sky_disable_plugin_deletion( $actions, $plugin_file, $plugin_data, $context ) {
  // Remove delete link for all installed plugins         
  unset( $actions['delete'] );     
  return $actions;
} Code language: HTML, XML (xml)

Retirer le lien de suppression pour des extensions spécifiques

Voici le code qui vous permet de retirer le lien “Supprimer” qui se trouve en dessous des extensions dont vous spécifiez le chemin (dossier et nom du fichier de l’extension à charger) sur la page Extensions:

<?php
 /*
 Plugin Name: Disable Plugin Deletion
 Plugin URI: https://www.skyminds.net/wordpress-retirer-option-supprimer-extensions/
 Description: Disable all plugins' deletion links on the plugins page.
 Version: 1.0
 Author: Matt Biscay
 Author URI: https://mattbiscay.com
 */
 add_filter( 'plugin_action_links', 'sky_disable_plugin_deletion_selected', 10, 4 );
 function sky_disable_plugin_deletion_selected( $actions, $plugin_file, $plugin_data, $context ) {
   // Remove delete link for specific plugins
   if ( array_key_exists( 'delete', $actions ) && in_array( $plugin_file,
   [
     'akismet/akismet.php',
     'redirection/redirection.php',
   ]
   ) ) {
     unset( $actions['delete'] );
   }
   return $actions;
 }Code language: HTML, XML (xml)

Dans ce dernier snippet, pensez à modifier le nom du répertoire et celui du plugin de manière à ce qu’ils coïncident avec les plugins qui ne doivent pas être supprimés.

A l’origine, c’était pour un de mes clients pour éviter que ses collaborateurs ne suppriment des plugins par inadvertance.

Je m’en sers également sous LocalWP pour éviter de supprimer un plugin en cours de développement – on ne sait jamais !

Installation de Nextcloud: votre propre service de cloud chez vous photo 1

Installation de Nextcloud: votre propre service de cloud chez vous

Cela fait quelques temps que j’utilise une instance Nextcloud sur le serveur. Cela vous permet de créer votre propre service de cloud: vous gérez vous-mêmes vos données (images, documents, fichiers…) sans passer par un service tiers.

Vous gardez donc entièrement la main sur vos données : plus besoin de Google Drive ou Dropbox (ou autre), c’est vous qui gérez. Nextcloud possède même ses applications mobiles pour pouvoir accéder à vos données à tout moment, sur tous supports.

Ce tutoriel est réalisé sous Ubuntu Server mais il est facilement transposable à votre système d’exploitation sous Linux.

Installation de Nextcloud

Voici les paquets PHP nécessaires pour installer Nextcloud:

  • PHP (7.2, 7.3 or 7.4)
  • PHP module ctype
  • PHP module curl
  • PHP module dom
  • PHP module GD
  • PHP module hash (only on FreeBSD)
  • PHP module iconv
  • PHP module JSON
  • PHP module libxml (Linux package libxml2 must be >=2.7.0)
  • PHP module mbstring
  • PHP module openssl
  • PHP module posix
  • PHP module session
  • PHP module SimpleXML
  • PHP module XMLReader
  • PHP module XMLWriter
  • PHP module zip
  • PHP module zlib

Nextcloud est maintenant capable de tourner sous PHP 7.4 donc vous pouvez installer les paquets PHP qui lui sont nécessaires:

apt install php7.4 php7.4-cli php7.4-gd php7.4-imap php7.4-mysql php7.4-soap php7.4-apcu php7.4-common php7.4-gmp  php7.4-intl php7.4-opcache php7.4-xml php7.4-apcu-bc php7.4-curl php7.4-igbinary php7.4-json php7.4-readline  php7.4-zip php7.4-bcmath php7.4-fpm php7.4-imagick php7.4-mbstring php7.4-redisCode language: CSS (css)

On télécharge Nextcloud, depuis la page Téléchargement ou via la ligne de commande:

wget https://download.nextcloud.com/server/releases/nextcloud-22.0.0.zipCode language: JavaScript (javascript)

On décompresse l’archive:

unzip nextcloud-22.0.0.zipCode language: CSS (css)

Et on déplace ensuite le répertoire dans un dossier public lisible par le serveur de fichiers:

mv nextcloud /var/www/html/Code language: JavaScript (javascript)

et on lui donne ensuite les bonnes permissions:

chown -R www-data:www-data /var/www/html/nextcloudCode language: JavaScript (javascript)

Lire la suite

Jethro Tull - Aqualung photo

Local : résoudre l’erreur “missing zlib extensions”

A la suite d’une mise à jour de Local, j’ai eu la surprise d’obtenir le message d’erreur suivant au moment d’installer un plugin manuellement, par upload du fichier zip:

Unpacking the packageAbort class-pclzip.php : 
Missing zlib extensionsCode language: CSS (css)

Toutes les machines docker fonctionnent sous PHP 7.4.1 et cela ne s’était jamais produit auparavant. Local est installé sur ma machine MacOS.

Si cela vous arrive, voici comment régler le problème en quelques minutes.

Marche à suivre pour Local (MacOS)

Ce sont les Lightning Services qu’il faut mettre à jour: comme ils ne peuvent être mis à jour via l’auto-updater, nous allons devoir les supprimer et les réinstaller pour notre version de PHP.

1. Quittez Local si le programme est en cours d’utilisation.

2. Dans le terminal, lancez la commande suivante:

rm ~/Library/Application\ Support/Local/lightning-services/php-7.4* -rf Code language: JavaScript (javascript)

Notez que l’on cible ici les versions 7.4.x de PHP.

3. Relancez Local.

4. Ajoutez un nouveau site lambda (j’ai appelé le mien testing mais il pourra être supprimé dès la fin de cette procédure) sous Local qui utilise PHP 7.4. Cela lancera le téléchargement et l’installation des Lightning Services, avec la mise à jour zlib.

5. Lancez maintenant votre site Local, qui tourne sous PHP 7.4 : vous n’avez maintenant plus de problèmes pour installer plugins et thèmes manuellement, avec des fichiers zip.

Et voilà, vous pouvez de nouveau installer des thèmes et plugins manuellement. Cela devrait être corrigé dans une nouvelle version de Local – surtout que PHP 8 vient de sortir il y a quelques semaines.

Vanilla JS : créer des éléments aux couleurs aléatoires photo

Vanilla JS : créer des éléments aux couleurs aléatoires

On a souvent besoin de distinguer des éléments rapidement et c’est très simple de le faire visuellement, avec des couleurs, pour bien différencier les blocs.

Voici une solution simple et élégante pour créer des éléments aux couleurs aléatoires, en utilisant du javascript natif, que l’on appelle Vanilla JS.

Cela devrait vous permettre d’obtenir ceci – des blocs dont la couleur est générée aléatoirement et qui change à chaque rafraichissement de la page.

J’inclus ici un bouton qui permet de rafraîchir aléatoirement les couleurs de notre bloc:

  • Color 1
  • Color 2
  • Color 3
  • Color 4
  • Color 5
  • Color 6

Lire la suite

Réalisation de votre projet web photo

Réalisons votre projet WordPress ou WooCommerce

Nos compétences au service de vos besoins

Stratégie

Nous étudions le parcours de votre site et vos besoins pour vous fournir une solution à long-terme, qui correspond à votre vision.

Développement

Vous souhaitez ajouter de nouvelles fonctionnalités à votre site ou boutique? Nous pouvons coder la solution!

Performance

Votre site doit être rapide et optimisé sur tous supports afin de convertir vos visiteurs. Nous auditons votre site et proposons la solution adaptée.

Hébergement

Vos projets ont besoin d’un hébergement de qualité, c’est la fondation de votre site web et elle doit être solide car c’est sur elle que tout repose.

Maintenance

Votre site a besoin d’une maintenance régulière afin de toujours utiliser la dernière mouture du code et rester sécurisé face aux menaces.

Assistance

Vous avez besoin d’aide ponctuelle? Pas de problème, nous sommes à votre écoute pour vous dépanner rapidement et sereinement.

Lire la suite

CSS: superposer du texte lisible sur une image de fond photo

CSS: superposer du texte lisible sur une image de fond

Il est souvent utile de pouvoir placer du texte sur une image de fond, de manière à ce que l’on puisse lire le texte facilement et distinguer l’image. C’est ce que j’utilise sur le blog pour les images d’illustration des articles.

Nous allons donc superposer du texte lisible sur une image de fond en utilisant uniquement du code HTML et CSS, ce qui nous donne ceci:

Voici une planche à voile

Une image de planche à voile se trouve derrière ce texte.

Vous souhaitez accomplir la même chose? Voici comment faire.

Lire la suite

Analysis of The Handmaid's Tale by Margaret Atwood photo

The Handmaid’s Tale: incipit analysis

We slept in what had once been the gymnasium. The floor was of varnished wood, with stripes and circles painted on it, for the games that were formerly played there; the hoops for the basketball nets were still in place, though the nets were gone. A balcony ran around the room, for the spectators, and I thought I could smell, faintly like an afterimage, the pungent scent of sweat, shot through with the sweet taint of chewing gum and perfume from the watching girls, felt-skirted as I knew from pictures, later in miniskirts, then pants, then in one earring, spiky green-streaked hair. Dances would have been held there; the music lingered, a palimpsest of unheard sound, style upon style, an undercurrent of drums, a forlorn wail, garlands made of tissue-paper flowers, cardboard devils, a revolving ball of mirrors, powdering the dancers with a snow of light.

There was old sex in the room and loneliness, and expectation, of something without a shape or name. I remember that yearning, for something that was always about to happen and was never the same as the hands that were on us there and then, in the small of the back, or out back, in the parking lot, or in the television room with the sound turned down and only the pictures flickering over lifting flesh.

We yearned for the future. How did we learn it, that talent for insatiability? It was in the air; and it was still in the air, an afterthought, as we tried to sleep, in the army cots that had been set up in rows, with spaces between so we could not talk. We had flannelette sheets, like children’s, and army-issue blankets, old ones that still said U.S. We folded our clothes neatly and laid them on the stools at the ends of the beds. The lights were turned down but not out. Aunt Sara and Aunt Elizabeth patrolled; they had electric cattle prods slung on thongs from their leather belts.

No guns though, even they could not be trusted with guns. Guns were for the guards, specially picked from the Angels. The guards weren’t allowed inside the building except when called, and we weren’t allowed out, except for our walks, twice daily, two by two around the football field, which was enclosed now by a chain-link fence topped with barbed wire. The Angels stood outside it with their backs to us. They were objects of fear to us, but of something else as well. If only they would look. If only we could talk to them. Something could be exchanged, we thought, some deal made, some tradeoff, we still had our bodies. That was our fantasy.

We learned to whisper almost without sound. In the semidarkness we could stretch out our arms, when the Aunts weren’t looking, and touch each other’s hands across space. We learned to lip-read, our heads flat on the beds, turned sideways, watching each other’s mouths. In this way we exchanged names, from bed to bed:

Alma. Janine. Dolores. Moira. June.

The Handmaid’s Tale, chapter 1.

Setting and Time: a universe of temporal and spatial signs

Contextualisation: space

Semantic fields are understood universally. The gymnasium is a call to universal memory, to the experience of every reader, it’s a cultural sign.

It is reassuring but there are many syntactic breaks: “once”, “formerly”, “though” that show an insistence on the way recognizable signs are manipulated so that they gradually become revised, unrecognizable, and subverted signs.

Sport places (which used to be places of fun, pleasure and bodily activity) are now turned into dormitories (1: “We slept in what had once been the gymnasium.”) or prison yards (31: “the football field which was enclosed now (…) barbed wire.”)

Lire la suite

Serveur dédié : configurer Webmin en TLS avec un certificat SSL photo 1

Solution pour Webmin qui ne veut pas démarrer sous systemd

Je suis tombé sur une drôle d’erreur ce matin sur un VPS de mes clients : après mise à jour du système et redémarrage du serveur, webmin est injoignable et son service ne veut plus démarrer.

Les messages d’erreurs

On commence par lancer un curl distant depuis un autre serveur, histoire de voir si c’est bien injoignable de manière globale, et non propre à notre machine:

curl -I https://example.com:10000/

Résultat:
curl: (7) Failed to connect to example.com port 10000: Connection refusedCode language: JavaScript (javascript)

Pas de doute, cela touche tout le monde. On vérifie donc l’état du service:

systemctl status webmin.serviceCode language: CSS (css)

Résultat:

webmin.service - LSB: web-based administration interface for Unix systems
   Loaded: loaded (/etc/init.d/webmin; generated)
   Active: failed (Result: exit-code) since Sat 2020-09-12 17:35:13 CST; 20s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1803 ExecStart=/etc/init.d/webmin start (code=exited, status=25)

Sep 12 17:35:13 systemd[1]: Starting LSB: web-based administration interface for Unix systems...
Sep 12 17:35:13 systemd[1]: webmin.service: Control process exited, code=exited status=25
Sep 12 17:35:13 systemd[1]: webmin.service: Failed with result 'exit-code'.
Sep 12 17:35:13 systemd[1]: Failed to start LSB: web-based administration interface for Unix systems.Code language: JavaScript (javascript)

Ce n’est pas très loquace! journalctl est plus détaillé:

journalctl -xe

Résultat :

-- All system services necessary queued for starting at boot have been
-- started. Note that this does not mean that the machine is now idle as services
-- might still be busy with completing start-up.
--
-- Kernel start-up required 1709722 microseconds.
--
-- Initial RAM disk start-up required INITRD_USEC microseconds.
--
-- Userspace start-up required 152146335 microseconds.
Sep 12 17:35:13 systemd[1]: Starting LSB: web-based administration interface for Unix systems...
-- Subject: Unit webmin.service has begun start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit webmin.service has begun starting up.
Sep 12 17:35:13 systemd[1]: webmin.service: Control process exited, code=exited status=25
Sep 12 17:35:13 systemd[1]: webmin.service: Failed with result 'exit-code'.
Sep 12 17:35:13 systemd[1]: Failed to start LSB: web-based administration interface for Unix systems.
-- Subject: Unit webmin.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit webmin.service has failed.
--
-- The result is RESULT.Code language: JavaScript (javascript)

Mais nous n’obtenons toujours aucune information exploitable. Redémarrer le service avec service ne permet pas de le redémarrer.

La solution

Le seul moyen de redémarrer le service webmin sur ce VPS a été de la manière suivante:

/etc/init.d/webmin stop
systemctl start webmin

Et là, plus de problème, webmin démarre comme il faut.

Générateur de clés WPA sécurisées photo 1

WiFi : générateur de clés WPA sécurisées

Le principe du chiffrement WPA-PSK

Il y a peu d’intérêt à utiliser les derniers systèmes d’authentification WiFi comme le WPA-PSK si vous utilisez un mot de passe trop facile à deviner et qui pourra être cracké en quelques minutes à peine sans trop d’effort.

Le chiffrement WPA-PSK, censé pallier les failles de son prédécesseur – WEP – est une version moins sécurisée que le WPA puisqu’il n’y a pas de serveur d’identification Radius.

Le protocole repose sur une clé partagée (Pre-Shared Key ou PSK) qui initialise le processus d’authentification.

Votre clé partagée est créée à l’aide d’un mot de passe de votre choix. Il est souhaitable et recommandé que le mot de passe ne contienne aucun mot figurant dans le dictionnaire, même sous une forme leet speak, les logiciels de crack type brute-force ou dictionnaire connaissent cette astuce depuis quelques années déjà.

La combinaison doit donc être illisible, le genre de clé qui est impossible à donner à un correspondant par téléphone.

Autrement dit, si votre mot de passe est un mot courant qui fait partie d’un dictionnaire, il pourra être cracké à l’aide d’une attaque type brute-force ou dictionnaire en moins d’une minute.

Ensuite, il faut augmenter le nombre de caractères de la clé partagée : il est plus facile de trouver un mot de passe de 4 caractères plutôt que de 63 caractères.

D’où l’intérêt d’utiliser un mot de passe de taille conséquente, composé de signes et caractères spéciaux. Cracker une clé de 63 caractères prend quelques années avec la puissance de calcul actuelle.

Générateur de clés WPA sécurisées

J’ai à cet effet créé un générateur de clés WPA sécurisées : il vous suffit de choisir le type de clé qui convient le mieux à votre usage.

Je vous recommande bien évidemment la clé de 63 caractères mais vous avez aussi la possibilité de choisir le nombre de caractères qui vous plait.

Lire la suite

Ajouter un lien avec le nombre d'articles et le total du panier WooCommerce photo

Ajouter un lien avec le nombre d’articles et le total du panier WooCommerce

Rares sont désormais les thèmes WordPress qui n’offrent pas le support de WooCommerce tant l’extension qui propulse aujourd’hui des millions de boutiques en ligne est populaire.

Toutefois, le code de WooCommerce évolue en permanence et certaines fonctions changent de nom ou sont appelées différemment.

Un thème compatible avec WooCommerce 2.6 ne l’était plus avec WooCommerce 3.3 par exemple, lorsque toutes les fonctions relatives au panier sont passées à des fonctions objets.

Montrer le nombre d’articles dans le panier dans le thème

Un client Codeable m’a récemment demandé de mettre à jour son thème, qui n’est plus supporté par son auteur, pour afficher le nombre d’articles dans le panier.

Voici le code à insérer, soit dans un des fichiers de votre thème (header.php est le plus indiqué dans notre cas) ou alors dans un widget HTML:

<a class="cart-custom" href="<?php echo wc_get_cart_url(); ?>" title="<?php _e( 'View your shopping cart' ); ?>"><?php echo sprintf ( _n( '%d item', '%d items', WC()->cart->get_cart_contents_count() ), WC()->cart->get_cart_contents_count() ); ?> - <?php echo WC()->cart->get_cart_total(); ?></a>Code language: HTML, XML (xml)

Lire la suite