Licence CC BY-SA

Nouvelle version. Nouvelle version !

Zeste de Savoir est passé en version 19 & 20

Après un long silence radio, les développeurs de votre site favori sont de retour !

Au programme : le passage en version 19, puis en version 20. Comme vous avez peut-être pu le remarquer, ces deux versions apportent un lot important d'évolutions. Sans plus attendre, découvrons lesquelles !

Enfin, nous reviendrons sur le changement qui s'est opéré au niveau de la direction technique du projet.

Précédemment, dans la version 19...

Après une très importante version 18, la version 19 a été déployée le 11 juillet 2016. Même si cette nouvelle version était beaucoup plus petite que la précédente, on y trouve certains changements fort intéressants.

Tout d'abord, une fonctionnalité très demandée a fait son apparition : vous pouvez désormais vous abonner à un forum ! Imaginons que vous souhaitiez être notifié à chaque fois qu'un nouveau sujet est ouvert dans l'antre des développeurs, la Dev Zone. Vous pouvez désormais, grâce à un clic dans la sidebar (à gauche), être notifié à chaque nouveau topic.

Vous avez peut-être également remarqué que la page Contact a été modifiée afin d'y inclure les membres de l'équipe Com' et les responsables de chaque groupe.

De nombreuses modifications mineures sont également à noter : mise en cache de menu afin d'optimiser les performances, la correction de nombreux problèmes dans le MarkDown grâce au travail de Kje, la possibilité de contacter tous les auteurs d'un tutoriel, etc.

Si vous êtes curieux, voici le changelog complet de cette version 19 :

Rapport pour la v19-mangoustan

29 tickets sont compris dans ce jalon (0 ouverts et 29 fermés)

Tickets fermé

Ticket # Titre Label(s)
#3623 Correction d'une faute d'orthographe sur la page de désinscription C-Front, S-BUG
#3563 Le titre des pages de validation n'est pas correcte C-Front, Facile, S-BUG
#3481 [v17.1] Elément "select" dépasse d'une modale C-Front, S-Régression
#3461 Pas de mail pour les résolutions d’alerte C-Back, Facile, S-BUG
#3459 Liens erronés sur « Mes tutoriels » ou « Mes contenus » C-Back, S-BUG
#3397 Incohérences sur le modèle PublishableContent C-Back, S-BUG
#3396 Paginer la page de l'historique des versions d'un contenu C-Back, S-BUG

Évolutions

Ticket # Titre Label(s)
#3727 Django 1.8.14 S-Évolution
#3609 Revoir la page de contact S-Évolution
#3608 Créer un sujet sur le forum du CA pour chaque demande d'adhésion S-Évolution
#3607 Mise en cache du menu C-Back, S-Évolution
#3539 Souscription a un forum. S-Évolution
#3288 Envoyer les commentaires des validateurs aux auteurs S-Évolution
#3057 "Contacter tous les auteurs" lors de la béta ou de la version publique C-Back, C-Front, Facile, S-Évolution
#2911 Ajouter les membres de l'équipe de communication sur la page contact C-Front, S-Évolution
#2707 Ne pas afficher les bannis dans l'autocomplete C-API, C-Front, S-Évolution
#2284 Message non lu non notifié C-Back, S-Évolution

Non défini

Ticket # Titre Label(s)
#3650 Refacto de template tags et de Topic never_read C-Back
#3619 Update markdownversion
#3602 Update markdownversion
#3583 Mise a jour de zMarkdown
#3580 Fix #3570 : corrige l'utilisation de debug_toolbar en prod
#3579 Fix #3571 : ajoute les dependances de production
#3578 Fix typo in tutorialv2/forms.py
#3574 Supprime fichier "path" crée dans les tests
#3554 Ajout de nouvelles phrases pour Clem
#3552 Met à jour les requirements Python C-Back
#3550 Mise à jour de la documentation d'installation sous Windows C-Documentation
#3538 Garder le nom d'utilisateur lorsque le mot de passe est faux

... et maintenant, la version 20 ! 🙋

Après une période de faible activité, causée par la vie bien remplie de nos développeurs, la version 20 de votre site favori a enfin été déployée !

En terme de tickets fermés, cette version est tout simplement la plus importante depuis plus d'un an. On y retrouve notamment de nombreuses corrections de bugs, telles que la fin des notifications persistantes, ou l'impossibilité de s'abonner plusieurs fois à un même sujet. Des corrections ont également été apportées afin qu'il soit désormais possible de s'inscrire et de se connecter sur Zeste de Savoir via votre compte Facebook. Au total, ce sont presque 50 corrections qui ont été apportées ; vous retrouverez la liste complète ci-dessous.

Mais surtout, de nombreuses évolutions ont été apportées, qui contribuent à l'amélioration constante de votre expérience utilisateur. Il vous sera à présent possible de vous abonner au contenu d'un membre : ainsi, vous recevrez une notification à chaque fois qu'un contenu du membre suivi est publié.
Pour cela, il vous suffit de se rendre sur sa page de profil.

N'attendez plus pour vous abonner à vos auteurs favoris !

Une autre amélioration qui vous sera sans aucun doute appréciable : lors de la création d'un contenu, afin de vous aider à choisir les tags de votre contenu, une auto-complétion est proposée.

Le choix de vos tags n'en sera que plus facile !

Il est aussi possible d'utiliser des émojis, un peu partout sur Zeste de Savoir : faites en bon usage ! 😄

L'arrivée des émojis !

Enfin, d'autres améliorations plus discrètes sont à noter, comme les notifications qui font leur apparition dans l'API, la possibilité de signaler un message masqué, ou encore l'amélioration de la page de maintenance sur mobile. Ci-dessous, le changelog complet de cette version 20.

Rapport pour le jalon Version 20

86 tickets sont compris dans ce jalon

Tickets fermé

Corrections de bug

Ticket # Titre Label(s)
#3885 Marque le MP de réservation du staff comme lue. C-Back, S-BUG
#3882 Ignore les tags utf8mb4 C-Back, P-Haute, S-BUG
#3877 Affiche le nombre de réponses pour les sujets et les mp. C-Front, S-Régression
#3875 Fix bug on no tag C-Back, S-Régression
#3872 Corrige les erreurs js dues aux modales C-Front, P-Haute, S-Régression
#3857 fix #3836, teste correctement la présence de caractères unicode de plus de 3 bytes C-Back, P-Bloquante, S-BUG
#3856 Ne dépend plus d'assets hébergés ailleurs P-Bloquante, S-Régression
#3855 Utilise le bon template pour la pagination des notifs. C-Front, S-Régression
#3852 Hotfix issue3847 C-Front, S-Régression
#3845 Pas de signalement MP; tests C-Front, S-Régression
#3822 Invalide le cache quand une notif est modifiée. C-API, S-BUG
#3819 Empêche d’éditer un message masqué C-Back, C-Front, S-BUG
#3816 Affiche les catégories dans le bon ordre dans la topbar. C-Back, S-Régression
#3814 Fix #3810 : ajout d'un template filter pluralize_fr C-Front, S-BUG
#3809 Correction des validateurs pour les membres C-Back, P-Bloquante, S-BUG
#3808 (fix) defaultdict -> dict pour le rendu topbar C-Back, C-Front, P-Bloquante, S-Régression
#3807 Renvoie les notifications lues et non lues. C-API, S-BUG
#3806 Corrige le pluriel pour le nombre d’abonnés C-Front, S-BUG
#3802 Ajoute des filtres safe dans certains templates C-Front, S-BUG
#3801 Permet de cacher les messages C-Front, S-Régression
#3798 Correction du compteur d'abonnés C-Front, S-BUG
#3795 Un long tag provoque une erreur 500 C-Back, S-BUG
#3794 Le message d'avertissement s'affiche en mode zen C-Front, S-BUG
#3791 Liste des notifications, template cassé C-Front, S-Régression
#3788 Numéro de version manquant S-Régression
#3779 URGENT / BLOQUANT / SITE HS : Certificat HTTPS de prod expiré C-Infra, P-Bloquante, S-Régression
#3778 [ci skip] Répare la config des tests locaux P-Haute, S-Régression
#3777 Répare l'affichage des MPs C-Front, P-Bloquante, S-Régression
#3773 Corrige un import dans zds.notification.views qui casse Travis C-Back, P-Haute, S-BUG
#3757 Ordonne les tags par popularité C-Back, S-BUG
#3738 Google indexe nos pages de recherche P-Haute, S-BUG
#3736 Cache menu par fragments C-Front, S-Régression
#3733 Retire les avertissements en lecture zen C-Front, S-BUG
#3730 Correction du script de MEP C-Infra, P-Haute, S-BUG
#3728 Strip tags C-Back, P-Haute, S-BUG
#3722 Répare l'admin django pour les topics C-Back, P-Haute, S-BUG
#3714 utf8mb4 Script de migration & doc C-Back, C-Infra, S-BUG
#3713 Documente gunicorn pid et IP serveurs C-Infra, S-Régression
#3706 La réservation d'un contenu crée un MP sans le validateur C-Back, Facile, S-BUG
#3689 Les tests ne passent pas suivant la gitconfig utilisateur C-Back, S-BUG
#3688 Ajout des sitemaps au robots.txt Facile, S-BUG
#3685 Possible de s'abonner deux fois à un sujet (et d'avoir une erreur 500 après) S-BUG
#3668 Problème de rendu des smileys dans une citation C-Front, S-BUG
#3658 Texte incohérent au niveau des notifications C-Front, Facile, S-BUG
#3642 [v18] Un tag trop long provoque une erreur 500 C-Back, S-BUG
#3463 Erreur de dépendance dans la documentation d'installation C-Documentation, Facile, S-BUG
#2217 Impossible de se connecter à partir de Facebook C-Back, S-BUG

Évolutions

Ticket # Titre Label(s)
#3823 Fix #3692 : Ajout doc HTTP/2 + reset du cache lors d'une MEP C-Documentation, C-Infra, S-Évolution
#3775 Ferme la bêta des articles à la publication C-Back, S-Évolution
#3774 Ajoute bouton « retour à la liste des sujets » C-Front, S-Évolution
#3759 Permet de signaler un message masqué S-Évolution
#3758 Supprime le bouton d’envoi de MP sur les profils bannis S-Évolution
#3747 Documente les milestones C-Documentation, S-Évolution
#3744 Supprimer model_name.py C-Back, C-Documentation, Facile, S-Évolution
#3739 Liste les notifications dans l'API. C-API, S-Évolution
#3709 Envoyer un sujet dans le bugtracker. S-Évolution
#3705 [ci skip] Ajoute editorconfig C-Back, C-Front, Facile, S-Évolution
#3699 Affiche la liste des notifications. S-Évolution
#3697 Nouveau MP : « Un des participants saisi est introuvable » ← lequel ? S-Évolution
#3696 Amélioration de la page de maintenance sur mobile S-Évolution
#3671 Changer le nombre de contenus par page C-Front, Facile, S-Évolution
#3645 Supprimer les fonctions des tutoriels du SdZ C-Back, Facile, S-Évolution
#3509 Utiliser l'autocomplétion pour le champ des tags quand on édite/créé un contenu C-Back, C-Front, S-Évolution
#3472 Optimiser Travis S-Évolution

Non défini

Ticket # Titre Label(s)
#3874 Converti auth_user en utf8mb4 C-Back, P-Bloquante
#3826 Empêche d’éditer un message masqué C-Back
#3815 Affichage du nombre d'abonnés C-Front
#3789 Serveur de beta anormalement lent C-Infra, P-Bloquante
#3786 Résout le bug de notification lors du déplacement de sujet
#3781 (doc) Ajout des fichiers de configuration de production C-Documentation, C-Infra
#3769 Update config nginx subdomains C-Infra, P-Haute
#3768 Corrige le bouton Valider des modales de l'éditeur
#3767 Masque la biographie des membres bannis définitivement
#3761 #3620 Fix url images import
#3756 Correction (orthographe)
#3755 Invalide le cache de l'API à chaque entrée dans la base C-API, P-Haute
#3753 Ajout de sitemap pour /pages/
#3750 update markdown version
#3731 [ci skip] Adapation aux nouveaux tags C-Documentation, P-Bloquante
#3726 Merge de la branche hotfix-v19 vers dev pas fait P-Bloquante
#3698 Les formules mathématiques ne fonctionnent pas sur les forums
#3694 Permettre de suivre les contenus d'un membre
#3693 Correction d'un lien mort dans la doc
#3691 Optimise les tests
#3669 Faute d'orthographe dans le README.
#3651 Remplacement de l'adresse d'OVH par celle de Gandi

🔥 Ça va plus vite, vous avez remarqué ?

Côté serveur, cette nouvelle version est la première à utiliser MySQL 5.6 au lieu de MySQL 5.5. C'est pas une révolution, mais ça a rendu le support des émojis nettement plus simple ✌🏾. Une compétence absente de notre équipe technique est celle de DBA (l'expertise d'administration de base de donnée). Nous faisons de notre mieux et nous nous en sortons bien, mais si une perle se cache parmi nos lecteurs, qu'elle se dénonce ! Une configuration MySQL aux petits oignons, ce serait chouette.

Pendant quelques jours nous testons une réduction drastique (de 256Mo à 16Mo) de la mémoire allouée au Query Cache, le cache chargé de garder en mémoire certaines requêtes SQL. L'impacte est pour le moment positif, voici ce qu'on observe :

  • Les statistiques du cache sont presque inchangées :
    • on garde environ le même nombre de requêtes en cache qu'avant,
    • la grande majorité des demandes faites au cache sont des "hits" (c'est à dire qu'on demande au cache s'il a une requête, et qu'il répond "oui").
    • Par contre le cache étant nettement plus petit, il subit plus souvent des élagages ("pruning" - MySQL évince sélectivement et partiellement certaines requêtes du cache pour ne pas dépasser la limite de mémoire). Semble-t-il sans impact.

Graphe des statistiques du Query Cache de MySQL

  • De façon un peu surprenante, et difficile d'imputer ceci au cache ou aux améliorations apportées par MySQL 5.6, on remarque clairement que beaucoup moins d'opérations sont effectuées en base de donnée. Et ça, c'est très positif.

Graphe des lignes sélectionnées par MySQL

  • Nous avons également modifié la configuration de Django pour qu'il cache les templates. Le mécanisme est simple, le résultat impressionnant.
    • Par défaut, quand on demande une page, après avoir traité les données à mettre dans la page Django va chercher sur le disque du serveur le template dans lequel il va rendre les données. Il cherche donc le fichier, le lit, parse le langage de template, l'évalue, génère la page HTML qui est ensuite envoyée au client.
    • Désormais, Django ne fait ce travail que lorsque le site démarre. Au lieu de le faire à chaque affichage d'une page, il le fait à chaque mise en production. Il lit tous les templates, les parse, et les garde en mémoire. Quand on demande une page, il n'a qu'à évaluer le template en mémoire et paf, rendre la page aussitôt.

Jugez plutôt :

Graphe des temps de chargement des pages

Tableau préparé par SpaceFox :

Page v19 v20 Temps de réponse divisé par % de l'ancien temps de réponse
Accueil 320 ms 210 ms 1,52 66 %
Accueil des forums 510 ms 400 ms 1,28 78 %
Une catégorie 470 ms 300 ms 1,56 64 %
Un topic 570 ms 220 ms 2,59 39 %
Un big-tuto 210 ms 130 ms 1,62 62 %
Un mini-tuto 500 ms 180 ms 2,77 36 %
Un article 710 ms 250 ms 2,84 35 %

Et enfin, comme on passe environ 2x moins de temps à créer une page, on remarque que Nginx, notre serveur web, en fait environ 2x moins, logique :

Graphe des statistiques du serveur HTTP Nginx

De l'autre côté du renard

Après pile deux années passées à ce poste, notre DTC (directeur technique) SpaceFox a décidé de passer le flambeau. La contribution de SpaceFox à la gestion technique de ZdS a été exemplaire d'engagement et de qualité. La plateforme se porte bien, la codebase n'a cessé de s'améliorer, l'infrastructure est bonne. Le projet était sur la bonne voie, il l'est resté et le restera.

Au 1er juillet 2016, la direction technique de Zeste de Savoir a été reprise par gustavi et victor.

Un très grand merci à SpaceFox pour tout son travail. Il nous laisse un projet qui donne envie d'être maintenu. Sa disponibilité exceptionnelle, le bon déroulement de la remise des clés du projet, son aide et son soutien lors des différents problèmes survenus après cette transition, ses connaissances pointues et sa motivation ont été extrêmement précieux et appréciés.

Prenant toute la mesure de l'ampleur actuelle du projet, nous sommes ravis de la confiance qui nous est accordée par le Conseil d'Administration de Zeste de Savoir.

Notre mandat à ce poste, nous souhaitons l'articuler autour des 3 axes suivants :

  1. Encourager activement les contributions à la plateforme technique de Zeste de Savoir, en misant sur plus de diversité au sein l'équipe.

    • ZdS s'est muni il y a quelques mois d'un code de conduite. Nous nous appuyons sur ces quelques règles pour garantir un environnement sain et sûr pour toute personne souhaitant participer au développement.
    • Vous n'avez pas besoin de connaitre les technologies que nous utilisons pour pouvoir contribuer à améliorer ZdS. Toute contribution est bienvenue, peu importe votre niveau de compétence ou d'expérience. Il n'y a pas de mauvaise proposition, pas de question bête, pas de PR "trop triviale". Nous sommes présents pour vous aider à aider ZdS.
    • Contribuer à un projet libre tel que celui-ci est une belle opportunité - saisissez-la ! C'est l'occasion d'apprendre en faisant. De faire un premier pas dans le libre ou l'open source. De faire partie d'une communauté qui ne vous jugera pas. De prouver à un employeur que vous savez programmer, travailler en équipe et vous engager dans un projet - le tout avec le soutien d'une équipe technique prête à vous faire confiance, à vous épauler dans tous les aspects de la contribution à un projet libre. Le meilleur moyen de perfectionner son apprentissage de la programmation est de lire du code et d'avoir des gens qui relisent votre code, et de travailler avec des gens de différents niveaux d'expérience. Nous vous offrons tout ça. Allez viens, on est bien bien bien bien bien !
  2. Améliorer la qualité de ZdS en tant que projet libre. Cela signifie améliorer la qualité de la codebase et affiner le processus de développement. Continuer à créer du logiciel performant en respectant les bonnes pratiques, avoir une documentation adéquate.

  3. Continuer à gérer les affaires courantes : corrections de bugs, nouvelles fonctionnalités, mises en production, etc.

victor, gustavi


Dans le prochain Récap' Communautaire, les statistiques de fréquentation de Zeste de Savoir vous seront présentées. Sachez simplement qu'elles sont historiques : Zeste de Savoir n'a jamais été autant visité !

L'occasion de remercier tous les gens qui participent au développement de la plateforme, œuvrant à vous fournir un site de qualité. Nous adressons un merci particulier à tous les nouveaux contributeurs qui font leurs premiers pas dans le projet afin de donner un nouveau souffle à l'équipe : nous espérons que l'aventure sera longue !

20 commentaires

Bonjour, Merci pour votre travail. Si jamais vous seriez tenté de passer sur Postgres je serai ravi de vous aider :)

fouinix

La base initialement choisie était PostgreSQL mais les tests menés ont montré que MySQL était plus avantageux au final.

elyppire

Yep, et franchement on a eu plein d'ennuis avec MySQL. Les limites de tailles d'indexes, le fait qu'il soit impossible de changer un schéma dans une transaction…

Sauf erreur y'a un léger gain de perfs avec MySQL à notre échelle (toute petite échelle, donc). On a un driver qui réutilise les connexions, un genre de pooling probablement, là où psycopg en créé de nouvelles à chaque fois, je présume que ça vient du modèle de pg où chaque requête est un thread. Mais j'ai pas exploré plus que ça et changer le tout, là maintenant, c'est tout sauf une priorité.

Peut-être un jour. Faut voir, c'est une grosse décision. On a investi beaucoup de temps dans MySQL. Changer pourrait nous éviter d'encore perdre du temps avec, mais c'est un pari et on peut pas savoir si on aura un retour sur investissement dans 3 mois ou dans 10 ans. Vu nos ressources actuelles, en tout cas, on va probablement rester sur MySQL bien quelques temps. Même si je préfère 100x postgres, et que dans mes autres projets c'est mon choix par défaut.

C'était un choix réfléchi et justifié au début du projet, il y a quelques années. C'est un choix qui reste valable en ce moment, dans le sens où ça tourne bien. La v20 a été un cauchemar niveau MySQL, mais maintenant que c'est fait, a priori on va pas y reperdre des semaines dans les mois qui viennent.

+2 -0

Toute contribution est bienvenue, peu importe votre niveau de compétence ou d'expérience. Il n'y a pas de mauvaise proposition, pas de question bête, pas de PR "trop triviale". Nous sommes présents pour vous aider à aider ZdS.

victor, gustavi

Je commence tout doucement à m'intéresser au développement du site, et je dois dire que cette partie du discours est bien vrai ! L'issue tracker du site est un lieu très agréable, toujours du monde pour nous aider, nous, ceux qui arrivent sur le projet. Ça donne envie de s'investir. :)

Bon, les emojis dans l'article, c'est un peu triché, parce que c'était déjà OK par défaut ;)

pierre_24

Nope, j'ai dû convertir toutes les tables. Absolument toutes. Aucune n'avait la collation mysql permettant d'insérer ces caractères. D'ailleurs c'était le gros problème. Imagine tu passes 6h à rédiger un truc qui commence par un émoji et tu sauves ton contenu qu'à la fin. Avant, t'aurais tout perdu. :)

+0 -0

La toute première version privée du site utilisait Pstgresql. Sauf que personne dans l'équipe ne savait s'en servir, et qu'à la première migration un peu tordue on s'est retrouvés coincés.S'est posé la question de MySQL, qui lui était connu.

Historiquement, notre utilisation sous-optimale de l'ORM Django faisait que le SGBD se prenait des quantités délirantes de requêtes SQL, mais des requêtes simples (en gros, que des select sur PK).

Donc le serveur de BDD se touchait la nouille, mais on perdait un temps monstrueux dans les connecteurs Python <–> SGBD. Ceux de MySQL étant plus efficaces que ceux de PostgreSQL, il n'y avait aucune raison de rester sur ce dernier.

La situation actuelle est très différente et si quelqu'un est a un test sur ZdS avec un avantage clair et qu'on a la compétence, PostgreSQL peut redevenir intéressant.

À noter que le grand cache RAM de MySQL permettait d'accélérer les indexations à l'époque où on ne savait faire que du full. Là encore ça a changé.

Superbe !

mais … on attend toujours le déroulement des menus au survol :-°

edit : j'ai fait vite fait un fixe via FF, et ça fonctionne :)

j'avais aussi regardé le code (et fouillé dans les plus vieux commits pour en trouver un de firm1 qui avait joué avec les prefs de l'utilisateur, et plus particulièrement un has_mouse_over ou qqc comme ça (la variable pointant sur l'ouverture au survol des menus donc)) y a longtemps, et je pense pouvoir fixer ça par un commit très bref :) si je me rappelle comment faire x)

sinon, voici un petit bout de code pour fixer juste une partie du header :

1
2
3
<a href="/articles/" class="mobile-menu-link has-dropdown" id="test001" onmouseover="document.getElementById('test001').className = 'mobile-menu-link has-dropdown active;' onmouseout="document.getElementById('test001').className = 'mobile-menu-link has-dropdown;'">
                                    Articles
</a>        

Je pense qu'un if sur les prefs de l'user dans la génération du template suffirait ^^

+0 -1

Vraiment bravo pour les corrections et les perfs très significativement améliorées !

Il vous sera à présent possible de vous abonner au contenu d'un membre : ainsi, vous recevrez une notification à chaque fois qu'un contenu du membre suivi est publié.

Quel type de publications cela concerne-t-il ? Les tutos, les articles, les posts sur le forum ?

Je suppose qu'il s'agit simplement des "contenus" à proprement parler, c'est à dire tutos+articles, mais ce n'est pas clair.

+0 -0

Version 20.4 en production (et en bêta), correction du renvoi du courriel de validation lors de l'inscription. Temps d'indisponibilité du site : 10s :)

+6 -0

Temps d'indisponibilité du site : 10s :)

C'est inadmissible. Ce temps est trop court pour nous permettre de nous plaindre. Je demande que le temps de mise en production soit d'au moins 30 minutes, afin que nous puissions pester de l'incompétence des bénévoles qui gèrent ZdS ؟

+13 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte