Author Topic: Grand nettoyage : épuration du code et features  (Read 78111 times)

Offline POYO

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 315
  • Bonus Pute: 67
  • Et bonsoir.
    • Pragmastick
Re: Grand nettoyage : épuration du code et features
« Reply #30 on: 16 March, 2016, 13:54:41 »
Bon les gars, c'est l'heure de la méga réunion de crise.

Je viens de me rendre compte après plusieurs heures qu'il va vraiment y avoir du boulot.

Pour refaire tout au propreau niveau des entrées en base données, on va avoir un gros gros problème.

Pour faire simple, on va commencer par "comment on stocke une information comme une critique en base de données".

En gros, on passe par un formulaire de saisie, puis on envoie ces données dans la base. Données qui vont se ranger là où il faut pour qu'on les appelle quand on veut l'afficher. Jusque là, rien de bien compliqué.

La plupart du temps, on se sert de bbcode pour éviter de laisser passer des injections de code. Une injection de code, c'est très con, ça consiste à entrer des balises html et du code php dans un formulaire pour faire des trucs directement dans la base de données, genre tout effacer dedans et autres joyeuseries. Donc en gros, on saisit son texte avec le formatage en bbcode, au moment de le stocker, on vire toutes les balises html qui sont présentes dans la saisie, et on transforme les balises bbcode en html. Comme ça on est certain que les seules balises html présentes dans le produit fini sont les balises de formatage que l'on veut, on sait qu'elles sont innofensives et tout va bien dans le meilleur des mondes.

Donc schématiquement, on a un truc du genre :

Saisie de la critique avec bbcode --> On lance le script qui supprime les balises html et transforme [y]texte[/y] en ce qui nous arrange --> On valide et on rentre les données dans la base pour qu'elles s'affichent quand on les appelle.


Sauf que je me rends compte que les données qui sont stockées dans la base de données sont stockées telles quelles. Pour faire court, au lieu de transformer les bbcode en balises html avant de le stocker dans la base, on enregistre directement les entrées dans la base pour ensuite les réinterpréter au moment où on l'affiche. C'est d'une part monstrueusement lourd pour le serveur, d'autre part ça cause des bugs au niveau de l'affichage, notamment pour les liens et les images.

Schématiquement :

Saisie de la critique avec bbcode --> On stocke tout tel quel --> Sur toutes les pages du site, au moment où on affiche la critique, on lance un petit script qui va venir tout mettre en forme.

Malheureusement, ça veut dire deux choses. D'une, si vous voulez que j'arrange ça, il va falloir que je remette à jour toute la base de données. Ca veut dire ressaisir absolument toutes les critiques, tous les dossiers, en bref, toutes les entrées susceptibles de contenir le fameux bbcode. Autant dire que ça prendra pas mal de temps, que je dois refaire toute le module de saisie, et que je dois aussi faire gicler tout le site temporairement. le temps que ce soit fait. De deux, ça veut dire que je dois avoir accès aux tables de la bdd. Parce que je dois vérifier que ce que je rentre crée pas de conflits en bdd. Je passerai sur les problèmes techniques chiants consistant à savoir comment je vais me démerder pour permettre l'édition de ce qui a déjà été rentré (aka passer du html au bbcode pour que ce soit plus clair pour vous) parce que d'une part vous vous en foutez, d'autre vous ne verrez pas la différence au final. Du coup, je crois que c'est Cobra qui a les clés.

Donc j'attend votre avis, surtout ceux des tauliers, et je commencerai a essayer de résoudre ça comme il se doit une fois qu'on saura quoi faire exactement.


Ah, et du coup, quitte à rebidouiller toutes les saisies en base, c'est tout aussi simple de tout refaire au propre. Charte graphique incluse.

Offline Bazart

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 2 157
  • Bonus Pute: 126
  • Enculé ! S'en prendre à un bébé !
Re: Grand nettoyage : épuration du code et features
« Reply #31 on: 16 March, 2016, 14:19:41 »
Question con : tu peux pas faire un coup de htmlentities() ou autre moulinette qui enregistre les données en "moche" ?

Offline POYO

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 315
  • Bonus Pute: 67
  • Et bonsoir.
    • Pragmastick
Re: Grand nettoyage : épuration du code et features
« Reply #32 on: 16 March, 2016, 14:38:03 »
Si, c'est déjà un peu le cas d'ailleurs. Mais ça ne résoud rien au problème, on stocke toujours un truc brut dans les bases.

Offline Bazart

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 2 157
  • Bonus Pute: 126
  • Enculé ! S'en prendre à un bébé !
Re: Grand nettoyage : épuration du code et features
« Reply #33 on: 16 March, 2016, 14:51:18 »
T'aurais un sample d'une entrée de critique? Histoire de comprendre un peu mieux  :).

Online ɯɐʇ

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 1 999
  • Bonus Pute: 113
  • ?x???? ¡¡¡¡¡
Re: Grand nettoyage : épuration du code et features
« Reply #34 on: 16 March, 2016, 14:57:20 »
(...) C'est d'une part monstrueusement lourd pour le serveur, d'autre part ça cause des bugs au niveau de l'affichage, notamment pour les liens et les images.

heu, d'un point de vue technique ça se tient tout à fait ce process non ?

je veux dire en stockant tout sous son propre code (bbcode) on fait abstraction du render, et rien n’empêche demain de faire du render sur n'importe quoi (OK tu me diras la probabilité que ce ne soit pas du HTML est faible mais tu vois le principe...).

ensuite soyons clair, du rewriting à base d'expression régulières, ou même soyons fou à base de JS sur le client, c'est "monstrueusement lourd" genre moins d'une milliseconde quoi :D
aujourd'hui le net fonctionne comme ça, la quasi totalité des sites sont en angularJS ou emberJS ou whatever et tout repose sur de la manipulation de DOM en JS et des trucs un poil plus lourds qu'un simple rechercher-remplacer d'une trentaine de balises par page :)

d'autant plus que le script de rendu tu l'as donc, soit j'ai pas pigé, soit tu soulèves un non-problème.
« Last Edit: 16 March, 2016, 15:00:19 by tam »

Online Wong

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 335
  • Bonus Pute: 125
  • #SnackChirackMaintenant
    • WFHCustoms
Re: Grand nettoyage : épuration du code et features
« Reply #35 on: 16 March, 2016, 15:06:42 »
D'un point de vue purement professionnel (parce que le traitement et la reprise de données, c'est chiant mais c'est un peu mon métier), je défends l'enregistrement en base en BBCode pour les raisons suivantes :

- Le HTML, c'est dégueulasse. Paye ta relecture. C'était l'argument troll, maintenant on passe aux choses sérieuses.

- Je préfère maintenir une approche plus ou moins MVC et séparer le modèle (ce qui est enregistré en base) de la vue (la façon d'afficher ces données) de manière assez étanche. le BBCode est une bonne pratique de ce point de vue, on indique ce qu'on veut afficher (image, italique, gras etc.) dans le modèle, tout en laissant au métier et/ou à la vue le soin de traduire cette information en code HTML. Oui, je sais, mon code ne respecte pas le MVC.

- Si demain on décide que finalement, on veut faire la moindre modif dans la manière d'afficher quoi que ce soit, faudra se retaper la reprise sur toutes les entrées de la base au lieu de juste modifier un paramétrage (la regex). Dans un contexte professionnel, si j'annonce qu'il faut se retaper toute la base pour changer la couleur d'un titre au lieu de modifier un composant d'affichage, au mieux il me rit au nez, au pire il convoque mon N+2 pour qu'il lui explique pourquoi il faut payer 30j pour changer une couleur.

- Lors de l'édition, il faudra détricoter le HTML pour le reconvertir en BBCode pour que ça soit lisible par l'auteur, pour le reconvertir en HTML à la sauvegarde. Au moindre bug dans un sens comme dans l'autre, l'article va se retrouver en vrac.

- Sur le forum, les posts sont sauvegardés en BBCode. Ça a jamais gêné personne :D

- La performance est-elle critique à ce point ? Je ne connais pas les stats du site mais je ne pense pas qu'on serve des milliers ou même des centaines de pages par seconde.

- Quelle est l'origine des bugs d'affichage dont tu parles ? S'il s'agit de l'interprétation du BBCode par la regex, le problème sera identique en sauvegardant en HTML. Il vaudrait mieux travailler cet aspect avant de tout vouloir casser.



Cependant, tu veux absolument enregistrer les données au format HTML dans la BDD, on peut imaginer une reprise automatique sur les données existantes en utilisant la regex de formatage. Je suppose que c'est faisable en PHP facilement, au pire avec un ETL open source genre Talend on peux faire ça en 1/2h. Ou un sed sur le dump. C'est bien, sed. Hmmm des regex...


On peut imaginer à la rigueur une solution hybride : on garde la critique en BBCode pour édition et référence, on ajoute un champ "critique/article/news etc. HTML" supplémentaire qui sera généré à l'enregistrement et qui sera appelée pour l'affichage sur le site, comme ça on soulage le serveur à l'affichage et on conserve le texte original, protégé de tout débordement de traitement automatique. En cas de montée de version du module d'affichage, il suffirait de jouer une reprise (via l'IHM admin ?) qui remplacerait le texte formaté, interprété depuis le texte original en BBCode, utilisant la nouvelle version du module d'affichage.

Offline POYO

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 315
  • Bonus Pute: 67
  • Et bonsoir.
    • Pragmastick
Re: Grand nettoyage : épuration du code et features
« Reply #36 on: 16 March, 2016, 15:12:28 »
Je bidouille un peu histoire qu'on voit tout.

Quote
A une époque où [ b] l’A380 n’avait [/ b] pas encore fait hurler les personnes âgées qui avait perdu 15% de leur retraite dans un retard de programme, l’A320 était le maître des cieux. Et quand bien même cette réalité peut-être un peu arrangée vous dérange, je m’en contrefiche j’écris ce que je veux. Alors quand à 7 ans comme moi, fan d’aviation, on tombe sur un jeu qui a le nom de son avion fétiche, on fonce sur son Amstrad, et on lui fait bouffer la disquette.

[img1 ]http://www.jenesuis.net/images_site/jeux/amstrad/a320/2.png[/ img1] [img2 ]http://www.jenesuis.net/images_site/jeux/amstrad/a320/2.png[/ img2]


Quand on rentre la critique en base de données, on devrait stocker ceci :


Quote
A une époque où < strong> l’A380 n’avait < / strong>  pas encore fait hurler les personnes âgées qui avait perdu 15% de leur retraite dans un retard de programme, l’A320 était le maître des cieux. Et quand bien même cette réalité peut-être un peu arrangée vous dérange, je m’en contrefiche j’écris ce que je veux. Alors quand à 7 ans comme moi, fan d’aviation, on tombe sur un jeu qui a le nom de son avion fétiche, on fonce sur son Amstrad, et on lui fait bouffer la disquette.


 < div style="width:800px; margin-left:5px; min-height:240px; float:left;">
            <d iv style="width:399px; min-height:240px; float:left; margin:0px;">
               <d iv align = center><i mg src="http://www.jenesuis.net/images_site/jeux/amstrad/a320/2.png" alt="" /></a></div>
            </ div>
            < div style="width:399px; min-height:240px; float:left; margin:0px;">
               < div align=center><im g src="http://www.jenesuis.net/images_site/jeux/amstrad/a320/2.png" alt="" /></a></div>
            </ div>
         </ div>',
         '<d iv style="width:800px; margin-left:5px; min-height:20px; float:left;">
            <di v style="width:399px; min-height:20px; float:left; margin:0px;">
               <di v  align = center>$1</div>
            </div>
            <div style="width:399px; min-height:20px; float:left; margin:0px;">
               <div align = center>$2</div>
            </d iv>
         </d v>



EDIT : Bon, du coup c'est ce que la page affiche, mais la regex me permet pas d'automatiser les liens vers le fichier d'origine (pour les images par exemple).


J'ai kill les balises dans le doute pour pas que ça fasse sauter le forum mais l'idée est là.


Tam : Techniquement, ce genre de process tient effectivement complêtement vu que dans la globalité des cas sur le site, ça marche.

Mais du coup la regex qui fait ça est mal foutue (encore que j'en ai pas fait depuis longtemps, de fait je peux pas vraiment juger), du coup déjà c'est pas hyper propre, et on a des combinaisons de balises qui ne fonctionnent pas (à savoir mettre un lien sur des images côte à côte par exemple). Exemple tout con, si je prends un dossier sur pornic quelconque et que je veux foutre 2 miniatures cote à côte, chacune contenant un lien qui renvoie vers le fichier d'origine, le code saute et m'affiche des liens de forme
Quote
[img1 ] urldelaminiature1 [/ img1] [img1 ] urldelaminiature2 [/ img1]
, que je les rentre à la main dans la saisie ou que je bidouille directement dans la regex.


Mais je t'accorde, "lourd pour le serveur" est un peu fort, mais c'est hyper chiant à maintenir, et pour le coup, si vous avez la moindre idée de comment intégrer ça facilement, n'hésitez pas.



Wong, je suis d'accord au niveau code/decode du bbcode pour les modifs. Mais du coup étant un peu old school, j'ai toujours tout rentré en html dans les bases. Mais je t'accorde totalement que si tu as une solution (hybride ou non, dans le fond je m'en fous en vrai) pour que la regex fasse pas tout sauter...
« Last Edit: 16 March, 2016, 15:21:01 by POYO »

Offline POYO

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 315
  • Bonus Pute: 67
  • Et bonsoir.
    • Pragmastick
Re: Grand nettoyage : épuration du code et features
« Reply #37 on: 16 March, 2016, 15:16:18 »
Pour l'origine des bugs, j'attends d'avoir l'accès aux bases pour tester directement, puisque quand j'ai rebidouillé l'interface de saisie, je me suis justement arrangé pour faire sauter les possibles injections de code ;D (et aussi passer un coup de htmlentities pour que les ' fassent pas péter toute la saisie)

Online ɯɐʇ

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 1 999
  • Bonus Pute: 113
  • ?x???? ¡¡¡¡¡
Re: Grand nettoyage : épuration du code et features
« Reply #38 on: 16 March, 2016, 15:20:05 »
pour le coup on voit bien que tu trades la "performance" pour "l'espace de stockage" (je mets les 2 entre guillemets hein, c'est pas non plus wikipedia le site...) bref, je suis pas sûr qu'au final t'y sois gagnant.

à mon avis t'as un souci de regex c'est tout, et donc quelque soit ta solution, tu ne feras pas l'économie de corriger ta regex pour traduire du HTML intelligible :)

PS : je te rassure pas besoin de <a href="http://tameresurinternet.com">killer les balises</a> le forum est peut être un peu oldschool mais il se charge de les escaper c'est bien un minimum :D
« Last Edit: 16 March, 2016, 15:22:58 by tam »

Online Wong

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 335
  • Bonus Pute: 125
  • #SnackChirackMaintenant
    • WFHCustoms
Re: Grand nettoyage : épuration du code et features
« Reply #39 on: 16 March, 2016, 15:20:55 »
Solution bête : on corrige la regex et on touche à rien ;D
Effectivement la fonction utilisée (preg_replace ?) et/ou la regex ont peut-être du mal avec des replace imbriqués. Faudrait farfouiller le code du forum pour voir comment c'est foutu vu que ça marche très bien.

Solution spécifique (si c'est le seul cas) : pourquoi pas une balise spécifique aux liens  ? Genre :
[ img_url=http://www.montceaulesmeauxsexyboys.com ] fungus_a_poil_brie.jpg [ /img_url ]

Offline POYO

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 315
  • Bonus Pute: 67
  • Et bonsoir.
    • Pragmastick
Re: Grand nettoyage : épuration du code et features
« Reply #40 on: 16 March, 2016, 15:26:12 »
Solution bête : on corrige la regex et on touche à rien ;D
Effectivement la fonction utilisée (preg_replace ?) et/ou la regex ont peut-être du mal avec des replace imbriqués. Faudrait farfouiller le code du forum pour voir comment c'est foutu vu que ça marche très bien.

Solution spécifique (si c'est le seul cas) : pourquoi pas une balise spécifique aux liens  ? Genre :
[ img_url=http://www.montceaulesmeauxsexyboys.com ] fungus_a_poil_brie.jpg [ /img_url ]

Faudra que je teste ça quand j'aurai un peu de temps. Mais ouais ça se tient. Même si du coup, par déformation je prends toujours l'utilisateur final pour un con qui essayera d'imbriquer les balises classiques plutôt que de regarder le nouveau bouton. My bad.



à mon avis t'as un souci de regex c'est tout, et donc quelque soit ta solution, tu ne feras pas l'économie de corriger ta regex pour traduire du HTML intelligible :)

PS : je te rassure pas besoin de <a href="http://tameresurinternet.com">killer les balises</a> le forum est peut être un peu oldschool mais il se charge de les escaper c'est bien un minimum :D

Oui bon hein, dans le doute.

Mais oui, de toute façon, que je prenne une solution ou une autre, faudra que je rebidouille la regex, donc ça...

Offline Fungus

  • Snack of Quality
  • Hero Member
  • *****
  • Posts: 5 635
  • Bonus Pute: 387
  • 1000 years of bitchin'
Re: Grand nettoyage : épuration du code et features
« Reply #41 on: 17 March, 2016, 08:07:49 »
Si l'on opte pour la politique de la terre brûlée, je pense que l'on aura suffisamment de petites mains pour se porter volontaires afin de saisir à nouveau les centaines de critiques. C'était d'ailleurs ce qui s'était passé pour la V2 du site.

Offline Enker

  • Hero Member
  • *****
  • Posts: 3 606
  • Bonus Pute: 149
Re: Grand nettoyage : épuration du code et features
« Reply #42 on: 17 March, 2016, 12:09:04 »
M'est avis que la faible fréquentation du forum et les activités de chacun depuis lors n'aideront pas trop à la tâche...

Offline nazebrok32

  • Hero Member
  • *****
  • Posts: 556
  • Bonus Pute: 19
Re: Grand nettoyage : épuration du code et features
« Reply #43 on: 22 March, 2016, 11:58:22 »
Je bite que dalle à ce que vous racontez mais si il faut aider, je suis volontaire!

Offline EcstazY

  • Administrator
  • Hero Member
  • *****
  • Posts: 2 358
  • Bonus Pute: 107
    • [ NES Pas ? ]
Re: Grand nettoyage : épuration du code et features
« Reply #44 on: 22 March, 2016, 15:53:20 »
Moi non plus, qu'est ce qu'il s'est encore passe ? :D

On casse son PC pendant 4 jours, fraichement recu je regarde le forum, et ca y est bim, ca parle hebreux :D

Quelqu'un pour un tout petit resume ? :)