Author

Matt

Browsing
Matt est formateur, développeur expert WordPress et WooCommerce, et administrateur réseau chez Codeable.

Ce matin, nous partons pour l’île de Sifnos. Nous quittons notre logement et prenons le métro pour aller jusqu’au terminus de la ligne 3, le Pirée.

Nous choisissons de prendre le bateau le plus rapide, qui effectue la traversée en quasiment deux fois moins de temps que l’autre. Nous faisons bien car c’est la tempête et cela secoue grandement à l’intérieur… Heureusement, nous avons grignoté un peu avant de partir, ce qui nous évite une belle déconvenue…

Arrivés à Sifnos, nous prenons le bus jusqu’à Apollonia puis un second bus pour rejoindre Kastro, le petit village où se trouve notre logement.

Nous visitons cet entrelacs de ruelles médiévales et déjeunons dans une excellente taverne : la salade grecque composée de légumes locaux est extraordinaire, tout autant que la moussaka.

Sieste, promenade pré-apéritive, notre instinct nous conduit au bar révolutionnaire cubain bien nommé « le Castro ». Pas de tables, mais chacun s’installe à sa guise sur des coussins disposés à terre ou sur des murets. Dans le petit local qui sert de bar, pas de tables non plus, mais un grand comptoir de bois, au coin duquel des dizaines de bouteilles de rhum vides sont amoncelées sur le sol. Des chats errants y vivent aussi. Pauvres petits touristes que nous sommes, nous demandons la carte et le patron nous explique l’air surpris qu’il n’y a pas de carte, mais qu’il nous fera tout ce que nous voudrons. Matt commande une margarita et Cécile, fidèle, une bière. A la première gorgée de son cocktail, Matt manque de s’étouffer, la glotte anesthésiée par la haute teneur en rhum de son breuvage. On peut dire (en chti) qu’il n’y va pas avec le dos de la cuillère!

Ensuite, nous dînons dans les hauteurs de la ville, dans un excellent restaurant qui sert une cuisine traditionnelle et copieuse. La soirée est exquise.

Plage de Vathi

Le lendemain, nous allons à une superbe plage, bien sympathique, qui s’appelle Vathi. Les restaurants sont au bord de l’eau cristalline et les maisons traditionnelles, perchées sur le flanc de la montage, donnent directement sur la baie.

Après l’intense journée vécue hier, nous apprécions ce matin de ne pas mettre de réveil à sonner. Nous allons chercher du pain frais et des biscuits à la boulangerie du coin et prenons notre temps sur la terrasse extérieure de l’appartement. Il fait déjà chaud !

Nous sommes encore indécis quant au programme de la journée et commençons par nous rendre à l’office de tourisme qui se situe près de l’Acropole pour demander des informations concernant les bateaux qui mènent au Pirée, ou à propos des bus pour voyager un peu en Grèce. L’homme qui nous accueille est charmant et répond avec beaucoup d’efficacité à nos questions.

Nous décidons alors du programme de la journée : nous quitterons Athènes pour visiter le Cap Sounion, où se tient un temple dédié à Poséidon, qui surplombe la mer. Il n’y a pas de gare routière unique à Athènes, mais bon nombre de lieux différents desservent les bus. Autant dire qu’il faut vraiment être bien renseigné à l’avance pour ne pas se tromper. Nous traversons donc la ville en métro et à pieds pour nous rendre à la Platia Egyptou, d’où partent les bus en direction du sud de l’Attique.

Deux heures plus tard, nous voici arrivés. Il est assez tard : nous préférons grignoter une salade avant de débuter notre visite. Nous nous installons à la seule taverne des environs et l’apprécions car elle offre une vue imprenable sur le temple et la nourriture est bonne et fraîche.

Se rafraîchir avant la montée.
Se rafraîchir avant la montée.

Le temple de Poséidon se dresse majestueusement à la pointe du cap et surplombe la mer d’un côté et la montagne de l’autre. La vue, mise en valeur par une exceptionnelle luminosité, est splendide.

Ce monument érigé au Vème siècle avant J-C a une particularité : les colonnes qui le constituent sont plus fines en haut qu’en bas, ce qui sert à accentuer l’effet de perspective et les voir plus haut qu’elles ne le sont en réalité. L’effet est réussi !

Nous faisons le tour du temple et descendons sur le petit chemin en contrebas du monument. Sur notre gauche, la mer à perte de vue et sur notre droite, des vestiges d’habitations proches du temple. La chaleur est intense et l’eau turquoise qui nous entoure nous tente vraiment.

Depuis hier, l’Acropole nous regarde depuis le haut de sa colline : il est temps de lui faire une petite visite. C’est donc l’objectif que nous nous fixons pour la journée.

Nous prenons notre temps pour petit déjeuner car nous sommes allés chercher du pain et des petits gâteaux à la boulangerie du coin.

Notre logement est situé à 10 minutes de marche de l’Acropole. Nous nous y rendons tranquillement, en visitant le quartier. Plusieurs centaines de mètres avant l’entrée du site, nous sommes surpris par la foule, avant de nous rendre compte qu’il s’agit de la double file pour acheter des billets d’entrée. Ni une, ni deux, nous changeons nos plans et optons pour la visite du musée archéologique d’Athènes. Cela tombe bien car il fait très chaud et l’idée de faire la queue deux heures au soleil ne nous réjouit guère.

Nous reprenons jusqu’à la station de métro Omonia et marchons jusqu’au musée. Le quartier n’est pas très sécurisant, on se croirait un peu dans Brooklyn.

Le musée est situé dans un grand jardin et l’édifice est composé de 3 ailes. Si l’on veut commencer par l’ordre chronologique, il faut commencer par l’aile qui se trouve devant l’entrée puis à gauche et enfin à droite.

Nous commençons la visite par la première aile dédiée à l’époque mycénienne. Le masque d’Agamemnon est la pièce maîtresse de la collection. Nous sommes également heureux de découvrir des tablettes gravées en linéaire B: il s’agit de caractères antérieurs à l’alphabet des phénicien que les archéologues n’ont pas réussi à déchiffrer avant les années 1955. Ce sont deux cryptologues de l’armée n’ayant rien à voir avec l’archéologie qui ont réussi à percer ce mystère grâce à leurs connaissances dans les chiffres et symboles pendant la seconde guerre mondiale.

Des bijoux toit en or sont aussi exposés ainsi que de nombreux objets de la vie quotidienne.

La seconde aile est consacrée à des statues sculptées en marbre et parfois en bronze. Nous admirons les kouroi et percevons l’évolution de leur représentation au fil des siècles: la connaissance de l’anatomie et l’acquisition de technicités rendent les sculptures de plus en plus précises.

Le clou de l’exposition est sans aucun doute la statue de Zeus porteur de foudre qui est très célèbre.

Nous apprécions aussi les statues de sphinx.

La troisième aile est consacrée à l’époque romaine. En effet, en -207 lors de la bataille de Zama les Romains conquirent la Grèce de manière définitive. Le pays tombe sous la règle romaine et les arts Grecs et Romains fusionnent: les Romains adoptent les techniques sculpturales grecques mais les statues gardent quelques traits typiquement Romains comme le réalisme des coiffures ou du regard qui semble percer l’âme des visiteurs.

Enfin, nous terminons la visite par l’étage supérieur, entièrement consacré à la céramique. Les images de la vie quotidienne, de la guerre, ou de figures sacrées défilent sous nos yeux. Là encore, la précision des traits nous impressionne.

Aujourd’hui, on part pour un voyage de quelques jours à Athènes et dans les Cyclades!

Nous avons pris un train pour rejoindre Paris la veille et Julia nous a gentiment hébergés pour la nuit, qui fut courte car il fallait être sur le pont à 3h30 du matin. Un taxi nous attend en bas de la rue à 4 heures pour rejoindre l’aéroport d’Orly Sud. Notre vol est assuré par Transavia pour un départ prévu à 6:30.

Un café allongé et un croissant étriqué plus tard, nous commençons à émerger et passons les contrôles de sécurité. Le personnel de l’aéroport est sympathique et l’organisation efficace : nous passons tous les checkpoints rapidement et n’avons que quelques minutes pour flâner dans la zone duty-free que déjà l’embarquement commence.

Départ à l’heure, arrivée à l’heure à 10h30 heure locale : il y a une heure de décalage horaire par rapport à la France. On marche jusqu’au métro. Il y en a un toutes les demi-heures donc comme on se perd en chemin, on a celui de 11h30. Ça coûte 10 euros par personne mais 18 euros si on prend un billet double pour deux voyageurs.

Le métro (ligne 3) nous emmène directement au centre ville d’Athènes. Au début, le métro part de l’aéroport et nous admirons les paysages brûlés par le soleil: une terre asséchée, des oliviers à foison et des collines rocailleuses. Ensuite, le métro devient souterrain. Cela prend environ 30 minutes pour relier le centre ville d’Athènes depuis l’aéroport.

Nous arrivons à la station Syntagma, en plein cœur de la ville. S’y trouve le Parlement. Juste devant, on voit aussi des gardes, en costume traditionnel.

La chaleur est accablante et nous avons soif, car toutes les provisions d’eau achetées avant l’embarquement sont écoulées. Nous nous mettons en branle pour trouver un petit bouge où déjeuner. Nous savourons une bière fraîche, accompagnée d’un plat de «souvlaki» pour Matt. Ce sont des brochettes de porc aux herbes, accompagnées de frites, de tomates et de tzatziki. Il se régale. Cécile se rafraîchit avec une salade grecque. Le repas est agréable et nous nous reposons un peu.

Il est temps de rejoindre notre logement. Armés de notre plan, nous marchons en direction de l’Olympeion, le temple de Zeus Olympien. Nous le longeons, traversons la ligne de tram et quelques rues plus tard, nous y sommes. Il s’agit d’un appartement spacieux, fonctionnel et agréable. Il a même un petit jardin et une terrasse sur le toit, avec vue sur l’Acropole. Parfait !

La douche et la sieste sont divines.

Nous repartons ensuite et nous promenons dans le quartier Plaka. Des petites échoppes touristiques se succèdent. L’ambiance est très bonne. Matt, venu en Grèce spécialement pour cela, a très envie de goûter ce fameux gâteau qu’il avait découvert en Crète quelques voyages plus tôt et dont il rêve chaque nuit depuis: le baklava. Nous nous attablons donc à la terrasse d’une pâtisserie et dégustons un baklava et un kataïfi.

Notre promenade se poursuit dans Plaka. Il fait très bon et à un moment, nous nous retrouvons face à l’enceinte de l’Acropole. Nous l’admirons un certain temps lorsque soudain, elle s’illumine.

Athènes et les Cyclades : arrivée à Athènes photo

Nous poursuivons notre petit tour de la ville lorsqu’au détour d’une ruelle, une petite tonnelle accueillante nous tend les bras. Nous dinons d’une salade grecque arrosée d’un verre de vin.

Nous rentrons à nos pénates athéniennes.

Si vous utilisez les fonctions de réplication de MySQL ou MariaDB, il peut arriver que votre slave bloque sur une instruction qui devrait avoir un identifiant unique mais que le serveur tente d’insérer deux fois.

Créer un serveur High Availability : la réplication des bases de données photo

Et quand c’est le cas, la réplication des données prend fin donc c’est un problème à corriger rapidement si vous voulez que votre système haute disponibilité perdure et soit vraiment efficace en cas de coup dur.

Identification du problème

Je me suis rendu compte du problème lorsque j’ai ajouté de nouvelles bases à répliquer : j’ai relancé la procédure d’installation, relancé les serveurs, ajouté les nouvelles positions, démarré les slaves.

On regarde le status du slave :

MariaDB [(none)]> SHOW SLAVE STATUS\G

Résultat :

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.134.23.164
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000210
          Read_Master_Log_Pos: 2753885
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 103794
        Relay_Master_Log_File: mariadb-bin.000210
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1062
                   Last_Error: Error 'Duplicate entry '56-724' for key 'PRIMARY'' on query. Default database: 'frenchy'. Query: 'INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`) VALUES (56, 724)'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1563407
              Relay_Log_Space: 1296874
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1062
               Last_SQL_Error: Error 'Duplicate entry '56-724' for key 'PRIMARY'' on query. Default database: 'frenchy'. Query: 'INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`) VALUES (56, 724)'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
               Master_SSL_Crl:
           Master_SSL_Crlpath:
                   Using_Gtid: No
                  Gtid_IO_Pos:
      Replicate_Do_Domain_Ids:
  Replicate_Ignore_Domain_Ids:
                Parallel_Mode: conservative
1 row in set (0.00 sec)

Comme on peut le constater, plusieurs choses ne tournent pas rond et empêchent la synchronisation des données entre nos deux serveurs :

Slave_SQL_Running: No
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '56-724' for key 'PRIMARY'' on query. Default database: 'frenchy'. Query: 'INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`) VALUES (56, 724)'

Solution : un RESET sur le slave

En me documentant sur le problème, j’ai lu pas mal de choses sur le net. Certains préfèrent cacher l’erreur, au risque de perdre des données. D’autres préfèrent tout effacer pour recommencer la réplication.

Aucune de ces « solutions » ne me conviennent donc nous allons procéder autrement. Comme l’erreur n’apparaît que sur le serveur BACKUP et non sur le serveur principal, c’est sur lui que nous travaillerons.

Sur le serveur BACKUP, dans MariaDB, on arrête notre slave :

MariaDB [(none)]> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)

On flush les privilèges et donc les utilisateurs connectés :

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

On efface les fichiers logs de notre slave. C’est comme effacer une ardoise pour repartir sur des bases saines. Cela ne supprime aucune donnée – cf le manuel sur RESET :

MariaDB [(none)]> RESET SLAVE;
Query OK, 0 rows affected (0.00 sec)

Et on redémarre notre slave :

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

On vérifie de nouveau le status de notre slave :

MariaDB [(none)]> SHOW SLAVE STATUS\G

Résultat :

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.134.23.164
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000196
          Read_Master_Log_Pos: 77900062
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 6318821
        Relay_Master_Log_File: mariadb-bin.000192
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 6318531
              Relay_Log_Space: 344030331
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 833890
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
               Master_SSL_Crl:
           Master_SSL_Crlpath:
                   Using_Gtid: No
                  Gtid_IO_Pos:
      Replicate_Do_Domain_Ids:
  Replicate_Ignore_Domain_Ids:
                Parallel_Mode: conservative
1 row in set (0.00 sec)

Nous avons bien :

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Et voilà, plus d’erreur et une réplication active dans les deux sens.

La saison 3 de Fear the Walking Dead a commencé sur AMC.

Fear the Walking Dead saison 3 photo

Travis, Madison et Alicia sont capturés par un groupe armé et emmenés dans un complexe militaire. Travis est séparé, enfermé dans un sous-sol, tandis que Madison et Alicia sont retenues captives dans un bureau.

Au sous-sol, Travis retrouve Nick et Luciana qui est blessée, avec d’autres prisonniers. Ils s’enfuient mais Travis est recapturé. Nick et Luciana passent par les égouts. Pendant ce temps, Madison et Alicia attaquent leur geôlier, Troy, et Madison empale son oeil avec une petite cuiller.

Lorsque les walkers arrivent dans le complexe, Travis, Luciana et Alicia prennent l’hélicoptère tandis que Madison et Nick sont obligés de partir en Jeep avec Troy.

Curieusement, j’ai accroché à cette saison, ce qui n’a jamais été le cas auparavant. C’est à croire que les scénaristes ont fait un travail d’écriture ce coup-ci: c’est un peu plus proche de la série mère, The Walking Dead, et un peu plus violent et rythmé – ce qui, il faut bien l’avouer, n’a pas été le cas lors des deux premières saisons fleuves.

J’attends de voir si la suite est du même acabit. Seize épisodes ont été prévus pour cette saison.

Cette semaine, le système d’exploitation du serveur principal passe de Debian 8 Jessie à Debian 9 Stretch.

Serveur dédié : mise à jour vers Debian 9 Stretch photo

Mise à jour des paquets du système

La mise à jour s’est faite plutôt simplement pour la majeure partie des paquets :

apt update && apt upgrade

mais il a fallu s’y reprendre à plusieurs fois pour les paquets restants :

apt install 

Changements dans la configuration

Quelques changements notables sont à noter.

Configuration apt

On vérifie que tous nos dépôts pointent bien vers la version Stretch:

nano /etc/apt/sources.list

On sauvegarde et on lance les mises à jour:

apt update && apt upgrade

Configuration SSH

La configuration SSH a été modifiée et certaines directives ne sont plus valables. Avant de redémarrer le serveur SSH ou de rebooter et de perdre tout accès au serveur SSH, assurez-vous que la configuration est correcte :

sshd -t

Résultats :

/etc/ssh/sshd_config line 25: Deprecated option KeyRegenerationInterval
/etc/ssh/sshd_config line 26: Deprecated option ServerKeyBits
/etc/ssh/sshd_config line 44: Deprecated option RhostsRSAAuthentication

Il ne vous reste plus qu’à éditer le fichier de configuration SSH:

nano /etc/ssh/sshd_config

J’ai désactivé les lignes qui posaient problème et ai rajouté de nouveaux protocoles de clé :

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

Sauvegardez le fichier puis lancez cette commande pour créer les couples de clés privées/publiques dans /etc/ssl:

ssh-keygen -A

Résultat:

ssh-keygen: generating new host keys: ECDSA ED25519

Vérifiez une dernière fois qu’il n’y a aucun problème avec le fichier de configuration SSH:

sshd -t

et redémarrez le service SSH:

service ssh restart

Configuration de Courier

C’est le bon moment de revoir la configuration IMAP et POP de Courier.

On commence par renouveler notre fichier Diffie-Hellman en 4096 bits:

cd /etc/courier
openssl dhparam -out dhparams4096.pem 4096

et on revoit la configuration de /etc/courier/imap-ssl :

SSLPORT=993

SSLADDRESS=0

SSLPIDFILE=/run/courier/imapd-ssl.pid

SSLLOGGEROPTS="-name=imapd-ssl"

IMAPDSSLSTART=YES

IMAPDSTARTTLS=YES

IMAP_TLS_REQUIRED=1

COURIERTLS=/usr/bin/couriertls

TLS_PROTOCOL=TLS1_2:TLS1_1:TLS1

TLS_STARTTLS_PROTOCOL=TLS1_2:TLS1_1:TLS1

TLS_CIPHER_LIST="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS"

TLS_KX_LIST=ALL

TLS_COMPRESSION=ALL

TLS_CERTS=X509

TLS_DHCERTFILE=/etc/courier/dhparams4096.pem

TLS_CERTFILE=/etc/courier/skyminds-cert.pem

TLS_TRUSTCERTS=/etc/ssl/certs

TLS_VERIFYPEER=NONE

TLS_CACHEFILE=/var/lib/courier/couriersslcache
TLS_CACHESIZE=524288

MAILDIRPATH=Maildir

Le chemin de SSLPIDFILE a changé donc pensez à le vérifier.

Certificat TLS pour Courier

Depuis que j’utilise les certificats TLS de Let’s Encrypt, il y a une petite modification a exécuter pour que le certificat s’applique aussi à notre serveur de mail : créer automatiquement un certificat pour Courier dès que notre certificat principal est généré.

On crée un script bash pour compiler notre clé privée et notre certificat Let’s Encrypt :

nano /home/scripts/letsencrypt-skyminds-mailserver.sh

avec :

#!/bin/bash
cat /etc/letsencrypt/live/skyminds.net/privkey.pem /etc/letsencrypt/live/skyminds.net/fullchain.pem > /etc/courier/skyminds-cert.pem

et on édite notre fichier Let’s Encrypt pour le renouvellement :

nano /etc/letsencrypt/renewal/skyminds.net.conf

et on ajoute la directive renew_hook avec notre nouveau script:

[renewalparams]
account = ...
renew_hook = /home/scripts/letsencrypt-skyminds-mailserver.sh

Il ne reste plus qu’à éditer la configuration IMAP:

nano /etc/courier/imapd-ssl

et y mettre :

TLS_CERTFILE=/etc/courier/skyminds-cert.pem

puis redémarrez le service:

service courier-imap-ssl restart

Voilà, il me semble que ce sont les principales modifications que j’ai effectué lors de la mise à jour vers Debian 9.

Récemment, j’ai installé un serveur en Chine, derrière le Great Firewall of China (GFW) pour un des mes clients. Le code n’a pas de frontières mais la langue peut parfois poser problème – même pour un système d’exploitation, au niveau de la locale.

Linux : résoudre Cannot set LC_ALL to default locale

Les locales sont un ensemble de paramètres qui définissent la langue de l’utilisateur, sa région et les préférences régionales que l’utilisateur souhaire voir dans son interface. Typiquement, une locale est identifiée par un code langue suivi d’un identifiant de région. Nous avons par exemple « en_US.UTF-8 » pour l’anglais américain (en pour l’anglais, US pour les USA) ou « fr_FR.UTF-8 » pour le français de France.

Dans le cas de mon serveur chinois, qui tourne sous Debian, les paramètres de la locale n’étaient pas uniformément remplis avec le même code langue et certains paramètres étaient manquants.

On obtenait donc ces messages lors d’un apt update :

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "fr_FR.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

ou encore ces messages avec apt upgrade, après chaque installation ou mise à jour de paquets :

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

Pas de panique, j’ai quelques solutions pour régler le problème si vous aussi y êtes confronté.

Dans ce tutoriel, j’utilise « en_US.UTF-8 » parce que j’aime tout avoir en anglais. Si vous préférez le français, remplacez tout par « fr_FR.UTF-8 ».

Etape 1 : éditez .bashrc

Editez votre fichier .bashrc :

nano .bashrc

et ajoutez cette ligne:

export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"

Enregistrez le fichier et validez vos changements immédiatement avec la commande source :

source .bashrc

Ou, un chouia plus barbare, quittez votre session SSH puis reconnectez-vous.

Etape 2 : reconfigurer les locales

On commence par générer la locale de notre choix :

locale-gen "en_US.UTF-8"

Et on la reconfigure :

dpkg-reconfigure locales

Il ne reste plus qu’à tester les locales du système:

locale

Résultat:

LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Et voilà, plus de messages d’avertissement ou d’erreur concernant les locales de votre système. Problème réglé.

Amazon Elastic Compute Cloud ou EC2 est un service proposé par Amazon Web Services (AWS) permettant à des tiers de louer des serveurs sur lesquels exécuter leurs propres applications web.

Linux : donner les privilèges sudo à un utilisateur sur une instance Amazon Web Service EC2 photo

Si vous avez déjà travaillé sur une instance Amazon EC2 sous linux, vous avez très certainement essayé d’utiliser sudo pour lancer des commandes qui nécessitent une élévation des privilèges de votre utilisateur.

Or, la configuration Amazon ne le permet pas par défaut mais utilise une implémentation du fichier sudoers qui n’est pas standard pour une installation linux.

Une implémentation du fichier sudoers différente

Normalement, lorsque l’on lance visudo, on obtient une version éditable du fichier /etc/sudoers qui nous permet de modifier les comptes utilisateurs pour leur donner la permission d’exécuter la commande sudo et donc contrôler quelles commandes ces utilisateurs peuvent lancer.

Anatomie du fichier sudoers

Voici un exemple de fichier sudoers classique :

# User privilege specification
root ALL=(ALL:ALL) ALL# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL# See sudoers(5) for more information on “#include” directives:#includedir /etc/sudoers.d

Les membres des groupes admin et sudo bénéficient des privilèges sudo, tout comme le compte root. Toutefois, aucune de ces lignes ne s’appliquent à un compte EC2 qu’un utilisateur AWS peut utiliser.

C’est la dernière ligne, avec la directive #includedir, qui permet de charger le bon fichier avec les privilèges utilisateur. Il est vital de noter que le signe # dans #includedir n’est pas un commentaire mais indique qu’il faut charger les fichiers contenus dans le répertoire /etc/sudoers.d – cela peut prêter à confusion mais c’est comme cela que le fichier sudoers fonctionne.

EC2 : donner les droits sudo à un utilisateur

Sur une instance EC2, il suffit de lister le contenu du répertoire /etc/sudoers.d pour trouver le bon fichier:

ls /etc/sudoers.d

Dans la plupart des cas et des distributions, le nom du fichier débute par un nombre élevé tel que 90. Ces fichiers sont chargés par ordre décroissant, à la manière du lancement d’une fusée, donc un fichier qui commence par 90 sera exécuté avant un fichier qui commence par 10.

Inner Circle est un groupe Jamaicain de reggae formé en 1968 par les frères Ian et Roger Lewis, qui s’appelait à l’origine The Inner Circle Band et qui est connu pour mélanger pop, rock et reggae.

En 1987, ils sortent l’une de leurs chansons phares « Bad Boys », qui fut utilisée comme générique pour la série télévisée COPS, diffusée sur Fox.

La chanson idéale pour décompresser après le dernier conseil de classe de l’année scolaire !

Des espaces après chaque caractère accentué

Pour le site du Kriya Yoga France, on me transmet régulièrement des fichiers PDF que je dois transformer en articles. Je fais donc la plupart du temps un copié-collé et ensuite je m’attèle à la mise en page dans l’éditeur WordPress.

MacOS : résoudre le problème d'encodage Unicode des accents photo

Le hic, c’est que depuis l’année dernière, je travaille sous MacOS pour tout ce qui est développement web. J’ouvre donc chaque PDF avec Preview – la visionneuse PDF installée par défaut – mais lorsque l’on colle le contenu du PDF dans un autre document, tous les caractères accentués sont suivis d’une espace (oui, on dit bien une espace en typographie) et des sauts de ligne apparaissent de nulle part. Clairement improductif.

Un conflit Unicode

Le problème réside entre un conflit lors de l’encodage Unicode entre caractères précomposés et caractères décomposés.

Un caractère précomposé ou caractère composite ou caractère décomposable est une entité Unicode qui peut aussi être définie comme une combinaison de plus de deux caractères.

Un caractère précomposé peut typiquement représenter une lettre surplombée d’un accent, comme é (lettre e avec accent aigu).

Techniquement, é (U+00E9) est un caractère qui peut être décomposé en son équivalent unicode à base de la lettre e (U+0065) et du caractère combinant accent aigu (U+0301).

La solution : UnicodeChecker

Heureusement, il existe un petit utilitaire, UnicodeChecker, qui permet de régler le problème très simplement. Voici la marche à suivre.

1. Lancez UnicodeChecker > File > New Utilities Window.

2. Copiez le texte de votre fichier PDF en mémoire (sélectionnez le texte puis Cmd+C ou Ctrl+C au clavier).

3. Dans UnicodeChecker, choississez l’option Normalize (6ème icône) et collez votre texte dans le champ Input puis appuyez sur Entrée. Cela donne :

MacOS : résoudre le problème d'encodage Unicode des accents sous Preview photo

Quatre champs sont proposés avec le résultat de la normalisation. Les deux champs qui nous importent sont NFC et NFKC, qui utilisent tout deux de l’Unicode précomposé, dans lequel l’accent fait partie intégrante du caractère accentué et non une entité à part.

4. Sélectionnez et copiez le texte contenu dans le champ NFC:

MacOS : résoudre le problème d'encodage Unicode des accents sous Preview photo 1

5. Collez maintenant le texte précédemment copié dans votre document ou l’éditeur de texte de votre CMS. A l’œil nu, rien ne change mais dans le rendu, votre texte est désormais correctement accentué, sans espaces inopportunes.

Rapport de faute d’orthographe

Le texte suivant sera envoyé à nos rédacteurs :