Ubuntu logo within an update icon

Ubuntu : résoudre l’erreur “xulrunner-bin: error while loading shared libraries: libhunspell-1.2.so.0”

ubuntu-update

Aujourd’hui, j’ai mis à jour mon installation d’Ubuntu 12.04 LTS (precise) vers la version 14.04 LTS (trusty).

Vu qu’il y a quelques années entre les deux distributions, cela a pris quelques heures mais je trouve le système beaucoup plus réactif. J’ai quand même eu une petite erreur, histoire de justifier cet article.

Problème de dépendances avec le paquet xulrunner

Après l’installation, le nettoyage des paquets obsolètes et un petit redémarrage, apt-get m’a indiqué qu’il y avait un problème de dépendance avec ce message d’erreur :

/var/lib/dpkg/info/xulrunner-1.9.2.prerm: 8: /var/lib/dpkg/info/xulrunner-1.9.2.prerm: /usr/sbin/update-alternatives: not found
/usr/lib/xulrunner-1.9.2.9/xulrunner-bin: error while loading shared libraries: libhunspell-1.2.so.0: cannot open shared object file: No such file or directory
dpkg: error processing xulrunner-1.9.2 (--configure):
 subprocess installed post-installation script returned error exit status 127
Errors were encountered while processing:
 xulrunner-1.9.2
E: Sub-process /usr/bin/dpkg returned an error code (1)Code language: JavaScript (javascript)

Après avoir essayé de réinstaller et supprimer libhunspell et xulrunner sans succès, je me suis dit qu’il fallait passer à autre chose.

La solution : éditer le fichier xulrunner-1.9.2.prerm

En suivant à tâtons les liens du message d’erreur, il se trouve qu’il suffit d’éditer le fichier /var/lib/dpkg/info/xulrunner-1.9.2.prerm pour corriger le problème.

Lire la suite

WordPress : valider le code des meta oEmbeds de YouTube, DailyMotion, Vimeo et SlideShare photo

WordPress : valider le code des meta oEmbeds de YouTube, DailyMotion, Vimeo et SlideShare

Allez, je continue ma petite série sur la gestion de l’intégration oEmbed sous WordPress.

WordPress gère nativement plusieurs services : copiez-collez l’adresse d’une vidéo YouTube dans un article et hop, vous obtenez une vidéo entièrement intégrée, avec un code plutôt propre mais pas entièrement valide.

oembed-all-service

Je vous propose donc de valider le code généré par WordPress lorsqu’il vient de sites tiers comme YouTube, DailyMotion, Vimeo ou SlideShare.

Valider le code oEmbed de YouTube

Il suffit de lancer les quatre requêtes SQL suivantes :

UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" allowfullscreen', 'style="border: none"');
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" allowfullscreen', 'style="border: none"');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, "wmode=transparent' frameborder='0'", "wmode=transparent' style='border: none'");
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, "wmode=transparent' frameborder='0'", "wmode=transparent' style='border: none'");Code language: JavaScript (javascript)

Valider le code oEmbed de Dailymotion

Pour le code de Dailymotion, ces deux requêtes suffisent :

UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'frameborder="0">', 'style="border: none">');
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, 'frameborder="0">', 'style="border: none">');Code language: JavaScript (javascript)

Valider le code oEmbed de Vimeo

Quatre requêtes pour Vimeo :

UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" title=', 'title=');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, ' webkitallowfullscreen mozallowfullscreen allowfullscreen', '');
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" title=', 'title=');
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, ' webkitallowfullscreen mozallowfullscreen allowfullscreen', '');Code language: JavaScript (javascript)

Valider le code oEmbed de SlideShare

Et deux requêtes pour SlideShare :

UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen>', 'style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px;overflow:auto;border:none">');
UPDATE wp_commentmeta SET meta_value = REPLACE (meta_value, 'frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen>', 'style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px;overflow:auto;border:none">');Code language: JavaScript (javascript)

Et voilà, le code est plus propre, plus valide et utilise CSS plutôt que des balises propriétaires.

WordPress : remplacer le vieux code Dailymotion de vos articles par une URL oEmbed photo 1

WordPress : mettre à jour le code Dailymotion

Cet article est le pendant de l’article pour remplacer le vieux code YouTube de vos articles WordPress par une URL oEmbed mais pour Dailymotion.

Voici donc les manipulations à effectuer pour transformer les vieux codes d’intégration avec les URL oEmbed de WordPress.

Nous utilisons toujours le plugin Search Regex pour WordPress avec la case regex activée et le signe dièse (#) comme délimiteur pour les expressions régulières.

Remplacer les liens swf/video de Dailymotion

J’appelle ces liens “swf/video” parce qu’on retrouve cela dans l’URL de l’intégration Flash. Il vaut mieux lancer cette substitution en premier.

On recherche :

#<object data="http://www.dailymotion.com/swf/video/(.*)" width="300" height="150">(.*)</object>#Code language: HTML, XML (xml)

Et on remplace par :

https://www.dailymotion.com/video/$2Code language: JavaScript (javascript)

Remplacer les liens swf de Dailymotion

On s’occupe maintenant des liens qui contiennent juste le terme “swf”.

On recherche :

#<object data="http://www.dailymotion.com/swf/(.*)" width="300" height="150">(.*)</object>#Code language: HTML, XML (xml)

Et on remplace par :

https://www.dailymotion.com/video/$2Code language: JavaScript (javascript)

Voilà, vous venez de nettoyer les anciens codes d’intégration Flash pour les remplacer par des URI oEmbed natives. Propre.

WordPress : remplacer le vieux code YouTube de vos articles par une URL oEmbed photo

WordPress : mettre à jour le code Youtube

Le code des plateformes – vidéos ou autre – évolue et il n’est pas rare de tomber sur de vieux articles qui embarquent un vieux code embed pour afficher des vidéos.

Si votre site a quelques années, il y a plusieurs méthodes d’intégration – plus ou moins optimisées – dont certaines ne s’afficheront pas (celles utilisant le plugin Flash par exemple) sur une tablette ou un smartphone.

youtube

Sur SkyMinds, je me suis dit que ce serait sympa d’avoir un système unifié : toutes les vidéos YouTube seront automatiquement insérées par WordPress en utilisant la méthode native, à savoir oEmbed.

Pour ce faire, j’utilise le plugin Search Regex qui permet d’intervenir facilement sur la base de données pour effectuer des changements en masse, tout en proposant la visualisation des changements avant que ces derniers ne soient appliqués.

Toutes les manipulations sont à effectuer avec Search Regex, en activant la case regex. Je me sers du signe dièse (#) comme délimiteur pour les expressions régulières.

Remplacer le vieux code d’intégration flash de YouTube

Avec Search Regex, on cherche :

<object [^>]*><param name="movie" value="https:\/\/www\.youtube\.com\/v\/([^"&?]+)">.*?<\/object>Code language: HTML, XML (xml)

Et on remplace par :

https://www.youtube.com/watch?v=$1Code language: JavaScript (javascript)

Lire la suite

WordPress : récupérer la liste emails des membres et commentateurs photo

WordPress : récupérer la liste emails des membres et commentateurs

Wordpress icon

Voici deux requêtes SQL pour récupérer la liste des adresses email de tous les utilisateurs d’un site tournant sous WordPress.

Emails des membres

En supposant que le préfixe WordPress est ‘wp_’, cette requête extrait l’adresse email de chaque membre du site :

/* Query name : get members' emails
/* Author : Matt
/* Author URI : https://www.skyminds.net/
*/
SELECT DISTINCT user_email FROM wp_users GROUP BY user_emailCode language: JavaScript (javascript)

Emails des commentateurs

Et cette requête extrait l’adresse email de chaque personne ayant commenté sur le site :

/* Query name : get commenter' emails
/* Author : Matt
/* Author URI : https://www.skyminds.net/
*/
SELECT DISTINCT comment_author_email FROM wp_comments WHERE comment_approved<>'spam' GROUP BY comment_author_emailCode language: JavaScript (javascript)

Astuce SQL : la clause DISTINCT permet d’éviter d’avoir des doublons dans la liste.

Serveur dédié : configurer Postfix et Courier pour utiliser TLS-SSL en Perfect Forward Secrecy photo

Serveur dédié : configurer Postfix et Courier pour utiliser TLS-SSL en Perfect Forward Secrecy

Aujourd’hui, on va s’atteler à sécuriser le serveur de mail, géré par Postfix et Courier, pour utiliser notre certificat SSL et en ajoutant le Perfect Forward Secrecy.

Ce tutoriel part du principe que votre serveur tourne sous Debian et que vous avez suivi le tutoriel précédent sur Postfix avec gestion d’utilisateurs virtuels, c’est-à-dire que le serveur de mail doit déjà être opérationnel.

Vérification du fonctionnement du serveur de mail

On commence par vérifier que le serveur est capable d’envoyer des mails avec :

echo "test" | mail -s testsubject user@example.comCode language: PHP (php)

Si le mail est reçu, passez à l’étape suivante.

Configuration du certificat SSL

Nous allons concaténer la clé et le certificat pour Courier :

cd /etc/ssl
cat skyminds.net.key  skyminds_net.crt >> courier-key-crt-dh.pem

et on va y inclure un échange de clés Diffie-Hellman :

openssl dhparam 2048 >> courier-key-crt-dh.pemCode language: CSS (css)

On ajoute une autre clé DH en 2048 bits:

openssl gendh -out /etc/postfix/dh_2048.pem -2 2048

L’échange de clés Diffie-Hellman – du nom de ses auteurs Whitfield Diffie et Martin Hellman – est une méthode par laquelle deux personnes nommées conventionnellement Alice et Bob peuvent se mettre d’accord sur un nombre (qu’ils peuvent utiliser comme clé pour chiffrer la conversation suivante) sans qu’une troisième personne appelée Ève puisse découvrir le nombre, même en ayant écouté tous leurs échanges. Cela sécurise un peu plus l’échange.

Lire la suite

Linux : résoudre l'erreur SSH

Linux : résoudre l’erreur SSH “the RSA host key differs from the key for the IP address”

ssh

Au cours de mes errements avec le mode rescue, j’ai été obligé de m’identifier sur le serveur avec des identifiants temporaires différents de ceux que j’utilise habituellement.

J’ai retiré la clé habituelle, ajouté la nouvelle (celle du mode rescue), et maintenant, de retour sur ma session habituelle, SSH se plaint – à juste titre – que l’empreinte de la clé RSA du serveur a changé.

Problème : la clé RSA du serveur a changé

Dans ma précipitation à vouloir tout réparer, j’ai ajouté les identifiants temporaires de manière permanente au fichier /home/matt/.ssh/known_hosts.

Et, bien sûr, dès que j’ai voulu me connecter, j’ai obtenu ce message d’erreur :

Warning: the RSA host key for 'hostname' differs from the key for the IP address 'xxx.xxx.xxx.xxx'
Offending key for IP in /home/matt/.ssh/known_hosts:16
Matching host key in /home/matt/.ssh/known_hosts:11
Are you sure you want to continue connecting (yes/no)? Code language: JavaScript (javascript)

Lire la suite

J'ai planté le serveur... ou comment récupérer un serveur Kimsufi après un plantage de kernel avec le mode rescue OVH photo

Récupérer un serveur Kimsufi après un plantage de kernel avec le mode rescue OVH

J’ai lamentablement fait planter le serveur en voulant mettre le kernel à jour…

Heureusement, il existe le mode rescue chez OVH qui permet d’installer un linux provisoire sur le serveur et d’initier une connexion SSH pour que l’on puisse réparer le système.

Si jamais cela vous arrive, voici la marche à suivre.

Passage en mode rescue depuis le manager OVH

lifesaver

1. Aller sur le manager OVH > Dedicated > Infrastructure > clic sur votre serveur > clic sur l’onglet Server Status.

Lire la suite

Linux : installer l'imprimante d'étiquettes WiFi Brother QL-710W et utiliser gLabels pour le publipostage photo 1

Linux : installer l’imprimante d’étiquettes WiFi Brother QL-710W et utiliser gLabels pour le publipostage

J’ai toujours rêvé d’une imprimante d’étiquettes – principalement parce que j’ai la flemme de toujours rechercher sur Google les mêmes adresses parce que je n’ai pas de carnet d’adresse à jour, mais aussi parce que cela fait plus professionnel pour les gens qui reçoivent mes missives.

Après une petite visite sur Amazon, je découvre l’imprimante d’étiquette Brother QL-710W, qui en plus bénéficie d’une offre de remboursement de 50 euros jusqu’à fin décembre 2014. Je me dis que cela pourrait être cool, surtout qu’elle est USB et WiFi.

brother-ql710w

Commandée, reçue le lendemain, déballée, branchée en USB, je me penche maintenant sur la configuration sous Linux.

Installation en USB

Alors, sous Ubuntu, l’imprimante s’installe toute seule. Par contre, sous certaines versions Linux (Linux Mint ou Debian par exemple), il va falloir passer en manuel, en ligne de commandes dans le terminal.

On branche l’imprimante en USB et on l’allume.

On se rend sur la page des pilotes linux de la Brother QL-710W et on y télécharge les deux fichiers suivants : LPR printer driver et CUPSwrapper printer driver.

En voulant lancer l’installation des paquets comme indiqué sur la page du support Brother, j’ai été confronté aux erreurs suivantes :

mkdir: impossible de creer le repertoire "/var/spool/lpd/ql710w": Aucun fichier ou dossier de ce type chown: impossible d'acceder à "/var/spool/lpd/ql710w": Aucun fichier ou dossier de ce type chgrp: impossible d'acceder à "/var/spool/lpd/ql710w": Aucun fichier ou dossier de ce type chmod: impossible d'acceder à "/var/spool/lpd/ql710w": Aucun fichier ou dossier de ce type<Code language: JavaScript (javascript)

Ce qui signifie tout simplement que le répertoire /var/spool/lpd n’existe pas. On s’en assure :

file /var/spool/lpdCode language: JavaScript (javascript)

résultat :

/var/spool/lpd: ERROR: cannot open `/var/spool/lpd' (No such file or directory)Code language: PHP (php)

donc on le crée :

sudo mkdir -p /var/spool/lpdCode language: JavaScript (javascript)

Ensuite, on installe nos deux paquets :

sudo dpkg -i --force-architecture ql710wlpr-1.0.1-1.i386.deb
sudo dpkg -i --force-architecture ql710wcupswrapper-1.0.1-1.i386.debCode language: CSS (css)

Plus d’erreurs, on continue et on vérifie que les pilotes ont été installés et chargés :

dpkg -l | grep Brother

qui nous retourne:

ii  printer-driver-ptouch     1.3-3ubuntu0.1     printer driver Brother P-touch label printers
ii  ql710wcupswrapper:i386     1.0.1-1     Brother CUPS PTouch Printer Definitions
ii  ql710wlpr:i386     1.0.1-1     Brother lpr Ptouch Printer DefinitionsCode language: CSS (css)

À ce stade l’imprimante est quasiment installée, il suffit de se rendre sur la page d’administration de CUPS, à l’adresse http://localhost:631 et de cliquer sur Admin > Add Printer > Local Printer et on se laisse guider.

Amazon Prime Video

Lire la suite

Serveur dédié : passage au mod FastCGI et PHP-FPM avec Apache MPM Worker photo

Serveur dédié : passage au mod FastCGI et PHP-FPM avec Apache MPM Worker

Aujourd’hui, j’ai changé la manière dont Apache et PHP interagissent ensemble.

Concrètement, au lieu d’utiliser la configuration par défaut du serveur Apache, c’est-à-dire le module mod_php par défaut, le serveur utilisera dorénavant mod_fastcgi (fastcgi) avec PHP-FPM (FastCGI Process Manager).

PHP : mod_php vs mod_fastcgi

La raison principale pour laquelle mod_php utilise plus de ressources réside dans le fait que le module est chargé par le serveur même lors de requêtes pour des fichiers autres que PHP, comme des fichiers HTML ou des fichiers JavaScript.

debian-apache-php-fpm

FastCGI Process Manager (PHP-FPM) aide à réduire l’addition des ressources système utilisées en forçant le serveur à agir comme un proxy et à ne passer que les fichiers portant l’extension php à PHP-FPM.

Ce tutoriel assume que vous avez une installation Apache/PHP sous Debian qui tourne sous mod_php, c’est-à-dire une installation standard. Les changements prennent moins de 15 minutes.

Objectifs : gagner en rapidité d’exécution et avoir une installation plus légère. On peut ainsi envisager un jour de changer Apache pour un autre serveur tout en gardant la même configuration PHP.

Lire la suite

Pack de correctifs post-SP3 photo

Pack de correctifs post-SP3

Je vous annonce la fin du pack de correctifs post-SP3 pour Windows XP.

Historiquement, le pack a géré toutes les mises à jour de Windows XP de niveau Critique et Important depuis la sortie du SP3 en mai 2008.

Les mises à jour obsolètes – remplacées par des correctifs plus récentes – sont retirées grâce à des fichiers batch. [no_toc]

Les raisons de la fin du pack

Je n’utilise plus Windows XP depuis 2009 et j’ai de plus en plus de mal à trouver le temps pour le mettre à jour. Il n’existe plus sur mon système que sur une machine virtuelle VirtualBox qui tourne sous Linux.

De plus, de moins en moins d’applications vont continuer de supporter XP donc avec le temps, il ne sera plus possible de mettre les applications à jour. La dernière version de FileZilla, par exemple, n’est plus compatible avec XP.

C’est dommage car Windows XP est l’un des systèmes d’exploitation qui a connu une longévité assez exceptionnelle. Il restera pour beaucoup d’entre nous un bon OS mais il est temps de migrer vers d’autres OS, plus sécurisés et maintenus plus régulièrement.

Lire la suite

PHP : résoudre l'erreur

PHP : résoudre l’erreur Apache “child pid xxxx exit signal Segmentation fault (11)”

php-logo

J’ai découvert dernièrement qu’après une mise à jour du module php-apc, mes logs Apache étaient emplis de message d’erreur comme ceux-ci :

[Sun Nov 02 09:15:11 2014] [notice] child pid 5937 exit signal Segmentation fault (11)
[Sun Nov 02 09:17:36 2014] [notice] child pid 5586 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:50 2014] [notice] child pid 6230 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:51 2014] [notice] child pid 6388 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:52 2014] [notice] child pid 6228 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:53 2014] [notice] child pid 6235 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:54 2014] [notice] child pid 6392 exit signal Segmentation fault (11)
[Sun Nov 02 09:21:55 2014] [notice] child pid 6385 exit signal Segmentation fault (11)Code language: CSS (css)

Cela en fait des erreurs !

Augmenter la taille de la limite de mémoire PHP

Sur le serveur, APC est configuré pour utiliser un unique segment de 128 Mo. Le problème, c’est que la directive memory_limit de PHP est elle aussi à 128 Mo. Par conséquent, il convient d’augmenter cette dernière :

1. On édite notre fichier de configuration PHP :

nano /etc/php5/apache2/php.ini

2. On recherche (Ctrl + w) le mot clé memory_limit et on remplace:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/manual/en/ini.core.php#ini.memory-limit
memory_limit = -1Code language: JavaScript (javascript)

par

; Maximum amount of memory a script may consume (128MB)
; http://php.net/manual/en/ini.core.php#ini.memory-limit
; memory_limit = -1
memory_limit = 256MCode language: JavaScript (javascript)

3. On enregistre la nouvelle configuration et on relance Apache :

service apache2 restart

Vérifiez maintenant les logs Apache. Cela peut ne pas être suffisant.

Désinstaller APC

Dans mon cas, avec PHP 5.4.x, APC semble générer ces erreurs de manière aléatoire. J’ai donc désactivé APC avec :

apt-get remove php5-apcCode language: JavaScript (javascript)

Après relance du serveur Apache et analyse des logs, la situation est revenue à la normale :

Apache PHP/5.4.34 configured -- resuming normal operations

Le problème viendrait donc d’APC et de PHP 5.4 – il est important de noter que PHP 5.5 contient déjà un optimiseur de code intégré (Zend) donc à la prochaine mise à jour majeure de PHP, il sera inutile d’installer APC.