Archives par mot-clef : Optimisation

icone-privacy-commons

Une approche façon Creative Commons pour expliquer sa politique de confidentialité

Catégorie : Geekeries | Laisser un commentaire

Ce billet papote autour d’une manière de faciliter l’explication des politiques de protection de données personnelles inspirée de « Creative Commons ». C’est un mouvement qui est en train de se former, qui est sujet à recherche et qui tend à s’appeler « Privacy Commons » (ô originalité !) !

Quelques mots sur Creative Commons

Creative Commons est une association à but lucratif permettant de protéger des créations par une licence. Ces licences sont particulières car elles permettent de protéger ses œuvres tout en permettant leur rediffusion sous certaines conditions. Une licence se décompose en trois couches :

  • Les termes légaux
  • Des icônes, traduisant de manière rapidement compréhensibles par un lecteur humain les termes légaux
  • Des moyens pour une machine de comprendre les termes légaux

Je suis sûr que vous avez déjà vu les icônes ci-dessous ! Sur le Site du Zéro ou Flickr par exemple. Ce sont des icônes Creative Commons.Creative Commons a ainsi réussi à rendre la loi sur les copyrights très facilement compréhensibles pour tous les utilisateurs.

Continuer la lecture

Comment sécuriser les mots de passe de mes utilisateurs ?

Catégorie : Geekeries | 2 commentaires

Vous avez dit : sécurité ? Aujourd’hui j’ai eu un cours qui m’a permis de comprendre ce que je n’avais jamais compris. Lorsque j’ai appris le PHP, on m’a dit : « il faut chiffrer les mots de passe de tes utilisateurs quand tu les enregistres dans une base de données ! ». Moi, docile, j’ai obéis ! Cela paraît logique :

  • lors de son inscription, l’utilisateur me fournit un mot de passe en clair (appelons-le Mclair),
  • je le chiffre (il devient Mchiffré) et l’enregistre dans ma base de données,
  • lorsque cet utilisateur veut se connecter, il me fournit un mot de passe en clair (appelons-le Tclair), je le chiffre (appelons-le Tchiffré) et teste s’il correspond au mot de passe chiffré de ma base de données (Tchiffré == Mchiffré ?)

Avec ce système, si quelqu’un accède à ma base de données, il ne lui servira à rien de lire les mots de passe de mes utilisateurs puisqu’ils sont sécurisés, il ne pourra donc pas se faire passer pour un de mes utilisateurs. C’est déjà suffisamment embêtant que quelqu’un ait réussi à s’introduire dans ma base de données !

Ce que je n’avais bien capté, c’est ce qui signifie chiffré un message et pourquoi on m’avait encouragé à utilisé la fonction de chiffrage « Md5″ alors que je lisais par ailleurs qu’il valait mieux utiliser « Sha-1″. Aujourd’hui, je suis un homme nouveau qui voit le monde autrement et qui se couchera accessoirement légèrement moins bête ce soir.
Continuer la lecture

Booster ses CSS

Catégorie : HTML et CSS | 2 commentaires

Depuis que je suis sur Twitter (vous pouvez [me suivre|http://twitter.com/30minparjour]), j’ai l’occasion de lire plus d’articles sur le Web qu’auparavant et notamment quelques uns sur les CSS. Je vous livre donc mes découvertes et réflexions du moment. !!!CSS sur une ligne Single line CSS en anglais. C’est le concept qu’il est mieux d’écrire ses CSS sur une seule ligne plutôt qu’en bloc. Par exemple en bloc : /// ul li { list-style:none; border:1px solid black; font-weight:bold; } dl dt { width:800px; } /// donnerait sur une ligne /// ul li{list-style:none; border:1px solid black; font-weight:bold;} dl dt{width:800px;} /// Le grand avantage c’est que ça réduit le poids du fichier CSS (assez significativement d’ailleurs, même si ça n’a pas grande influence sur le poids total d’une page Web), et ça évite de scroller des heures pour arriver à la fin du fichier. L’énorme inconvénient c’est que c’est moins lisible. C’est vrai, mais j’ai testé et en fait pas tant que ça. Pour ma part je pense que je vais adopter une sorte de mix : CSS sur une ligne, et CSS en bloc pour les lignes trop longue. Sans oublier de commenter les différentes parties du code, on n’est pas à 10 lignes près quand même ! !!Quelques exemples * [Single Line CSS|http://orderedlist.com/our-writing/resources/html-css/single-line-css/] * [Exemple de feuille CSS|http://designinformer.com/wp-content/themes/design-informer-v2/style.css] très propre !!!Eviter les espaces superflues Dans le même genre, histoire de grapiller quelques octets, c’est vrai que ça ne sert à rien de rajouter des espaces entre une propriété et sa valeur, une balise et l’accolade qui la suit. Bref, je suis pour d’enlever les espaces superflues ! Mais quand même, un espace entre chaque propriété quand on écrit en ligne : c’est cool pour les yeux ! !!!Enlever les les sélecteurs CSS superflues D’après [PageSpeed|http://code.google.com/intl/fr/speed/page-speed/] (un outils de Google pas mal du tout pour tester la rapidité de ses pages Web), il serait avantageux de réduire au maximum la liste des sélecteurs CSS. Prenons l’exemple suivant : /// #menu ul li{font-weight:bold;} /// Préciser l’élément @@ul@@ est en général superflue puisque pour un cas classique, il n’y aurait pas de @@li@@ en dehors d’un @@ul@@ dans @@#menu@@. Il vaudrait donc mieux écrire : /// #menu li{font-weight:bold;} /// Et je dis : ouais, ça se tient ! ça réduit la taille du fichier CSS, améliore la lecture du fichier, et il y a des chances que cela facilite le travail de l’interpréteur de CSS. Attention tout de même à ne pas tailler à l’arrache dans le CSS, certains sélecteurs sont utiles ! C’est tout pour aujourd’hui !

Optimiser ses requêtes MySQL

Catégorie : SQL | Laisser un commentaire

Je travaille actuellement sur une table MySQL qui va contenir près de 7 millions de tuples (avec une quinzaine de colonnes chacun bien sûr, ce ne serait pas drôle sinon !), il se trouve qu’elle en contient déjà près de 3 millions, et que je suis obligé de faire une vingtaine de requêtes différentes dans cette table pour chaque page et que, par conséquent, le site qui l’utilise plante à fond. La mémoire utilisable par MySQL est dépassée. Alors certes, on peut modifier la taille de la mémoire utilisable par MySQL (et il faudrait aussi sûrement modifier la durée maximum d’exécution d’un script PHP), mais le but c’est quand même de charger des pages en moins de 30 secondes. J’ai donc cherché des réponses sur le Web et auprès des développeurs de ma boîte. Voici donc quelques points que j’ai pu retenir : !!!Structure de la table Il vaut mieux éviter, sauf si c’est nécessaire, l’utilisation de champ  »NULL » par défaut. En effet, comme on peut le voir sur [cet article d'Apprendre PHP|http://www.apprendre-php.com/tutoriels/tutoriel-26-mysql-introduction-a-l-optimisation.html]  »NULL » est une valeur spéciale qui nécessite un traitement spécial, MySQL ne peut pas le tester avec un égal et ne peut le comparer à la chaine vide ou à 0, il est obligé d’utiliser @@IS@@ ou le symbole équivalent @@<=>@@.  »NULL » par défaut est d’autant plus à bannir pour les index. Utiliser des colonnes avec le meilleur type et la meilleure taille possible. Un prénom n’a par exemple par besoin d’être en VARCHAR(255), un VARCHAR(20) suffit plus que largement. Une bonne technique pour optimiser ses tables est d’utiliser @@PROCEDURE ANALYSE()@@. On créé ses tables au feeling (je parle juste de la structure, vous ne couperez pas à la normalisation tout ça, héhé), on les remplie avec un contenu à peu près définitif est on utilise une requête du style : ///[mysql] SELECT id, titre, message FROM blog PROCEDURE ANALYSE() /// MySQL va nous répondre un joli petit array avec la taille max et min de chaque colonne id, titre et message, quelques autres informations intéressantes et surtout une proposition de type(taille) optimisée à votre table. Encore une fois, c’est [l'article d'Apprendre PHP|http://www.apprendre-php.com/tutoriels/tutoriel-26-mysql-introduction-a-l-optimisation.html] qui en montre un exemple vraiment parlant. !!!SELECT * Si l’on effectue une recherche sur une colonne et que celle-ci change assez rarement (ou n’est modifié que par un administrateur), il peut être très avantageux de créer un index ou un index unique (si le contenu de cette colonne est différente pour chaque tuple) dessus. Il suffit de le faire en ligne de commande, ou directement dans PhpMyAdmin. Cela peut mettre un petit peu de temps si la table est grande, ce qui explique qu’il vaut mieux éviter de changer trop souvent la table par la suite puisqu’il faut mettre à jour l’index à chaque insert, update, delete. Si j’ai bien compris MySQL se charge alors de créer une sorte de table virtuelle avec cette colonne ce qui accélère grandement la recherche sur cette dernière. On peut créer autant d’index que l’on souhaite, mais s’il y en a trop l’avantage peut être restreint. (o alors il faut utiliser des USE INDEX (nom_index) dans vos requêtes, mais pour moi ça a plutôt ralenti mes requêtes) * Bien entendu, l’utilisation du joker (*) est à bannir. (en l’utilisant on effectue 2 requêtes au lieu d’une : chercher tous les champs qui correspondent au joker (ce que l’on aurait du faire à la main), puis sélectionner les bonne colonnes selon les bonne lignes) De même, si c’est possible comme pour un forum ou un système de commentaires, au lieu d’utilisation un count(champ1), il vaut mieux mettre le nombre de tuples en dur dans la base de données. * Lors de jointure, il est important que les critères de jointure soient de même type pour que MySQL n’est pas à faire de conversion. L’utilisation de jointures avec JOIN est a priori plus rapide que celles (à l’ancienne) dans le WHERE. Et de même, il est plus intéressant de faire un LEFT JOIN qu’un JOIN (quand le résultat convient avec un LEFT JOIN bien sûr) * On peut faire précéder sa requête SQL par EXPLAIN pour savoir comment MySQL traite notre SELECT. MySQL nous renvoie alors un tableau avec tout un tas d’information. Il suffit de lire la [doc MySQL de EXPLAIN|http://dev.mysql.com/doc/refman/5.0/fr/explain.html] pour utiliser cette commande. !!!INSERT Si l’on a a effectuer plusieurs insertions à la suite, il est plus avantageux de faire un seul INSERT que plusieurs à la suite. Bref, au lieu de faire : /// for($i=0;$i<100;$i++) { $qry ='INSERT INTO ma_table (numero) VALUES ("'.$i.'")'; $insert = mysql_query($qry); if (!$insert) echo 'Erreur lors de l\'insertion : '.mysql_error().'
‘; } /// Faites plutôt : /// $values = array(); for($i=0;$i<100;$i++) { $values[] = $i; } $qry ='INSERT INTO ma_table (numero) VALUES ("'.implode('"), ("', $values).'")'; $insert = mysql_query($qry); if (!$insert) echo 'Erreur lors de l\'insertion : '.mysql_error().'
‘; /// !!!Partitionnement L’autre solution consiste à partitionner sa table. Je vous laisse lire ce [très bon tutoriel sur Developpez.com|http://krierjon.developpez.com/mysql/partitionnement/]. C’est au final ce que j’ai choisi et le résultat est plutôt positif : j’arrive à accéder à toutes mes pages en moins de 30 secondes, et les pages qui n’avaient vraiment pas besoin de toutes les données sont vraiment rapide à charger. !!!Conclusion Vous pouvez lire ce long article très intéressant et très complet de PHP Facile à ce sujet : [Optimisation de MySQL|http://www.lephpfacile.com/manuel-mysql/mysql-optimization.php] Et bien sur l’article dont j’ai déjà parlé sur Apprendre PHP : [Introduction à l'optimisation|http://www.apprendre-php.com/tutoriels/tutoriel-26-mysql-introduction-a-l-optimisation.html]. Aucun de ces 2 articles ne parlent de partitionnement ce qui est assez étonnant. Bon, tout cela étant dit, la meilleure technique consiste assurément à créer un système de cache. Le premier utilisateur allant sur la page se tape les requêtes SQL et la génération du cache, mais toutes les prochaines visites (pour tout le monde) seront très rapide puisqu’elles iront juste lire un fichier HTML. Bien sûr, vous pouvez aussi générer automatiquement tout votre cache en visitant chaque page avec @@file_get_content()@@. D’autre part, si vos données changent assez souvent, vous pouvez créer un petit robot qui se charge de supprimer vos fichiers de cache à intervalle régulier, mais dans ce cas là, il vaut mieux regénérer le cache à chaque modification de la BDD.