Vous souhaitez être immédiatement informé dès qu’un serveur redémarre ? Que ce soit pour suivre des serveurs de production, détecter des redémarrages inattendus ou simplement valider la disponibilité après une maintenance, recevoir un email automatique est pratique et rassurant.
Dans ce tutoriel, nous allons mettre en place un mécanisme simple, fiable et totalement automatisé sous Linux.
Prérequis
Avant de commencer, assurez-vous de disposer de :
Un serveur Linux avec accès root ou sudo.
Un serveur de mail local ou distant configuré (Postfix, Exim, etc.).
Le paquet mailutils ou équivalent installé pour envoyer des emails depuis la ligne de commande.
Pour installer mailutils sur Debian/Ubuntu :
sudo apt update
sudo apt install mailutils -y
Étape 1 : créer un script d’envoi d’email
Nous allons créer un script simple qui enverra un email à l’administrateur. Il inclura le MOTD (Message of the Day) pour vous donner immédiatement des informations sur le serveur.
Créez le fichier :
sudo nano /home/scripts/send-reboot-email.sh
Ajoutez le contenu suivant :
#!/bin/bash# Destinataire
TO="admin@example.com"# Objet de l'email
SUBJECT="Serveur redémarré - $(hostname)"# Récupération du MOTD dynamique si disponibleif [ -x "$(command -v run-parts)" ] && [ -d /etc/update-motd.d ]; then
MOTD=$(run-parts /etc/update-motd.d)
elif [ -f /etc/motd ]; then
MOTD=$(cat /etc/motd)
else
MOTD="Aucun MOTD disponible"
fi
# Corps de l'email
BODY="Le serveur $(hostname) vient de redémarrer.
Date : $(date)
--- MOTD ---
$MOTD
"# Envoi de l'emailecho"$BODY" | mail -s "$SUBJECT""$TO"Code language:PHP(php)
Rendez le script exécutable :
sudo chmod +x /home/scripts/send-reboot-email.sh
Étape 2 : créer un service systemd
Pour exécuter le script automatiquement après un redémarrage et seulement lorsque le serveur de mail est opérationnel, nous allons créer un service systemd.
La sécurité SSH est souvent négligée… jusqu’au jour où une attaque brute force ou une mauvaise configuration vous met à genoux. Heureusement, il existe un outil open source simple, rapide et redoutablement efficace pour auditer la sécurité de votre serveur SSH : SSH-Audit.
Dans ce guide, on va voir ensemble comment utiliser SSH-Audit pour scanner, comprendre les failles et corriger les erreurs sur un serveur Ubuntu 24.04.
Installer SSH-Audit avec Python
SSH-Audit est un script Python autonome. Pas besoin de bibliothèque externe, pas de dépendances lourdes. Juste Python, un terminal et c’est parti :
Si vous voulez tester sans rien installer, vous pouvez aussi passer par le service en ligne ssh-audit.com : entrez simplement l’adresse IP ou le nom de domaine de votre serveur, SSH-Audit vous renvoie un rapport clair et lisible.
Voici le rapport de ssh-audit pour un Ubuntu Server de base, avant optimisation :
# general
(gen) banner: SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.12
(gen) software: OpenSSH 9.6p1
(gen) compatibility: OpenSSH 9.6+, Dropbear SSH 2020.79+
(gen) compression: enabled (zlib@openssh.com)
# key exchange algorithms
(kex) sntrup761x25519-sha512@openssh.com -- [info] available since OpenSSH 8.5
`- [info] default key exchange from OpenSSH 9.0 to 9.8
`- [info] hybrid key exchange based on post-quantum resistant algorithm and proven conventional X25519 algorithm
(kex) curve25519-sha256 -- [info] available since OpenSSH 7.4, Dropbear SSH 2018.76
`- [info] default key exchange from OpenSSH 7.4 to 8.9
(kex) curve25519-sha256@libssh.org -- [info] available since OpenSSH 6.4, Dropbear SSH 2013.62
`- [info] default key exchange from OpenSSH 6.5 to 7.3
(kex) ecdh-sha2-nistp256 -- [fail] using elliptic curves that are suspected as being backdoored by the U.S. National Security Agency
`- [info] available since OpenSSH 5.7, Dropbear SSH 2013.62
(kex) ecdh-sha2-nistp384 -- [fail] using elliptic curves that are suspected as being backdoored by the U.S. National Security Agency
`- [info] available since OpenSSH 5.7, Dropbear SSH 2013.62
(kex) ecdh-sha2-nistp521 -- [fail] using elliptic curves that are suspected as being backdoored by the U.S. National Security Agency
`- [info] available since OpenSSH 5.7, Dropbear SSH 2013.62
(kex) diffie-hellman-group-exchange-sha256 (3072-bit) -- [info] available since OpenSSH 4.4
`- [info] OpenSSH's GEX fallback mechanism was triggered during testing. Very old SSH clients will still be able to create connections using a 2048-bit modulus, though modern clients will use 3072. This can only be disabled by recompiling the code (see https://github.com/openssh/openssh-portable/blob/V_9_4/dh.c#L477).
(kex) diffie-hellman-group16-sha512 -- [info] available since OpenSSH 7.3, Dropbear SSH 2016.73
(kex) diffie-hellman-group18-sha512 -- [info] available since OpenSSH 7.3
(kex) diffie-hellman-group14-sha256 -- [warn] 2048-bit modulus only provides 112-bits of symmetric strength
`- [info] available since OpenSSH 7.3, Dropbear SSH 2016.73
(kex) ext-info-s -- [info] available since OpenSSH 9.6
`- [info] pseudo-algorithm that denotes the peer supports RFC8308 extensions
(kex) kex-strict-s-v00@openssh.com -- [info] pseudo-algorithm that denotes the peer supports a stricter key exchange method as a counter-measure to the Terrapin attack (CVE-2023-48795)
# host-key algorithms
(key) rsa-sha2-512 (3072-bit) -- [info] available since OpenSSH 7.2
(key) rsa-sha2-256 (3072-bit) -- [info] available since OpenSSH 7.2, Dropbear SSH 2020.79
(key) ecdsa-sha2-nistp256 -- [fail] using elliptic curves that are suspected as being backdoored by the U.S. National Security Agency
`- [warn] using weak random number generator could reveal the key
`- [info] available since OpenSSH 5.7, Dropbear SSH 2013.62
(key) ssh-ed25519 -- [info] available since OpenSSH 6.5, Dropbear SSH 2020.79
# encryption algorithms (ciphers)
(enc) chacha20-poly1305@openssh.com -- [info] available since OpenSSH 6.5, Dropbear SSH 2020.79
`- [info] default cipher since OpenSSH 6.9
(enc) aes128-ctr -- [info] available since OpenSSH 3.7, Dropbear SSH 0.52
(enc) aes192-ctr -- [info] available since OpenSSH 3.7
(enc) aes256-ctr -- [info] available since OpenSSH 3.7, Dropbear SSH 0.52
(enc) aes128-gcm@openssh.com -- [info] available since OpenSSH 6.2
(enc) aes256-gcm@openssh.com -- [info] available since OpenSSH 6.2
# message authentication code algorithms
(mac) umac-64-etm@openssh.com -- [warn] using small 64-bit tag size
`- [info] available since OpenSSH 6.2
(mac) umac-128-etm@openssh.com -- [info] available since OpenSSH 6.2
(mac) hmac-sha2-256-etm@openssh.com -- [info] available since OpenSSH 6.2
(mac) hmac-sha2-512-etm@openssh.com -- [info] available since OpenSSH 6.2
(mac) hmac-sha1-etm@openssh.com -- [fail] using broken SHA-1 hash algorithm
`- [info] available since OpenSSH 6.2
(mac) umac-64@openssh.com -- [warn] using encrypt-and-MAC mode
`- [warn] using small 64-bit tag size
`- [info] available since OpenSSH 4.7
(mac) umac-128@openssh.com -- [warn] using encrypt-and-MAC mode
`- [info] available since OpenSSH 6.2
(mac) hmac-sha2-256 -- [warn] using encrypt-and-MAC mode
`- [info] available since OpenSSH 5.9, Dropbear SSH 2013.56
(mac) hmac-sha2-512 -- [warn] using encrypt-and-MAC mode
`- [info] available since OpenSSH 5.9, Dropbear SSH 2013.56
(mac) hmac-sha1 -- [fail] using broken SHA-1 hash algorithm
`- [warn] using encrypt-and-MAC mode
`- [info] available since OpenSSH 2.1.0, Dropbear SSH 0.28
# fingerprints
(fin) ssh-ed25519: SHA256:YnkJfR0z/UMb2wQ+wYvEwgTJPheozRsMH41BvEXL56Q
(fin) ssh-rsa: SHA256:Ax+2iFsBx5juS8y+bVXxvs3DT0bdoX4nKAdGje1iknQ
# algorithm recommendations (for OpenSSH 9.6)
(rec) -ecdh-sha2-nistp256 -- kex algorithm to remove
(rec) -ecdh-sha2-nistp384 -- kex algorithm to remove
(rec) -ecdh-sha2-nistp521 -- kex algorithm to remove
(rec) -ecdsa-sha2-nistp256 -- key algorithm to remove
(rec) -hmac-sha1 -- mac algorithm to remove
(rec) -hmac-sha1-etm@openssh.com -- mac algorithm to remove
(rec) -diffie-hellman-group14-sha256 -- kex algorithm to remove
(rec) -hmac-sha2-256 -- mac algorithm to remove
(rec) -hmac-sha2-512 -- mac algorithm to remove
(rec) -umac-128@openssh.com -- mac algorithm to remove
(rec) -umac-64-etm@openssh.com -- mac algorithm to remove
(rec) -umac-64@openssh.com -- mac algorithm to removeCode language:PHP(php)
Et le résultat en image :
Audit SSH sous un serveur Ubuntu avant optimisation, pas top :(
Ce n’est pas vraiment idéal ! Passons à l’étape suivante pour sécuriser le service SSH.
Lors d’un diagnostic de performance ou d’une enquête sur une infection malware dans WordPress, il devient souvent nécessaire de désactiver l’ensemble des extensions à un moment donné du processus. Il est également judicieux de sauvegarder toutes les extensions WordPress individuellement sous forme d’archives .zip, afin de prévenir toute perte ou confusion durant les manipulations.
Réinstaller manuellement chaque extension à partir de ses fichiers zip serait une tâche particulièrement fastidieuse. C’est pourquoi, dans cet article, je vous montre comment automatiser entièrement cette procédure.
Nous commencerons par compresser chaque extension WordPress dans un fichier .zip distinct, que nous placerons dans un dossier temporaire. Pour compléter ce script, j’ai également inclus une boucle simple permettant de réinstaller en lot toutes ces sauvegardes via WP‑CLI.
1. Sauvegarde de la base de données
Connectez-vous dans le répertoire racine de votre site via SSH, puis exécutez :
wp db export sauvegarde.sqlCode language:JavaScript(javascript)
Cela génère un fichier SQL contenant l’intégralité de la base de données.
2. Archivage des fichiers du site
Au même emplacement, empaquetez l’intégralité du site :
Après avoir supprimé et désinstallé les plugins WPML et ses modules complémentaires, vous devez également nettoyer la base de données.
Cette installation particulière que j’ai nettoyée lors d’un projet Codeable n’avait pas WooCommerce ni le module complémentaire WPML WooCommerce installés, donc malheureusement ce guide ne couvre pas le nettoyage spécifique à cela.
Cependant, si vous abandonnez WPML pour des raisons de performance et souhaitez de l’aide pour nettoyer votre base de données, n’hésitez pas à me contacter ici. Vous pouvez également utiliser phpMyAdmin ou Adminer pour nettoyer WPML si vous préférez.
Sauvegardez d’abord votre base de données et testez minutieusement sur un site de staging avant de continuer !
Supprimer les tables et options de base de données WPML
Dans ces sections, nous allons supprimer les lignes pertinentes de WPML de la table wp_options, puis les tables de base de données dédiées à WPML elles-mêmes.
Si vous le souhaitez, vous pouvez recueillir le nombre de données autochargées à l’aide de la commande wp doctor (voir le tutoriel) afin que nous puissions voir à quel point les données autochargées dans wp_options diminuent après avoir nettoyé les plugins WPML.
wp doctor check autoload-options-size --allow-root --skip-plugins --skip-themes
La commande wp profile est un peu comme une alternative à New Relic, capable d’identifier précisément quels composants ralentissent votre site WordPress. Initialement disponible en tant que package premium via runcommand, il est désormais gratuit sur GitHub.
Si vous cherchez un hébergeur compatible avec l’installation de wp profile, jetez un œil à Kinsta et FastNyx.
J’utilise régulièrement wp profile pour diagnostiquer les problèmes de performance chez mes clients sur Codeable. Tous les développeurs WordPress devraient s’en servir ! Après avoir suivi ce guide, vous serez plus proche de la résolution de la lenteur de votre site WordPress.
Installation du package wp-profile
Lancez cette commande pour installer wp profile :
wp package install wp-cli/profile-command
Vous devriez voir que le processus s’est déroulé avec succès et que la commande wp profile est maintenant disponible:
Updating /root/.wp-cli/packages/composer.json to require the package...
Using Composer to install the package...
---
Loading composer repositories with package information
Updating dependencies
Resolving dependencies through SAT
Dependency resolution completed in0.120 seconds
Analyzed 3696 packages to resolve dependencies
Analyzed 101022 rules to resolve dependencies
Package operations: 1 install, 0 updates, 0 removals
Installs: wp-cli/profile-command:dev-master ef44df5
- Installing wp-cli/profile-command (dev-master ef44df5)
Writing lock file
Generating autoload files
---
Success: Package installed.Code language:JavaScript(javascript)
Si vous voyez une erreur concernant composer.json reverté, l’augmentation de la mémoire devrait résoudre ce problème.
Chaque fois qu’un hébergeur n’a pas WP-CLI installé par défaut, je suis déçu : ce puissant outil de gestion WordPress n’est pas disponible ! Heureusement, il est facile d’installer WP-CLI sans accès root ni sudo via SSH.
En suivant cette méthode, vous pourrez utiliser WP-CLI exactement comme s’il avait été installé de manière traditionnelle avec les droits root et placé dans /usr/bin ou /usr/local/bin.
Cet article vous montrera comment installer WP-CLI sur presque toutes les distributions Linux comme CentOS, Debian, Ubuntu, etc., tant que le paquet php-cli est disponible. Tout ce dont vous avez besoin, c’est d’un accès SSH et d’un moyen d’entrer ces commandes, comme le terminal Mac ou PuTTY sous Windows.
Installer WP-CLI sans accès root ni sudo
Nous avons besoin d’un emplacement pour stocker le fichier phar de WP-CLI, créons donc un dossier et entrons dedans :
mkdir -p /tmp/wp-cli
cd /tmp/wp-cli
Téléchargez la dernière version de WP-CLI phar et rendez-la exécutable :
Pour utiliser le WP-CLI que nous venons de télécharger, il faudra ajouter ./ devant wp. Il vous faudra également le chemin d’installation de WordPress.
Lorsque vous désinstallez des plugins WordPress, de nombreux éléments peuvent rester dans la base de données. Cela rend la base de données inutilement volumineuse et peut même ralentir les requêtes.
Il est toujours recommandé de nettoyer votre base de données WordPress après avoir supprimé des plugins. J’ai récemment migré un site d’Elementor vers GenerateBlocks pour améliorer les performances, donc naturellement j’ai dû nettoyer la base de données.
Ce tutoriel concerne le nettoyage post-désinstallation d’Elementor pour supprimer les lignes restantes des tables options, postmeta, usermeta et posts avec WP-CLI.
Dans ce tutoriel, nous allons couvrir les points suivants :
Depuis la dernière mise à jour d’Ubuntu Server, le daemon transmission ne fonctionne plus correctement : il ne démarre plus de manière stable et les téléchargements ne se lancent que pendant cette période où il tente de se lancer.
J’ai passé pas mal de temps à essayer de résoudre le problème mais les mises à jour de transmission sont vraiment très espacées et il est fort probable que le projet ne soit plus maintenu dans quelques temps.
Il est donc temps de passer à un nouveau daemon bittorrent, qui se veut léger, rapide et efficace : deluge. Voici donc un tutoriel pour installer deluge sur Ubuntu Server pour créer une seedbox bittorrent.
Qu’est-ce qu’une seedbox ?
Une seedbox est un serveur informatique privé dédié au stockage, au téléchargement et à l’émission de fichiers numériques. Généralement, les seedboxes utilisent le protocole BitTorrent pour émettre et recevoir des données. Ces serveurs sont connectés à des réseaux à très haut débit symétrique, allant de 100 Mbit/s à 1 Gbit/s ou plus, selon l’option choisie.
Les principaux avantages d’une seedbox sont :
Vitesse : les seedboxes peuvent télécharger et partager des fichiers à des vitesses très élevées, bien supérieures à celles d’une connexion Internet domestique classique.
Sécurité : l’utilisation d’une seedbox permet de masquer votre adresse IP personnelle, offrant ainsi une meilleure protection de votre vie privée.
Disponibilité : une seedbox fonctionne 24h/24 et 7j/7, même lorsque votre ordinateur personnel est éteint.
Gestion de l’espace : les fichiers sont stockés sur le serveur distant, libérant ainsi de l’espace sur votre propre machine.
Dans le cadre de notre tutoriel, nous allons utiliser Deluge, un client BitTorrent open-source populaire, pour configurer notre seedbox sur un serveur Ubuntu.
Découvrez quelles options de base de données WordPress appartiennent aux plugins
Cet article vous montrera comment identifier quelles options de plugins WordPress dans la table wp_options appartiennent à un plugin spécifique.
Normalement, les développeurs recherchent manuellement dans la table wp_options avec phpMyAdmin ou Adminer (version plugin WordPress), mais cela peut souvent être très fastidieux car vous devez paginer parfois des centaines de pages !
Lorsque nous disposons d’outils de ligne de commande Linux via SSH comme WP-CLI et grep, nous pouvons efficacement identifier quelles options dans la base de données WordPress appartiennent à un plugin spécifique et gagner un temps précieux !
Dans cet article, je vais montrer les techniques que j’utilise habituellement pour trouver ces options afin de pouvoir corriger les paramètres, les sauvegarder, etc. en faisant correspondre le option_name WordPress au plugin.Veuillez noter que ces deux approches nécessiteront un terminal et un accès SSH de quelque sorte à votre installation WordPress.
Je supposerai que WP-CLI et grep sont déjà installés sur le système Linux. Kinsta, WPEngine et FastNyx fournissent un accès SSH avec WP-CLI et grep disponibles.
Dans cet article, je vous montre comment convertir facilement vos tables de base de données WordPress du moteur MyISAM au moteur InnoDB avec WP-CLI.
Si vous vous demandez pourquoi vous voudriez effectuer cette conversion de base de données, je vous avais déjà parlé des améliorations d’InnoDB par rapport à MyISAM (tirer parti de plusieurs cœurs est assez impressionnant). On constate d’énormes améliorations du temps de réponse et une réduction de la charge du serveur après la conversion de MyISAM à InnoDB. Il existe également des différences d’index MySQL intéressantes entre les deux moteurs.
Commençons !
Conversion des tables WordPress de MyISAM à InnoDB avec WP-CLI
Vérifiez si certaines de vos tables utilisent MyISAM au lieu d’InnoDB:
wp db query "SHOW TABLE STATUS WHERE Engine = 'MyISAM'" --allow-rootCode language:JavaScript(javascript)
Si vous n’obtenez aucune sortie, il n’y a pas de tables MyISAM. Si vous obtenez une sortie, elle ressemblera à ceci :
Des fonctionnalités de Jetpack maintenant payantes
J’ai utilisé Jetpack pour les statistiques de mes sites WordPress site depuis 2004, soit 20 ans… mais voilà que Jetpack demande maintenant de payer pour avoir accès aux statistiques mensuelles et annuelles. Cela ne va pas être possible.
Jetpack est une extension couteau suisse, mais qui utilise vraiment tous les outils du couteau suisse? J’ai donc fait le tour des fonctionnalités de Jetpack que j’utilisais réellement et elles sont somme toute peu nombreuses: Stats, Related Posts, Publicize, et Protect.
Au lieu de Stats, j’utilise depuis quelques semaines Koko Analytics : vos statistiques sont dans votre base de données WordPress, donc chez vous, et le plugin respecte le RGPD (pas de cookies, pas d’informations personnelles). J’utilise également Plausible Analytics qui tourne sous Docker et dont je vous avais parlé il y a quelques mois.
Publicize permet d’envoyer vos posts sur les réseaux sociaux, je trouverai bien une alternative plus tard. Protect, le module de sécurité, n’est pas vraiment essentiel puisque la sécurité est en grande partie gérée par le serveur et le WAF.
Pour Related Posts, j’ai modifié le plugin qui j’utilise depuis des années pour qu’il génère des miniatures à la mode Jetpack mais sans le tracking. Car oui, tous les services de Jetpack (comme WooCommerce d’ailleurs) téléphonent les informations du site et du serveur chez Automattic. Mettons-y un terme.
Je vous propose donc un tutoriel pour désinstaller Jetpack proprement et supprimer les enregistrements Jetpack de la base de données car ils ne sont pas retirés à la suppression du plugin. Ainsi, vous aurez une base de données plus propre et donc un site plus rapide.
La traduction est un art subtil qui requiert non seulement une excellente maîtrise des langues, mais aussi une compréhension approfondie des nuances culturelles et linguistiques.
Dans cet article, nous allons explorer en détail le système de correction utilisé dans le milieu académique pour évaluer les traductions, en mettant l’accent sur la méthode des points-fautes. Cette approche vous aidera à mieux comprendre les attentes des correcteurs et à affiner vos compétences en traduction.
Le système de points-fautes : une approche équitable et objective
Le système de points-fautes est conçu pour évaluer les traductions de manière objective et équitable. Voici comment il fonctionne :
Vous commencez avec une note parfaite de 20/20.
Des points sont déduits pour chaque erreur identifiée dans votre traduction.
Le nombre total de points-fautes détermine votre note finale.
Calcul de la note finale
La détermination de la note finale implique un processus statistique :
Un écart-type est calculé à partir des nombres de points-fautes les plus bas et les plus élevés de l’ensemble des copies.
Cet écart-type sert à établir la moyenne de la classe.
Les copies sont classées en fonction de leur nombre de points-fautes.
Il est important de noter que :
Si votre nombre de points-fautes est inférieur à l’écart-type, votre note sera supérieure à la moyenne.
Même avec quelques erreurs, vous pouvez obtenir 20/20 si vous avez le moins de points-fautes de la classe.
Barème détaillé des points-fautes
Chaque jury peut avoir son propre barème, mais voici un exemple typique des pénalités appliquées :
Type d’erreur
Points de pénalité
Exemple
Omission (OM)
10 à 200
Oublier de traduire une phrase entière
Non-sens (NS)
10
“The dog barked at the moon” → “Le chien a aboyé à la lune” (correct) vs “Le chien a aboyé sur la lune” (non-sens)
Barbarisme (Barb)
10
“He went” → “Il alla” (correct) vs “Il allat” (barbarisme)
Grammaire (G)
10
“The cats are playing” → “Les chats jouent” (correct) vs “Les chats joue” (faute de grammaire)
Syntaxe (Syn)
6 à 8
“I often go there” → “J’y vais souvent” (correct) vs “Je vais souvent là” (syntaxe maladroite)
Temps (Tps)
6 à 8
“I have been living here for 10 years” → “J’habite ici depuis 10 ans” (correct) vs “J’habitais ici depuis 10 ans” (faute de temps)
Contresens (CS)
6 à 8
“He missed the point” → “Il n’a pas compris” (correct) vs “Il a raté le point” (contresens)
Calque (C)
4 à 6
“It’s raining cats and dogs” → “Il pleut des cordes” (correct) vs “Il pleut des chats et des chiens” (calque)
Très mal dit (TMD)
4
“He’s a jack of all trades” → “Il est touche-à-tout” (correct) vs “Il est un jacques de tous les métiers” (très mal dit)
Très inexact (Tinex)
4
“She’s a brilliant scientist” → “C’est une scientifique brillante” (correct) vs “C’est une scientifique intelligente” (très inexact)
Faux sens (FS)
2 à 6
“He was blue” → “Il était triste” (correct) vs “Il était bleu” (faux sens)
Sous-traduit/Sur-traduit (ST)
2 à 4
“He ran quickly” → “Il courut” (sous-traduit) ou “Il courut à toute vitesse comme s’il avait le diable aux trousses” (sur-traduit)
Mal dit (MD)
2
“It’s a piece of cake” → “C’est du gâteau” (correct) vs “C’est une pièce de gâteau” (mal dit)
Inexact (Inex)
2
“She’s pretty” → “Elle est jolie” (correct) vs “Elle est belle” (inexact)
Orthographe/Ponctuation (o/p)
1 à 3
“Il était une fois” → “Il étai une fois” (faute d’orthographe)