Du libre, du code, des idées, du mélange d’ArraKISS…

De l’épice pour la pensée

Dans les logs de votre serveur, il y a certainement un tas de requêtes vers "wp-login.php" et consorts. Ce sont des petits malins qui tentent de scanner mes sites pour l'éventuelle présence de wordpress.
Je ne sais pas vous, mais moi, ça m'agace. D'autant plus que je n'utilise pas wordpress.

Heureusement, "relayd" est là ;)
Présent par défaut sous OpenBSD, il n'y a qu'à rajouter ces quelques lignes à sa configuration pour bloquer avec élégance et condescendance les bots.

block quick path "/wp-*" label '<em><img src="https://yeuxdelibad.net/Images/scanbot.png"><br>Stop scanning for wordpress</em>. Educate yourself instead :<br><iframe src="https://en.wikipedia.org/wiki/Special:Random" width="100%" height="600px"></iframe>'

return error style "body { background: radial-gradient(ellipse at center top, gold, darkorange); color: red; text-align:center } hr {border:0; background-color:white; color:white; height:1px; width:30%; margin-top:50px;}"

Ça donne ça :

Ça fait mal hein ?

Libre à vous de changer le code html et aussi le code CSS qui pique les yeux (na!)

Dernièrement, je me suis amusé à optimiser mon site. Je voulais limiter la quantité de données à transférer. Ma bande passante est maigre. Et puis un visiteur ne devrait pas avoir à charger des tas de données pour lire un pauvre blog. Je suis passé d'une note "C" à A sur GTMetrix :

En-tête http pour la mise en cache
Tout d'abord, j'ai réactivé la gestion du cache dans les entêtes avec relayd, un outil présent dans OpenBSD. Le contenu est mis en cache par les navigateurs pendant une durée de 1 an maximum. La partie correspondante de la configuration, c'est ça :

match response header set "Cache-Control" value "max-age=31536000"

Chargement et optimisation des images
J'optimise systématiquement les images que je met en ligne avec ce script.

En plus, j'ai activé le plugin "lazyload" de blogotext qui permet de charger les images seulement lorsque le visiteur a déroulé la page vers l'emplacement de l'image. Ça limite grandement l'utilisation de bande passante.

Enfin, pour certaines pages, j'utilise un bout de javascript qui fait office de "spoiler".
Le HTML :

<p onclick="showimg(this, 'img/image.png')">Cliquez pour afficher l'image.</p>

La fonction javascript suivante va remplacer le texte précédent par l'image :

function showimg(elmnt,lnk) {
	elmnt.innerHTML = '<img src="' + lnk + '" />';
	elmnt.style = 'border:0';
};

Utilisation d'emojis pour les icônes

Au lieu d'utiliser des images pour faire des icônes, je suis allé piocher des émojis ici.

Pas de ressources externes
J'évite le chargement de ressources externes, comme les polices. À la place, dans le CSS, je propose plusieurs polices en faisant le pari qu'une bonne partie est déjà sur l'ordinateur du visiteur :

font-family: "Hack", "Menlo", "Liberation Mono", "Arial Monospaced", monospace;

Activation de la compression gzip
Il est recommandé d'activer la compression gzip dans les divers tutoriels. Cependant, cette fonctionnalité n'est pas implémentée dans le serveur httpd d'OpenBSD pour des raisons de sécurité (voir et surtout .
J'ai quand même activé cette fonctionnalité dans php en mettant les options suivantes dans le php.ini :

zlib.output_compression = On
zlib.output_compression_level = -1

Je pourrais aussi gzipper à la main les ressources css et javascript, mais pour l'instant non, car la flemme, et c'est pas pratique. De plus, la suite est très prometteuse.

Minification des fichiers CSS et JS
J'ai commencé à minifier les fichiers CSS et JS. En gros, on retire tous les espaces et sauts de ligne qui permettent une lecture de ces fichiers par les humains mais ne servent à rien par les navigateurs afin de réduire leurs poids. Il s'avère que Remrem a déjà commencé à créer un bout de code dans blogotext qui ferait ça automatiquement. Je n'ai pas encore vu le code, mais qui sait, le fichier minifié qui sera mis en cache sur le serveur pourra être gzippé automatiquement.

À améliorer?
Il faudrait rassembler tout le CSS dans un seul fichier pour réduire le nombre de requêtes. Ce n'est pas possible car je ne veux pas mélanger ces derniers afin de m'y retrouver.
Je pourrais aussi utiliser un CDN. Cependant, c'est soit payant, soit ça ne marche plus. D'ailleurs, quelqu'un a des nouvelles de coralCND?

Pour finir...
Un peu de lecture intéressante pour finir : https://lehollandaisvolant.net/tuto/pagespd/

Roundcube fait certainement partie des webmail les plus utilisés et dynamiques.
Par contre, il peut être très pénible à configurer, surtout si vous voulez proposer du multi-domaine.

En gros, lorsqu'un utilisateur se connecte, il écrit avec une adresse en "@localhost", c'est vraiment moyen si on veut lui répondre :s

Il faudrait le forcer à se connecter en précisant son adresse mail entière, autrement dit pas "toto" mais "toto@ledomaine.fr".
Je pensais que le formulaire roundcube exigerait une adresse mail valide juste avec du html5, mais non.

Heureusement, on peut préciser une expression régulière à laquelle doit correspondre le champ "login". j'en profite pour exiger une adresse mail complète, mais surtout restreindre aux domaines que je peux servir.

Dans la configuration de roundcube, ça donne ça :

//%s correspond au domaine indiqué dans le login
$config['username_domain'] = "%s";
$config['username_domain_forced'] = true;
$config['mail_domain'] = '%s';
// C'est quand même le serveur lui-même qui envoie et récupère les mails
$config['default_host'] = "localhost";
$config['smtp_server'] = 'localhost';
// Le filtre qui va bien sur le login
$config['login_username_filter'] = "/^[a-z0-9_.-]+@(3hg.fr|ouaf.xyz|yeuxdelibad.net)$/";
$config['login_rate_limit'] = 2;

Cette ligne devrait être présente par défaut, c'est bête comme tout et ça filtre pas mal de bruit. Détaillons-là un peu :

$config['login_username_filter'] = "/^[a-z0-9_.-]+@(3hg.fr|ouaf.xyz|yeuxdelibad.net)$/";
  • "^" : on indique le début de l'adresse mail, il n'y a rien avant
  • "[a-z0-9_.-]" : le nom d'utilisateur ne peut être composé que de lettres minuscules, chiffres, underscore et tiret
  • "+" : Les symboles précédents peuvent être répétés un nombre de fois indéterminé.
  • "@" : on exige ce caractère
  • "(domaine.net|autredomaine) : on liste les noms de domaines, séparés par des "|" et le tout entre parenthèses.
  • "$" : c'est la fin, il ne doit rien y avoir ensuite.

Allez zou, je laisse ça là et continue d'aller faire mumuse, le plugin enigma pour le support de gpg semble très intéressant.

C'est en lisant une proposition de création de paquet YUnoHost pour blogotext que j'ai eu envie de creuser l'idée. Comment faire pour porter une application sur YUNoHost.
Eh bien je ne suis pas du tout convaincu.

alt

Prenons Blogotext par exemple. Afin de l'installer, la procédure habituelle consiste à décompresser une archive zip, la déposer sur un serveur web puis en 3 clics c'est installé.
Les mises à jours se déroulent de la même façon.
Si une mise à jour est disponible, on est averti dans l'interface d'administration, c'est simple et ça marche bien.

Avec YUNoHost, il faut créer un paquet. Les instructions sont en ligne. Je ne suis pas habitué, donc des trucs ne me paraissent pas clairs...

  • Le fichier manifest.json. C'est facile de changer l'exemple, en gros on laisse la plupart des choses par défaut.
  • Le dossier "scripts" contient divers fichiers. Là, c'est plus délicat et je ne m'en sors pas. Il est dit de les modifier, mais je ne vois pas quoi dedans. Entre les modifications du parefeu oO, la gestion de systemd... Je suppose qu'il ne faut pas trop y toucher. Il y a bien des variables "EXAMPLE", mais sont-elles automatiquement modifées par ce qui est renseigné par l'utilisateur ou pas?

Il y a quelques boutons dans la doc ci-dessus, mais ils pointent sur des liens vides pour certains :s
Du coup je suis un peu déçu, j'aurais bien aimé aider à la diffusion de blogotext, mais je risque de faire un truc tout cassé ou bancal. Un exemple concret pas à pas, ça serait chouette. J'ai peut-être mal cherché.

J'avais créé un script qui s'appelait "hostathome" il y a longtemps. Il faisait à peu près la même chose que YUNoHost (en moins bien), mais ses défauts se retrouvent dans YUNoHost dans une certaine mesure :

  • Il faut faire confiance au mainteneur :
  • Les mises à jour sont dépendantes du mainteneur ;
  • Ça restreint énormément la configuration ;
  • On ne sait pas très bien ce qui se passe, et c'est vraiment problématique le jour où il y a un pépin.
  • Le système de base n'est pas très sécurisé car n'utilise pas OpenBSD ()

YUNoHost est une excellente initiative. Cependant, je crois que c'est une solution à court terme, puisque elle pose des contraintes plus que des libertés pour les raisons sus-citées. De plus, en cas de souci, l'utilisateur ne sait pas ce qui se passe, à moins d'être développeur chez YUNoHost, et je crains que ça ne soit trop décourageant et fasse abandonner la bonne idée de s'auto-héberger.

Avis mitigé donc, je suis curieux de connaître l'avis des utilisateurs convaincus de YUNoHost qui s'en servent depuis longtemps.

"C'est pas mon problème", "c'est pas de ma faute", "tant pis pour eux", "moi ça va"...
Trump élu, et choisi par un peuple (en bonne partie) et un système.
Aucune humanité devant les migrants qui fuient la guerre et la misère. Choix de la violence, délation même en France.
Consommation irréfléchie. "À gagner, un I-phone 7! (dont les matières premières sont obtenues dans des conditions bafouant complètement les droits humains).
Foutage de gueule par les dirigeants, l'hypocrisie règne...
On a le droit de ne pas être instruit, on peut ne pas avoir la chance de tout comprendre facilement, mais ne pas réfléchir et cultiver son ignorance, c'est juste impardonnable, merde! On peut être ignorant, mais pas bête sauf si vraiment on le cherche. Tout est bien expliqué dans cette intervention sur France Inter.
Allez, un peu de détente, on va faire un tour sur youtube... Y a quoi sur la page d'accueil de proposé ?
euh... vraiment, c'est ça le reflet de notre société ? Et on ose proposer des choses pareilles?

À quoi bon?

À quoi bon faire de son mieux?
À quoi bon montrer l'exemple?
À quoi bon instruire et éduquer?
À quoi bon tolérer la bêtise des autres?
Ça n'a pas de sens ce monde...

Peut-être un peu, si, au moins pour ces raisons : la musique, la danse, les histoires que l'Humain peut créer.

Merci aux créateurs qui me font frissonner en choisissant les bonnes notes, les bons rythmes...
Merci ces musiciens qui me transportent et font sentir vivant.
Merci aux auteurs de romans, nouvelles, BD, fictions.
Merci aux développeurs de jeux vidéos qui ont du talent (super nes ♥)
Merci, artistes du monde entier.
Vous me faîtes pleurer, vous me faîtes rire, et aimer la vie !

Au hasard, Robin Hobb, Frank Herbert, Azimov, Hugo, Bill Withers, Ben Harper, John Butler Trio, Metallica, Bill Waterson, Akira Toriyama, Eichiro Oda, Doctor Who, Black Mirror, ...

Allez, on coupe les télés, range les smartphones, et on va lire au coin du feu sous une couverture avec le chat qui fait ronron en écoutant un peu de musique.

L'autre jour, en ouvrant ma boîte aux lettres, je découvre un pli inattendu, avec ce qui ressemble à du mandarin ou du japonais dessus :

Oh! C'est une carte de voeux de linuxmario parti au japon!

Trop sympa!!! :)

Ça fait vraiment plaisir! Merci!
Qu'on se le dise, les libristes ont du cœur.

Pour ceux qui ne savent pas, blogotext est un outil développé en PHP offrant un espace personnel complet, cohérent et léger. Il me permet d'écrire ce blog, mais pas seulement :

  • Hébergement et partage de fichiers
  • Marque-page de liens, renvoyés automatiquement sur mon compte mastodon
  • Prise de notes
  • Lecteur de flux RSS.

Ces quelques fonctionnalités sont reliées entre-elles, ce qui en fait un outil indispensable et très pratique. Il reste très léger et rapide.

Vous l'aurez compris, j'aime beaucoup cet outil. C'est pourquoi je souhaite aider à son développement.

Pourtant, je n'ai jamais appris le PHP à l'école, le javascript non plus. Mes contributions sont donc à prendre avec des pincettes, et sans doute parfois maladroites, mais les autres développeurs sont très sympas et patients. Au final, j'apprends énormément et m'amuse bien. Dernièrement, j'y ai consacré un peu de temps. Certaines des contributions listées ci-dessous seront peut-être intégrées prochainement, ou en inspireront d'autres :

  • Proposition d'un bout de code pour optimiser les images uploadées sur le blog, afin d'accélérer leur chargement : #350 ;
  • Petites retouches au CSS pour utiliser le lecteur de flux sur petits écrans : #351 ;
  • Dans le lecteur de flux, je préfère cacher les abonnements sans nouveaux éléments. À voir si ça plaît : #353 ;
  • Addon pour installer des addons. Il y a des chances que ça soit intégré au cœur de blogotext plutôt qu'en module : #31 ;
  • Addon pour éditer plus facilement la liste des liens dans la barre latérale #38 ;
  • Addon pour proposer une page "à propos" : #40 ;
  • Mise à jour de deux addons pour proposer d'autres articles à lire, soit sous forme de liste en texte soit sous forme d'images : #41 ;
  • Addon pour avoir des résumés des articles avec un "lire plus" : #42 ;
  • Addon pour ajouter au blog un formulaire de contact : #43 ;
  • Addoon pour modifier l'image d'en-tête dans le thème par défaut plus facilement. C'est un élément de personnalisation simple et important pour donner une identité à un blog. Ce n'est pas dût d'éditer les fichiers d'un thème, mais une personne peu à l'aise avec ces notions pourra désormais le faire en quelques clics : #44 ;
  • J'ai envie de faire un script avec curl pour envoyer de nouveaux articles ou des fichiers. Pour l'instant, je ne passe pas l'étape d'identification, mais je n'ai pas tellement creusé.

je vous invite à participer au développement de blogotext. Une liste des "issue" est disponible sur github si vous cherchez par où commencer. Vous pouvez aussi regarder les addons, le système de hooks permet de faire des choses vraiment chouettes.

À vous de jouer ;)

Aux utilisateurs du CHATONS 3hg.fr et ouaf.xyz, en cette fin d'année, il est temps de faire un peu de tri.

Certains ne se sont jamais connectés avec leur comptes : sauf alerte de leur part, ils seront supprimés.
Certains comptes n'ont pas été utilisés depuis plus de 6 mois : ces derniers seront fermé aussi.

N'hésitez pas à nous faire signe si besoin.

logo 3hg

Pour ceux que ça intéresse, voici comment je procède pour savoir si un utilisateur a consulté ses messages. Non, je ne regarde pas les logs, c'est beaucoup plus simple : je regarde la date de dernier accès au dossier des utilisateurs. Dans l'exemple ci-dessous, c'est réglé sur 6 mois :


DOMAINS='3hg.fr
ouaf.xyz
yeuxdelibad.net'

for d in $DOMAINS; do
        for u in /mnt/bigstorage/vmail/$d/*; do
                if [ ! -d $u/Maildir ]; then
                        echo "Never logged : $(basename $u)"
                else
                        LASTACCESS=$(stat -f %m $u/Maildir)
                        if [ $LASTACCESS -lt $SIXMONTHAGO ]; then
                                echo $(basename $u)
                        fi
                fi
        done
done

Bon, c'est très spécifique à ma configuration, mais c'est juste pour l'idée.