Blog

641aea2b86047.jpg

Arrêt du serveur le 22/03/2023

22/03/2023 | 0 commentaire | Non classé

Hello ici !

Le serveur subira une courte interruption ce mercredi 22 mars, entre 16h30 et 18h00, afin de monter le nouveau processeur Xeon dans le serveur, afin de faire baisser la charge du système. Tout reviendra en ordre passé 18h00 (si tout va bien ^^).

Ce blog, le forum et la documentation seront indisponibles pendant ce court laps de temps.

Merci !

6418aaac8220e.png

Déménagement et auto-hébergement

20/03/2023 | 3 commentaires | Non classé

Bonjour ici.

Il y a bien longtemps que je n'avais rien posté de technique. Enfin, ça l'est un peu mais ça n'est pas le sujet du jour. Non, aujourd'hui il est question de déménagement et d'auto-hébergement.

TuxFamily

Depuis le début du projet, soit en août 2022, 299Ko était hébergé par TuxFamily. J'ai déjà parlé de cette association, qui vise à promouvoir le logiciel libre. Mais depuis peu, le forum commence à vivre tranquillement, les utilisateurs s'intéressent, posent des questions, hébergent des images, ... Et l'hébergement offert par Tuxfamily ne suffit malheureusement plus.

En effet, les limitations, normales à mon sens, sont un peu trop restrictives pour héberger un site vivant. Il s'agit de 200Mo par site, sur un serveur tournant sous Debian 10 dont les services commencent à dater (PHP 7.3 et une vieille MySQL 5.6 de mémoire). Si c'était suffisant pour le blog et un petit forum sous MyBB, on est vite contraint lorsqu'on veut mettre en place des outils plus modernes.

Déménagement

Aussi, j'ai pris la décision il y a 2 semaines de migrer au fur et à mesure les services de 299Ko. Le but est de se libérer des contraintes imposées, et de pouvoir appliquer du composer, du PHP 8, et surtout de la place.

Pour les outils, j'avais déjà Flarum, un excellent CMS de board qui me faisait de l’œil. Et pour la documentation, je souhaitais changer du principe des pages statiques proposées par 299Ko pour un truc qui permette à plusieurs membres d'écrire, un wiki en somme. Et je suis tombé sur BookStack, un excellent wiki déjà en ligne qui remplacera la documentation et la gestion des téléchargements, toujours dans l'optique de pouvoir travailler à plusieurs.

Mais si le choix de se passer de TuxFamily était fait, il fallait se résoudre à avoir un hébergement, mais aussi un nom de domaine. Désireux de mettre le moins possible la main au porte-monnaie pour ce projet, j'ai été faible et ai donc pris un nom de domaine chez OVH : https://299ko.ovh

Le nom est court, mais il est facile à retenir selon moi. Et il n'est pas cher ^^

Auto-hébergement

J'ai un nom de domaine, c'est bien, mais je n'ai toujours pas d'hébergement. Dans l'optique de faire de ce projet une vraie partie intégrante de ma vie, j'ai vite compris que je pouvais l'héberger moi-même. Oui, j'ai depuis près de 2 ans un serveur qui tourne chez moi, et je peux en faire ce que je veux. C'est un HP Proliant MicroServer Gen 8, qui fonctionne très bien, et qui tourne déjà, aussi ça ne me coûte rien de plus en électricité. En plus, je viens de terminer l'installation de 2 panneaux solaires, justement destinés à ôter tout ce talon électrique (le serveur, le frigo, la box internet). Peut-être que j'y reviendrai un jour, tellement je trouve cette démarche sympa.

Coté performance, la bête est sur un Intel Celeron, que je remplacerai par un Xeon 1265L V2 dès que je l'aurai reçu, avec 8 Go de RAM, et 4 disques WD RED de 2 To montés en RAID 5. Faut pas que j'oublie de faire des sauvegardes malgré tout ^^

Là où le bat blesse pour le moment, c'est ma petite connexion internet en VDSL2 de 70Mo en DL et 10Mo en UP. La région me promet la fibre sous quelques mois, espérons 🤞

Limitations

Ben oui, bien que je sois satisfait du serveur, je ne m'appelle pas OVH non plus. Par exemple, je n'ai pas d'onduleur, aussi si j'ai une coupure de courant ou même d'internet, il faudra que vous fassiez une pause et vous aérer un peu en attendant que ça revienne ^^ Ne me tombez pas dessus si vous n'avez pas pu finir de lire une conversation et que ma femme a débranché le serveur pour passer l'aspirateur, ça ne changera rien 😁

La connexion internet joue aussi : J'ai essayé de prendre des softs peu gourmands en bande passante, mais si le nombre d'utilisateurs et de visiteurs croît, il faudra peut-être s'armer de patience en attendant l'arrivée de la fibre.

Bref, tout ça pour dire que le projet 299Ko prend une dimension un peu plus importante, et que les choses changent, mais j'y reviendrai (pour sûr :) ).

N'hésitez pas à faire un tour sur le forum histoire de poser une question ou suggérer des améliorations, j'y suis bien plus présent que sur les réseaux sociaux, et en plus il y a du monde sympa :)

Version 1.0.2

05/01/2023 | 0 commentaire | Non classé

Bonjour tous.

Petite news pour signaler que je viens de publier en crash une nouvelle version, la v1.0.2.

Celle-ci corrige un bug d'affichage des pages qui pouvaient apparaître sur le plugin Page, dans la partie administration.

Au passage, j'en ai profité pour inclure une fonctionnalité demandée : La suppression automatique (en un clic) du fichier install.php lorsqu'il est encore présent à l'issue de l'installation.

N'hésitez pas à poster vos retours et soucis sur le forum de 299Ko, toute discussion est la bienvenue :) Vous pouvez même poster un message sans vous enregistrer, mais vous perdez quelques fonctionnalités bien sûr.

Merci !

6361278b3e227.png

Le Moteur de Templates

01/11/2022 | 0 commentaire | Non classé

Ca y est, je viens de commit un gros pavé sur le Git de 299Ko, bouclant un chapitre entamé avant la sortie de la V1 : Un moteur de templates PHP pour 299Ko.

Moteur de templates ?

Pour ceux qui ne connaissent pas, un moteur de templates est une librairie qui permet d'interpréter du code écrit dans du HTML et de le transformer en PHP. Au lieu du code PHP dans la partie affichage, nous n'allons plus avoir que du HTML et des 'pseudos codes'.

Concrètement, nous allons pouvoir pleinement séparer la partie traitement, le code PHP pur, de la partie Vue, le code HTML.

Selon la syntaxe choisie par le moteur de templates, on aura par exemple cette syntaxe :

Par exemple, pour afficher une variable dans un div :

// Dans un fichier .php
?>


// Dans un fichier .tpl avec un moteur de templates

Cela va simplifier énormément la mise en page et surtout, permettre d'avoir une meilleure lisibilité de la Vue. En effet, les fichiers 'header.php' et 'footer.php' sont remplacés par un 'layout.tpl', dans lequel on injecte le contenu de la page (variable {{ CONTENT }}.

Lequel ? Twig ? Smarty ?

Si vous connaissez les moteurs de templates, vous n'êtes pas sans savoir que Twig, développé par les créateurs du framework Symfony, et Smarty, certainement le plus ancien et populaire des moteurs de rendu, sont assez 'gros'.

S'ils permettent de faire beaucoup de choses, ils sont malheureusement très lourds, et ce n'est pas dans l'esprit de 299Ko, qui se veut l'anti usine à gaz. Aussi j'ai développé un moteur de templates (presque) spécialement pour ce CMS. Il se compose d'une seule classe et couvre tous les besoins nécessaires dans notre cas.

Comme j'avais déjà utilisé Twig, j'ai décidé d'en reprendre sa syntaxe qui pour moi est assez claire.

Que pourra t-on faire avec ?

Pour le moment, et je pense que ça ne bougera pas, il suffit à remplacer toute la partie Vue du code des plugins. En voilà quelques lignes de code, que j'ai tiré de mes tests :

Afficher une fonction avec 2 paramètres :

{{ test[oui,non] }}

Appeler une methode statique d'une classe :

{{ show.mainTitle[

#mainTitle#

] }}

Ici on affiche le titre principal en fournissant un argument

Appeler un Hook :

{% HOOK.ACTION.adminSandBoxAction[un, deuxxx] %}

Les boucles :

$arr = [
        0 => [
        'name' => 'Je s\'appelle Groot'
                ]
        ,1 => [
                'name' => 'Je s\'appelle Second élément'
        ]
];
$tpl->set('monArray', $arr);

{% FOR Arra IN monArray %}
        MOI : {{ Arra.name }} 
Ma clé est : {{ Arra.KEY }}
{% ENDFOR %}

La variable KEY est automatiquement affectée à chacun des items du tableau, avec pour valeur sa clé.

Résultat :

MOI : Je s'appelle Groot Ma clé est : 0 MOI : Je s'appelle Second élément Ma clé est : 1

Tests de condition :

{% IF mode %}
        Le mode est actif
{% IF action == 2 %} L'action est edit {% ELSEIF action === plop %} L'action est plopi :) {% ELSE %} L'action est autre {% ENDIF %} {% ENDIF %}

Enfin bref, vous avez compris le principe ;)

Ca ne fait pas tout

A contrario de Twig, je n'ai pas souhaité insérer des fonctions qui permettent par exemple d'afficher des majuscules, d'échapper des caractères etc, car c'est selon moi de la partie traitement, et cela n'a rien à faire dans la vue. Les tests de condition, s'ils sont pleinement fonctionnels et peuvent être imbriqués, ne permettent pas de faire des condition de fou : La vue n'est pas le lieu.

Pour finir

J'espère pouvoir modifier les fichiers PHP pour les basculer en Templates rapidement. Pour le moment, les 2 systèmes peuvent cohabiter, et je pense que cela restera ainsi pour la version 2 définitive. J'en profite pour signaler que si jamais vous souhaitez filer un petit coup de main, toute aide est la bienvenue, je suis prêt à vous aider ;)

635b9bccd60b5.png

Suppression de jQuery

28/10/2022 | 0 commentaire | Non classé

C'était une idée voulue depuis le départ, la suppression de jQuery dans 299Ko. Faute de temps, et de priorité, cela n'a pas pu être fait dans la version 1. Mais j'ai pu avoir un énorme coup de main 😃

jQuery

Pour ceux qui ne connaissent pas, jQuery est une bibliothèque JavaScript permettant de simplifier l'écriture des scripts coté navigateur. De façon moins théorique, il facilite les effets visuels des pages Internet comme un affichage progressif des éléments masqués (Slide), ou une manipulation des éléments du DOM.

Il faut avouer que lorsqu'on est plutôt comme moi orienté back-end, comprenez langage serveur (PHP ici), jQuery a grandement facilité ce coté des choses, puisqu'il possédait une courbe d'apprentissage bien plus rapide que le JavaScript pur (vanilla JS). De plus, à la création de 99ko (2010 je crois), certaines fonctionnalités de cette librairie était très difficiles à mettre en place pour les non initiés.

Alors, pourquoi s'en passer ?

Notez bien que j'ai dit "possédait". Et oui, si jQuery n'a pas énormément changé depuis 2010, les navigateurs l'ont fait, et surtout depuis 2015, avec la norme ECMAScript 2015. Concrètement, cela signifie que les navigateurs ont dû implémenter la majorité des fonctionnalités de jQuery en natif. Et ça ça change la donne. A tel point qu'à présent, sans trop peu d'efforts, on peut se permettre de s'en passer.

Car il y a toujours un revers de médaille. Forcément, même si 299Ko appelait jQuery depuis un CDN, cela ajoutait malgré tout une latence supplémentaire, comme à chaque appel de fichier. De plus, celui-ci charge énormément de fonctions alors que notre CMS n'en utilise peut-être que 3 ou 4.

Aussi, c'était déjà décidé, encore fallait-il le faire.

Merci

Pour cela, j'ai pu compter sans même lui demander sur un blogueur que je connaissais déjà depuis 4 ou 5 ans. Il s'agit de ShevAbam, qui a réécrit quasiment toute la partie JS de 299Ko, faisant bondir le projet de suppression de jQuery d'un énorme pas en avant.

Par exemple :

// jQuery
$(document).ready(function () {
    $(".msg").each(function (index) {
        $(this).children(".msg-button-close").click(function () {
            $(this).parent().dequeue();
        });
        $(this).delay(5000 + index * 5000).slideUp();
    });

// vanilla

    function fadeOut(el) {
        el.style.opacity = 1;
        (function fade() {
                if ((el.style.opacity -= .03) < 0) {
                        el.style.display = "none";
                } else {
                        requestAnimationFrame(fade);
                }
        })();
    }

document.addEventListener("DOMContentLoaded", function () {
        document.querySelectorAll('.msg').forEach(function (item, index) {
        item.querySelector('.msg-button-close').addEventListener('click', function () {
            fadeOut(item);
        });
        setTimeout(function () {
            fadeOut(item);
        }, 5000 + index * 5000);
    });

Il n'y avait plus qu'à supprimer l'appel à la librairie dans le cœur du CMS, et c'est fini.

Un énorme merci à ce touche à tout. Je vous incite d'ailleurs à jeter un œil à son blog, plein de bonnes lectures. Vous y trouverez des réalisations persos ou des liens intéressants, comme de la génération de données JSON que j'utilise souvent :)

Normalize

Pendant qu'on y était, la librairie CSS normalize a également été supprimée au profit d'un simple Reset CSS inclut directement dans le thème, afin de pouvoir supprimer ce reset dans le thème utilisateur et encore et surtout, gagner encore un peu de temps à l'affichage d'une page :)