Le blog de Philippe Poisse - Mot-clé - PHP2024-03-28T22:26:21+01:00Philippe Poisseurn:md5:461e3511a43adbbb7d3a84a8af2d4212DotclearCalcul d’un écart type avec PHPurn:md5:e69c4ab4d785399160e258c3b51be7212017-08-10T10:53:00+02:002017-08-10T10:53:00+02:00Philippe PoisseProgrammationPHPstatistiquesécart type<p>Je continue mon petit bonhomme de chemin dans le monde des civic tech et du big data et ce coup-ci j’avaisi besoin de calculer un écart type.<br />
PHP dispose d’une fonction native pour cela, mais elle n’est pas installée chez tous les hébergements. J’ai écrit une petite fonction pour remédier à ce problème.<br />
En même temps c’est un bon exercice intellectuel pour passer le temps.</p> <h2>Définition</h2>
<p>L’écart type est utilisé en statistique pour connaître la dispersion d’une série de valeur par rapport à la moyenne.<br />
Plus l’écart type est faible plus les valeurs sont proches de la moyenne.<br />
Pour plus d’information je vous invite à aller faire un tour sur Wikipedia et sur Khan Academy.<br />
La page Wikipedia sur l‘écart type: <a href="https://fr.wikipedia.org/wiki/%C3%89cart_type" hreflang="fr" title="L'écart type sur Wikipedia">https://fr.wikipedia.org/wiki/%C3%89cart_type</a><br />
Le cours de Khan Academy : <a href="https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/introduction-to-standard-deviation" hreflang="fr" title="Présentation de ce qu'est un écart type">https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/introduction-to-standard-deviation</a></p>
<h2>Le code</h2>
<pre>
<code>function ecart_type ($donnees) {</code>
<code> //0 - Nombre d’éléments dans le tableau</code>
<code> $population = count($donnees);</code>
<code> if ($population != 0) {</code>
<code> //1 - somme du tableau</code>
<code> $somme_tableau = array_sum($donnees);</code>
<code> //2 - Calcul de la moyenne</code>
<code> $moyenne = $somme_tableau / $population;</code>
<code> //3 - écart pour chaque valeur</code>
<code> $ecart = [];</code>
<code> for ($i = 0; $i < $population; $i++){</code>
<code> //écart entre la valeur et la moyenne</code>
<code> $ecart_donnee = $donnees[$i] - $moyenne;</code>
<code> //carré de l'écart</code>
<code> $ecart_donnee_carre = bcpow($ecart_donnee, 2, 2);</code>
<code> //Insertion dans le tableau</code>
<code> array_push($ecart, $ecart_donnee_carre);</code>
<code> }</code>
<code> //4 - somme des écarts</code>
<code> $somme_ecart = array_sum($ecart);</code>
<code> //5 - division de la somme des écarts par la population</code>
<code> $division = $somme_ecart / $population;</code>
<code> //6 - racine carrée de la division</code>
<code> $ecart_type = bcsqrt ($division, 2);</code>
<code> } else {</code>
<code> $ecart_type = "Le tableau est vide";</code>
<code> }</code>
<code> //7 - renvoi du résultat</code>
<code> return $ecart_type;</code>
<code>}</code>
</pre>
<p>Pour la structure de la fonction je me suis inspiré de ce cours :<a href="http://blog.philippe-poisse.eu/index.php?post/2017/08/10/ https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/calculating-standard-deviation-step-by-step" hreflang="fr" title="Calculer un écart type"> https://fr.khanacademy.org/math/probability/data-distributions-a1/summarizing-spread-distributions/a/calculating-standard-deviation-step-by-step</a></p>
<h2>Détail du code</h2>
<pre>
<code>function ecart_type ($donnees) </code></pre>
<p>Pour le nom de la fonction je ne suis pas allé chercher loin. La variable qui est passée en paramètre doit être un tableau ne contenant que des valeurs numériques. Il faudrait la filtrer au préalable.</p>
<pre>
<code>$population = count($donnees);</code></pre>
<p>Pour débuter on va compter le nombre d’élément dans le tableau, la fonction count() est donc utile.</p>
<pre>
<code>if ($population != 0)</code></pre>
<p>Si le tableau n’est pas vide la fonction va calculer l’écart type.</p>
<pre>
<code>$somme_tableau = array_sum($donnees);</code></pre>
<p>D’abord on calcule la somme des éléments du tableau avec array_sum(). Si votre tableau contient des chaînes de caractères vous risquez d’avoir des erreurs à ce niveau-là, d’où l’importance du filtrage.</p>
<pre>
<code>$moyenne = $somme_tableau / $population;</code></pre>
<p>Connaissant la somme du tableau et la population, on calcule la moyenne. Elle servira pour calculer les différents écarts.</p>
<pre>
<code> $ecart = [];</code>
<code> for ($i = 0; $i < $population; $i++){</code>
<code> //écart entre la valeur et la moyenne</code>
<code> $ecart_donnee = $donnees[$i] - $moyenne;</code>
<code> //carré de l'écart</code>
<code> $ecart_donnee_carre = bcpow($ecart_donnee, 2, 2);</code>
<code> //Insertion dans le tableau</code>
<code> array_push($ecart, $ecart_donnee_carre);</code>
<code> }</code>
</pre>
<p>Maintenant on va calculer l’écart à la moyenne pour chaque valeur et passer ce résultat dans un tableau.<br />
Il faut d’abord créer le tableau qui contiendra les résultats.<br />
Puis avec la boucle for on va calculer les différentes valeurs. Attention, ce sont les carrées des écarts qui seront passés dans le tableau.<br />
Pour calculer le carré on utilise la fonction bcpow() qui prend trois arguments. Le premier est la valeur dont on veut connaître le carré, le deuxième est la puissance à laquelle on veut monter notre valeur, le troisième est le nombre de chiffre après la virgule.<br />
Une fois le carré obtenu on le passe dans le tableau avec la fonction array_push().</p>
<pre>
<code>$somme_ecart = array_sum($ecart);</code></pre>
<p>Une fois le tableau des carrés des écarts rempli on en calcule la somme avec array_sum().</p>
<pre>
<code>$division = $somme_ecart / $population;</code></pre>
<p>Puis on divise cette somme par la population. On obtient donc le carré de l’écart type.</p>
<pre>
<code>$ecart_type = bcsqrt ($division, 2);</code></pre>
<p>Il ne reste plus qu’à calculer la racine carrée de notre résultat avec bcsqrt (). Cette fonction prend deux arguments, la variable contenant le nombre dont on veut connaître la racine carrée et le nombre de décimales. En règle générale deux chiffres après la virgule suffit en termes de précision.</p>
<pre>
<code> } else {</code>
<code> $ecart_type = "Le tableau est vide";</code>
<code> }</code></pre>
<p>L’instruction if est terminée. Avec l’expression else on défini le message d’erreur à renvoyer si le tableau est vide.</p>
<pre>
<code>return $ecart_type;</code></pre>
<p>Pour finir on renvoie la variable $ecart_type qui contient le résultat final et qui sera affiché dans la page web.</p>
<p class="conclusion" id="conclusion">Cette fonction reste assez sommaire, mais il faut reconnaître que PHP n’est pas vraiment le meilleur langage pour le calcul statistique. Mais dans un contexte Web on n’a souvent pas trop le choix.</p>http://blog.philippe-poisse.eu/index.php?post/2017/08/10/Calcul-d%E2%80%99un-%C3%A9cart-type-avec-PHP#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/234All that glitters is goldurn:md5:d39eb6a8fcfc1a771aa8464b1b1117752015-09-12T02:28:00+02:002015-09-12T02:28:00+02:00Philippe PoissePoints de vuePHP<p>« L’habit fait le moine. Les gens nus ont pas ou peu d’influence sur la société », disait Marc Twain. Dans le cas du développement Web c’est particulièrement vrai.<br />
La plupart des gens s’arrêtent au visuel, sans se soucier de ce qui existe en profondeur. Au grand damne des développeurs « server side ».</p> <h2>Sometimes words have two meanings</h2>
<p>Un site web est une application qui se répartit sur au moins deux ordinateurs : un serveur HTTP et un poste client (un PC, un smartphone, etc.). En général on rajoute un serveur de base de données, mais on peut écrire un site « en dur » c’est-à-dire directement en HTML et CSS.<br />
L’utilisateur lambda, communément désigné par le terme « d’internaute », ne voit que la partie « client », grosso modo son navigateur. Regardez votre écran, il y a de fortes chances que vous y voyez Chrome ou Firefox.<br />
Le surf sur le Web se fait rarement en ligne de commande, bien que cela économisera pas mal de ressources.</p>
<h2>Ooh, it makes me wonder</h2>
<p>À la limite que l’utilisateur final ne comprenne rien à ce qu’il fait n’a que peu d’importance. L’industrie est basée sur l’idée que le consommateur est plus « con » que « sommateur ». Et vu les ventes des Iphone (merci de mettre le numéro de votre choix) ce principe a l’air de bien marcher. Tant mieux pour eux.<br />
Le problème est que l’utilisateur final importe peu pour un développeur. Ce qui importe c’est le client, ou le donneur d’ordres quand on veut être poli.<br />
Et le fait qu’il ne soit pas « sommateur » est rapidement une évidence.<br />
En général ça se découvre lors du premier stage en entreprise.</p>
<h2>And a new day will dawn for those who stand long</h2>
<p>Tant que le client se contente de vous dire ce qu’il veut, en espérant que ça corresponde à ce dont il a besoin, et qu’il est possible de transformer ça en « cas d’utilisation » et en « spécifications techniques » le développement peut aboutir à quelque chose de fonctionnel.<br />
Par contre si le client s’arrête au visuel sans se soucier de ce qu’il y a derrière, ça peut mal finir.<br />
Les apparences sont, souvent, trompeuses. Juger l’avancement d’un projet Web, principalement dans une petite structure où il faut tout faire soi-même, relève de la bêtise. Mais aussi de la banalité.<br />
Le manque de volonté, de temps, ou d’autre chose, poussent à ne pas s’intéresser sérieusement aux mécaniques internes des projets. Et puis on paye un mec à gérer tout ça après tout. Non ?</p>
<h2>Your head is humming and it won't go, in case you don't know</h2>
<p>Le développement d’une application, fut-elle pour le Web, met en jeu des compétences et des connaissances qui nécessitent un minimum de formation, de préférence professionnelle.<br />
Écrire du PHP est, à la limite, à la portée d’un élève de troisième. Je pense qu’à l’époque je faisais des trucs plus complexe en mathématique que ce que je fais aujourd’hui. Mais bon j’ai jamais accroché la trigonométrie non plus, faut être honnête.<br />
Par contre développer un petit framework MVC, certes à la vite, ou respecter des règles d’accessibilité, des normes ISO (oui, ça existe en vrai ces trucs-là), etc., c’est un peu un métier.<br />
Comprendre le déroulement d’un projet, même très simple oblige à acquérir des connaissances de base, sinon des tensions apparaîtront automatiquement entre les « techniciens », qui assurent le bon fonctionnement des outils à livrer, et les « administratifs » qui gèrent la structure donneuse d’ordre.<br />
Et le pouvoir réel étant entre les mains des techniciens, le projet peu finir façon « the IT crowd ». L’humour en moins.</p>
<h2>And if you listen very hard, The tune will come to you at last</h2>
<p>Un projet Web devrait être scindé en deux, y compris dans les petits structures, celles que je connais le mieux. Une équipe côté serveur et une équipe côté client. Si cela évite que l’état d’avancement du projet soit jugé sur le visuel, cela complexifie la gestion, malheureusement.<br />
Il faut donc avoir une montée en compétence des managers et des développeurs.<br />
Et vu les plans de formation de la plupart des entreprises et associations c’est pas gagné.</p>
<p class="conclusion" id="conclusion"><strong>To be a rock and not to roll</strong></p>http://blog.philippe-poisse.eu/index.php?post/2015/09/12/All-that-glitters-is-gold#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/181Yes we scanurn:md5:ec49030a31ed798b8bc0099da7a63ffa2015-07-10T16:03:00+02:002015-07-10T16:03:00+02:00Philippe PoisseUn p'tit gars perdu à PerpignanGoogle Analyticslogiciels librespartis politiquesPHPPiwik<p>C’est l’été et le boulot en retard s’accumule. C’est donc le moment de faire autre chose, et de préférence un truc un peu idiot qui ne sert à rien. J’ai donc décidé de jeter un œil aux outils mis en place sur les sites Web des principaux partis politique français.<br />
C’est pour vous dire si je suis motivé pour bosser.</p> <h2>Méthodologie</h2>
<p>Je navigue avec Firefox et j’utilise Wappalyzer pour une première analyse rapide. Lorsque j’ai un doute je jette un coup œil dans le code HTML. Il ne s’agit pas d’un audit sérieux, juste d’un passe-temps, donc je ne fouille pas en profondeur.<br />
La site Web de Wappalyzer : <a href="https://wappalyzer.com/applications" hreflang="en" title="La liste des applications reconnues par Wappalyzer">https://wappalyzer.com/applications</a></p>
<h2>Les partis politiques</h2>
<p>Une petite visite sur Wikipedia permet de se rendre compte qu’il existe une flopée de partis politiques en France. Histoire de ne pas y passer six mois je ne m’intéresse qu’aux principaux partis, c’est-à-dire ceux qui ont une aura nationale.</p>
<p>La page Wikipedia sur les partis politiques en France: <a href="https://fr.wikipedia.org/wiki/Liste_des_partis_et_mouvements_politiques_fran%C3%A7ais#Partis_suivant_leur_positionnement_politique" hreflang="en" title="la page Wikipedia sur les partis politiques">https://fr.wikipedia.org/wiki/Liste_des_partis_et_mouvements_politiques_fran%C3%A7ais#Partis_suivant_leur_positionnement_politique</a></p>
<h3>Nouveau Parti anticapitaliste</h3>
<p>Le NPA pour les intimes, le parti d’Olivier Besancenot (si je parle de Krivine vous n’allez pas comprendre).</p>
<ul>
<li>URL : http://www.npa2009.org/</li>
<li>CMS : drupal</li>
<li>Tracker : piwik</li>
<li>Serveur : Apache et Debian</li>
<li>Langage de programmation : PHP</li>
<li>Divers : Google Font API</li>
</ul>
<h3>Lutte ouvrière</h3>
<p>Le parti d’Arlette Laguiller, qui a été remplacée par une illustre inconnue.</p>
<ul>
<li>URL : http://www.lutte-ouvriere.org</li>
<li>CMS : SPIP</li>
<li>Tracker :</li>
<li>Serveur : Nginx</li>
<li>Langage de programmation : PHP</li>
<li>Divers : Google Font API</li>
</ul>
<h3>Parti Communiste français</h3>
<p>Un reliquat de l’ancien, qui au sommet de sa gloire à peser près de 30 % de l’électorat. Vous pouvez dire merci (ou pas) pour la sécu, entre autre.</p>
<ul>
<li>URL : http://www.pcf.fr/</li>
<li>CMS : Drupal</li>
<li>Tracker : Google Analytics</li>
<li>Serveur : Apache et Debian</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Parti de gauche</h3>
<p>Un parti lancé par Jean-Luc Mélenchon pour ramasser les gens qui pensent (encore) que le socialisme est une idée de gauche. Ces braves gens rentre dans la catégorie « Schtroumpf naif »</p>
<ul>
<li>URL : https://www.lepartidegauche.fr/</li>
<li>CMS : Ruby on Rails</li>
<li>Tracker : Google Analytics et New Relic</li>
<li>Serveur : Nginx</li>
<li>Langage de programmation : Ruby</li>
<li>Divers :</li>
</ul>
<h3>Front de gauche</h3>
<p>Une tentative de Mélenchon de se la jouer « programme commun ».</p>
<ul>
<li>URL : http://www.placeaupeuple.fr/</li>
<li>CMS : Wordpress</li>
<li>Tracker : Google Analytics</li>
<li>Serveur : Nginx</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Europe Écologie les Verts</h3>
<p>Un parti peuplé d’Elfes Verts et de pastèques (une pastèque c’est vert à l’extérieur et rouge à l’intérieur, je vous laisse réfléchir).</p>
<ul>
<li>URL : http://eelv.fr/</li>
<li>CMS :</li>
<li>Tracker : Google Analytics</li>
<li>Serveur : Nginx</li>
<li>Langage de programmation : PHP</li>
<li>Divers : Leaflet et OpenStreetMap</li>
</ul>
<h3>Parti socialiste</h3>
<p>Un parti de gauche dont tous les dirigeants sont à droite. Dites-lui merci (ou pas) pour les 35 heures et la loi sur le renseignement.</p>
<ul>
<li>URL : http://www.parti-socialiste.fr/</li>
<li>CMS : Drupal</li>
<li>Tracker : Google Anlaytics</li>
<li>Serveur :</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Mouvement républicain et citoyen</h3>
<p>Les gaullistes de gauche, ce parti a été créé par Jean-Pierre Chevènement.</p>
<ul>
<li>URL : http://www.mrc-france.org</li>
<li>CMS :</li>
<li>Tracker : Google Analytics</li>
<li>Serveur :</li>
<li>Langage de programmation :</li>
<li>Divers : Google Font API</li>
</ul>
<h3>Parti radical de gauche</h3>
<p>L’entreprise familiale Baylet. Ce parti arrive quand même à avoir des secrétaires d’État.</p>
<ul>
<li>URL : http://www.planeteradicale.org/</li>
<li>CMS : SPIP</li>
<li>Tracker : Google Anlaytics</li>
<li>Serveur : Apache</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Mouvement démocrate</h3>
<p>Le Modem : le parti des anciens de l’UDF qui ont refusé la fusion avec le RPR.</p>
<ul>
<li>URL : http://www.mouvementdemocrate.fr/</li>
<li>CMS :</li>
<li>Tracker : Google Anlaytics</li>
<li>Serveur : Apache</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Union des démocrates et indépendants</h3>
<p>L’UDI : le parti des anciens de l’UDF qui ont compris (trop tard) qu’ils se sont faits avoir lors de la fusion avec le RPR.</p>
<ul>
<li>URL : http://www.parti-udi.fr/</li>
<li>CMS :</li>
<li>Tracker : Google Anlaytics</li>
<li>Serveur : Apache et Debian</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Les Républicains</h3>
<p>Anciennement l’UMP, anciennement le RPR, anciennement le RPF, etc. Il ne fait pas bon y être trésorier.</p>
<ul>
<li>URL : http://www.republicains.fr/</li>
<li>CMS : Ruby On Rails</li>
<li>Tracker : Google Anlaytics, New Relic et Quantcast</li>
<li>Serveur : Nginx et Phusion Passenger</li>
<li>Langage de programmation : Ruby</li>
<li>Divers :</li>
</ul>
<h3>Debout la France</h3>
<p>Ce parti devait s’appeler « Debout l’Essonne » mais comme c’est un peu réducteur, Nicolas Dupont-Aignan à préférer « Debout la France ».</p>
<ul>
<li>URL : http://www.debout-la-france.fr/</li>
<li>CMS : Drupal</li>
<li>Tracker : Google Anlaytics et Cliky</li>
<li>Serveur : Apache et Ubuntu</li>
<li>Langage de programmation : PHP</li>
<li>Divers :</li>
</ul>
<h3>Front National</h3>
<p>L’ancien président serait déjà sorti de la zone Euro, il aurait mis sont argent en Suisse.</p>
<ul>
<li>URL : http://www.frontnational.com/</li>
<li>CMS : Wordpress</li>
<li>Tracker : Google Analytics</li>
<li>Serveur : Apache</li>
<li>Langage de programmation : PHP</li>
<li>Divers : Google Font API</li>
</ul>
<h2>Bilan des courses</h2>
<p>Si au niveau de l’infrastructure les solutions libres dominent, Drupal et SPIP sont présents sur 7 sites, les langages serveurs utilisés sont le PHP et le Ruby, les applications tierces sont plutôt propriétaires. Je n’ai trouvé qu’une seule instance de Piwik (NPA) et à l’exception des deux partis d’extrême gauche tout le monde utilise Google Analytics, avec parfois d’autres outils propriétaires en complément. Il est intéressant de noter que certains des utilisateurs de GG Analytics sont vent debout contre la loi sur le renseignement. Faites ce que je dis, pas ce que je fais. Sur les quatorze sites tester, tous utilisent un outil Google, soit Google Analytics soit Google Font API. Autre point à noter, aucun site ne semble être en conformité avec les obligations de la CNIL, vu qu’aucun n’a de message pour prévenir de la présence de cookies.</p>
<div class="conclusion" id="conclusion">En tant que libriste on se retrouve avec un bilan mi-figue mi-raisin, les solutions libres sont partout (principalement pour des raisons de coûts), mais l’engagement dans cette direction est absent.</div>http://blog.philippe-poisse.eu/index.php?post/2015/07/10/Yes-we-scan#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/149Wigowiz : mise en place d’un système d’agenda en ligneurn:md5:f4a68dbede972b058a4f80cbe7b0bbbf2015-04-28T15:47:00+02:002015-04-28T15:47:00+02:00Philippe PoisseVie associativeagendacovoituragePHPwigowiz<p>Wigowiz avance petit à petit. Les évolutions étant plus côté back office que front office il est peut-être temps de faire une petite présentation.
Et puis ça fait un bail que je n’ai rien posté sur le blog.</p> <h2>Base de données et générateur de fichiers ICS</h2>
<p><a href="http://wigowiz.addicterra.fr/" hreflang="fr" title="Wigowiz, le site de covoiturage événementiel">Wigowiz</a> étant tourné vers la gestion d’événements la base de données contient principalement des lieux et des dates. Il est assez logique de s’en servir pour créer des agendas en ligne.<br />
J’ai donc écrit un petit parser en PHP qui génère des fichiers ICS à la volée.</p>
<p>C’est très basique, limite laconique, mais pour l’instant ça marche plutôt pas mal.</p>
<h2>Début et fin</h2>
<p>Pour améliorer le fonctionnement des agendas, et par ricochet de <a href="http://wigowiz.addicterra.fr/" hreflang="fr" title="Wigowiz, le site de covoiturage événementiel">Wigowiz</a> il a fallu ajouter l’heure de début des événements et la date et l’heure de fin.<br />
Pour l’aspect visuel du formulaire ce fut l’occasion de rigoler un peu avec JQuery. Si j’ai du courage j’écrirai peut-être un tuto à ce sujet.</p>
<h2>Agenda des utilisateurs</h2>
<p>Grâce à ce nouveau module tous les utilisateurs de Wigowiz dispose donc d’un agenda au format ICS en ligne.<br />
L’URL de l’agenda est disponible dans la page d’accueil de <a href="http://wigowiz.addicterra.fr/" hreflang="fr" title="Wigowiz, le site de covoiturage événementiel">Wigowiz</a>(une fois connecter bien sûr).<br />
Il peut être synchronisé avec des logiciels comme Thunderbird, Outlook, Google Agenda, etc.<br />
Le mode d’emploi devrait arriver courant mai (mais je ne précise pas l’année, au cas où).</p>
<h2>Agenda partagé</h2>
<p>Ce qui est bien avec le SQL c’est qu’on peut faire des requêtes rigolotes avec plein de jointures et de sous-requêtes.<br />
Le résultat est qu’un module permettant de fusion des agendas est en cours de réalisation.<br />
Ainsi plusieurs associations, entreprises ou simples utilisateurs pourront avoir un agenda en commun.<br />
Le générateur de fichier ICS est déjà développé, il suffisait juste de modifier la requête SQL du parser, et le back office ad hoc est en cours.</p>
<h2>À venir</h2>
<p>
Une page dédiée aux agendas serait la bienvenue.<br />
Des tutoriels devront être écrit pour expliquer aux utilisateurs comment se servir des agendas et l’outil d’administration doit être terminé. C’est une partie du boulot de la période mai-juillet.<br />
En août on passe à la factorisation, si on part en vacances, c’est selon.</p>
<p id="conclusion">Wait and see</p>http://blog.philippe-poisse.eu/index.php?post/2015/04/28/Wigowiz-%3A-mise-en-place-d%E2%80%99un-syst%C3%A8me-d%E2%80%99agenda-en-ligne#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/104Wigowiz, part 2urn:md5:106342c95ed637dac129acc14a3f24602014-11-14T00:50:00+01:002014-11-14T00:51:43+01:00Philippe PoisseVie associativehtml5Julien GoguelPHPwigowiz<p>Depuis fin septembre je bosse sur la remise en état de Wigowiz. Le travail avance tranquille mais sûrement.<br />
Un petit point s’impose donc.</p> <h2>Ce qui est fait</h2>
<p>Sans trop vouloir critiquer le travail de Julien Goguel, le code de Wigowiz n’était pas particulièrement bien foutu.<br />
Entre les shorts tags PHP (j’accroche vraiment), les tableaux HTML imbriqués dans des tableaux HTML, les fonctions dépréciées et tout le reste ce n’est pas le boulot de relecture qui manquait.<br />
L’application n’a pas dû être souvent mise à jour entre 2008 et 2013.<br />
Le code HTML a été fortement toiletté, avec un passage en HTML5 et CSS3. Il doit toujours rester quelques scories par-ci par-là. Elles disparaîtront petit à petit.<br />
Le code PHP a été lourdement remanié. Je suis passé à la version 5.4. En attendant la sortie de PHP 7 ça devrait suffire. En passant, si certains sont intéressés, j’ai un bouquin de 2008 sur PHP 6.<br />
Même si l’application reste principalement orientée procédurale quelques classes ont fait leur apparition. Toute la gestion de la base de données est confiée à PDO, un gars de confiance ça fait toujours du bien.<br />
La base de données a été un peu optimisée. Il s’agit surtout de l’ajout de clés étrangères (foreign keys), ce qui a nécessité le passage à InnoDB.
Leaflet a déjà fait sont apparitions, beaucoup plus tôt que prévu d’ailleurs, mais Google Maps reste encore (trop) présent.</p>
<h2>Ce qu’il reste à faire</h2>
<p>Pour faire cours : trop de choses.<br />
Mi-novembre le système d’inscription aux événements et le système de messagerie interne ne sont pas fonctionnels.<br />
La gestion des langues pose encore des soucis, notamment pour l’automatisation de la création de nouveaux textes. C’est peut-être un détail pour vous, mais pour moi ça veut dire beaucoup. Et pour les traducteurs potentiels aussi.<br />
Un outil d’administration doit encore être implémenté.</p>
<h2>
Les étapes à venir</h2>
<p>
Un bêta devrait être en ligne mis décembre. Dans tous les cas Wigowiz sera à nouveau en ligne courant janvier 2015. Au pire ça sera la bêta 2.<br />
Décembre et janvier seront donc consacrés principalement à des tests grandeurs naturels.<br />
J’en reparlerai à ce moment-là.</p>http://blog.philippe-poisse.eu/index.php?post/2014/11/14/Wigowiz%2C-part-2#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/99Liste des points noirsurn:md5:28a2b04e4828d369f267270e4282a11b2013-04-14T19:09:00+02:002013-04-14T19:09:00+02:00Philippe PoisseListe des points noirsaccessibilitéMySQLPHPPoints noirs<p>Fin mars j’ai décidé de mettre l’outil développé pour l’APF66 en libre téléchargement.<br />
Un publipostage vers les autres délégations départementales à suite début avril.<br />
L’outil étant toujours en cours de développement, je débute donc une section du blog qui lui est dédiée.</p> <h2>Bref historique</h2>
<p>En mai 2010 je suis passé chez France Bénévolat, histoire de me trouver un truc à faire pour l’été.<br />
Début juin j’ai été contacté par le responsable accessibilité de l’APF66 qui cherchait quelqu’un pour la réalisation d’un site web dédié à l’accessibilité.<br />
Bien que le handicap moteur ne soit pas ma priorité (je suis infographiste, donc c’est le handicap visuel qui me turlupine), j’ai trouvé le projet intéressant. Et comme ça bouchait une période de vide, je me suis lancé là-dedans.</p>
<h2>
Logique de l’outil</h2>
<p>À la base la partie Web du projet consistait à la mise en ligne, brut de décoffrage, de fichiers PDF.<br />
Une simple page avec une liste aurait suffit.<br />
« Aurait suffit », enfin, sauf pour moi.<br />
Je ne sais plus comment c’est arrivé, mais très vite, une semaine ou deux, l’idée d’un outil cartographique a été validé.<br />
C’est là que le développement commence.</p>
<p>Au niveau de l’architecture rien que du classique. L’architecture est de type 3-tiers : une base de données MySQL, une application PHP qui génère les fichiers à la volée et une application JavaScript pour l’affichage des données.<br />
Les coordonnées GPS et les autres informations sur les points noirs sont stockées dans la base de données. En fait l’application PHP génère les fichiers JavaScript à partir de ces données.<br />
L’outil d’administration permet de saisir les coordonnées GPS sans passer par l’API de géolocalisation de Google.<br />
Au final Google Maps ne sert que pour générer des fonds de cartes. L’outil en lui-même est assez indépendant de Google.</p>
<p>La liste des fichiers PDF correspondant à chaque point noir est aussi générée dynamiquement.<br />
Le gestionnaire du site n’a au final qu’à se soucier de la création du visuel et les bénévoles n’ont qu’à remplir des tableaux en ligne.</p>
<h2>À venir</h2>
<p>Pour l'instant l’outil est toujours en version alpha. C’est la version 0.3 qui est actuellement téléchargeable.<br />
Cette version connait quelques problèmes sur la gestion des quartiers, de plus le schéma de la base de données devrait être corrigé.<br />
La version 0.4 devrait apporter pas mal de correctif.<br />
La version 0.5 devrait apporter de nouvelles fonctions, il faut juste que je décide desquelles un de ces quatre.<br />
Un installateur automatique m’a aussi été demandé. Mais ça, c’est pour plus tard.
</p>
<p>
Pour télécharger la dernière version en date c’est ici <br />
<a href="http://www.philippe-poisse.eu/index.php?page=points_noirs&langue=fr" hreflang="fr" title="La page de téléchargement">http://www.philippe-poisse.eu/index.php?page=points_noirs&langue=fr</a>
</p>:http://blog.philippe-poisse.eu/index.php?post/2013/04/14/Liste-des-points-noirs#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/54Réducteur d'URLurn:md5:1d9e628efbac9076df8fea8afd5a8d912013-03-28T23:19:00+01:002013-03-28T23:59:53+01:00Philippe PoisseProgrammationApachePHP<p>Les sites comme bit.ly ou tinyurl proposent un système de réduction d'<acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> simple à utiliser et gratuit dans son usage de base.<br />
Mais si vous désirez personnaliser les liens ces outils deviennent payant.<br />
Donc je vous propose une solution simple à mettre en œuvre.</p> <h2>Pourquoi réduire ?</h2>
<p>Le nombre de caractères qu'une <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> peut contenir est limité. Mais cette limite dépasse le millier de caractères.<br />
La documentation officiel de Microsoft précise que dans Internet Explorer (le mauvais élève du Web) la limite est de 2048 caractères.<br />
<a href="http://support.microsoft.com/kb/208427/fr" hreflang="fr" title="La documention officielle de Microsoft sur la longueur des URL">http://support.microsoft.com/kb/208427/fr</a><br />
À titre de comparaison ce billet fait 6846 caractères, espace inclus.<br />
Les <acronym title="content system manager">cms</acronym> (dont Dotclear qui propulse ce blogue) ont d'ailleurs tendance à rallonger les <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym>.<br />
Plus l'<acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> est longue plus le risque d'erreur est élevé. De plus la génération et l'impression des QRcode sera plus complexe car les motifs seront plus détaillés et plus petits.<br />
En même temps, la plupart des gens ne retiendront pas un <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> complexe.<br />
Réduire l'<acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> permet de limiter ces problèmes et améliore la communication.</p>
<h2>Pré-requis</h2>
<p>L'outil que j'ai développé nécessite une base de données MySQL et un serveur PHP. De plus votre serveur doit pouvoir gérer des redirections.
En pratique la majorité des hébergeurs proposent des offres qui remplissent ces conditions.</p>
<h2>Principe</h2>
<p>
En pratique l'internaute va saisir une <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> raccourcie. Comme il n'existe aucun fichier répondant à cette <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> le serveur va répondre par un erreur 404. L'astuce est ici.<br />
Grâce à un fichier htaccess l'erreur va être redirigée vers un fichier PHP. Celui-ci récupère l'<acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> et la compare à une liste sauvegardée dans une base de données.<br />
Si le système trouve une correspondance l'internaute est redirigé vers la bonne <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym>. Si aucune correspondance n'est trouvée, un message d'erreur s'affiche.</p>
<p>Comme j'imagine que je ne suis pas très clair, voici les détails techniques.</p>
<h2>La base de données</h2>
<pre>
<code>
CREATE TABLE IF NOT EXISTS `url_liens` (
`id_liens` char(36) NOT NULL,
`adresse_liens` varchar(256) NOT NULL,
`raccourci_liens` varchar(20) NOT NULL,
PRIMARY KEY (`id_liens`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
</code>
</pre>
<p>
Une seule table suffit. Il faudra créer trois colonnes, une pour l'index (id_liens), une pour l'<acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> complète et une la version raccourci.<br />
Au final le code est très simple et facilement adaptable à n'importe quelle base de données SQL.</p>
<h2>Le fichier htaccess</h2>
<pre>
<code>
# Activation de la redirection
RewriteEngine on
# La liste des erreurs
ErrorDocument 404 /modules/erreur/erreur.php?err=404
</code>
</pre>
<p>
L'instruction « RewriteEngine on » sert à s'assurer que le mécanisme de redirection du serveur est bien activé.<br />
La deuxième ligne liste des erreurs qui vont provoquer une redirection et vers quel fichier la redirection aura lieu. C'est l'instruction « ErrorDocument » qui indique au serveur qu'il doit prend en compte les erreurs.<br />
Dans le cas présent le fichier gère une erreur 404. Pour d'autres type d'erreur il suffit de changer le numéro de l'erreur.<br />
Vous pouvez ajouter autant de ligne que vous le désirez. Par contre le fichier vers lequel vous redirigez l'erreur doit être adapté.<br />
Ensuite vous indiquez le chemin relatif vers le fichier qui fait office de gestionnaire d'erreur.</p>
<p>
Le fichier htaccess doit être à la racine de votre site. Mettre le fichier ailleurs vous oblige à modifier le chemin vers le gestionnaire d'erreur, mais risque aussi de rallonger les <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym>. Ce qui serait contre productif.</p>
<h2>Le gestionnaire d'erreur</h2>
<pre>
<code>
<?php
$adresse = $_SERVER['REQUEST_URI'];
$adresse_2 = str_replace("/", "", $adresse);
/*
*Cette partie concerne la base de données.
*/
//Inclusion du fichier de configuration de la connexion à la Base de Données.
include_once ("../ma_connection.php");
//Requête SQL.
$sql = "SELECT * FROM `url_liens` WHERE `raccourci_liens` LIKE '$adresse_2' LIMIT 1";
//Exécution de la requête.
$resultat = $dbh->query($sql);
$resultat_lien = $resultat -> fetchall(PDO::FETCH_ASSOC);
//Vérification des résultats.
$compte = count($resultat_lien);
if ($compte != "1"){
$msg="<h1>Erreur</h1>‹br />";
$msg.="La page".$site.$_SERVER['REQUEST_URI']." demandée n'existe pas<br />";
$msg.="Votre IP :".$_SERVER['REMOTE_ADDR']."<br />";
echo $msg ;
} else {
$lien = $resultat_lien['0']['adresse_liens'];
$redirection = 'Location: '.$lien;
header($redirection);
}
?>
</code>
</pre>
<p>Dans un premier temps on récupère l'adresse saisie par l'internaute. Par exemple : www.philippe-poisse.eu/contact<br />
Dans cet exemple la variable $adresse ne contiendra que « /contact ». La nom de domaine ne sera pas récupéré par le système.
La variable $adresse_2 sert à supprimer le « / », il suffit d'utiliser la fonction str_replace pour cela.<br />
L'adresse réduite est donc correctement récupérée. Il ne reste plus qu'à faire la comparaison avec la base de données.</p>
<p>On va donc commencer par inclure le fichier de configuration pour la base de données. Personnellement j'utilise PDO, ça simplifie le travail.<br />
La requête est un simple « select », pensez toutefois à mettre « LIMIT 1 » pour un peu la sécuriser.<br />
Les deux lignes suivantes c'est du grand classique : on exécute la requête et on récupère le résultat sous forme de tableau associatif.<br />
La variable « $compte » sert à bien vérifié le nombre de ligne contenu dans le tableau. C'est une deuxième sécurité.</p>
<p>Maintenant qu'on a le résultat issu de la base de données on est confronté à deux possibilités :</p>
<ul>
<li>le tableau ne contient qu'une seule ligne, donc le lien pour la redirection existe ;</li>
<li>le tableau ne contient aucune ou plusieurs lignes, donc il n'y a pas de lien et on doit afficher un message d'erreur.</li>
</ul>
<p>Dans le deuxième, si vous avez plusieurs lignes c'est que soit vous avez fait une erreur dans votre base de données soit vous avez été piraté.</p>
<p>
Un test conditionnel avec un bon vieux if else va finir le boulot.<br />
Si $compte est différent de 1 (le deuxième cas), on affiche le message d'erreur qui sera contenu dans la variable « $msg ». Je vous laisse libre du contenu du message d'erreur.<br />
Si $compte est égale à 1 la redirection à lieu. Pour rediriger c'est la fonction header qui est utilisée, donc si vous complexifiez votre programme pensez à ne pas envoyer d'information avant d'appeler cette fonction, sinon le système plante lamentablement.</p>
<p>
Deux exemples basiques :<br />
Au lieu de taper :<br />
<a href="http://www.philippe-poisse.eu/index.php?page=contact" hreflang="fr" title="La page de contact sur le site de Philippe Poisse">http://www.philippe-poisse.eu/index.php?page=contact</a><br />
Essayez :<br />
<a href="http://www.philippe-poisse.eu/contact" hreflang="fr" title="L'URL réduit pour atteindre la page de contact sur la site de Philippe Poisse ">http://www.philippe-poisse.eu/contact</a></p>
<p>
Pareil avec cette <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> :<br />
<a href="http://www.accessibilite-apf66.org/index.php?page=detail&commune=32" hreflang="fr" title="Lien vers la page Rivesaltes dans la liste des Points Noirs Accessibilité">http://www.accessibilite-apf66.org/index.php?page=detail&commune=32</a><br />
Raccourci en :<br />
<a href="http://www.accessibilite-apf66.org/rivesaltes" hreflang="fr" title="La page sur Rivesaltes concernant les Points Noirs Accessibilité">http://www.accessibilite-apf66.org/rivesaltes</a></p>
<p>
Vous pouvez aussi rediriger vers un autre site :<br />
par exemple depuis une adresse appartenant au site de l'APF66 :<br />
<a href="http://www.accessibilite-apf66.org/nataph" hreflang="fr" title="Une URL réduite redirigeant vers les site de NATAPH">www.accessibilite-apf66.org/nataph</a></p>
<h2>Au final</h2>
<p>
Même si je n'ai présenté que la partie « frontoffice » de cet outil, il est très simple à mettre en œuvre. Même si vous n'êtes en mesure de développer un backoffice vous pouvez toujours travailler depuis phpMyAdmin.</p>
<p>Donc maintenant plus d'excuse si vous utiliser des <acronym title="Uniform Resource Locator, une adresse Web en français">URL</acronym> à rallonge.</p>http://blog.philippe-poisse.eu/index.php?post/2013/03/28/R%C3%A9ducteur-d-URL#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/53HTML2PDF: un formulaire PDF en ligne automatiqueurn:md5:1029535e04edda61c65ef3b8832830952013-03-21T14:53:00+01:002016-06-02T16:51:01+02:00Philippe PoisseProgrammationFormulaire PDFHTMLHTML2PDFPHP<p>La génération dynamique de PDF depuis une page Web étant très demandée j'ai fini par m'y mettre. Pour ce faire j'utilise la bibliothèque HTML2PDF.<br />
Bonne surprise en travaillant sur mon formulaire de contact, cette bibliothèque génère des formulaire PDF tout à fait utilisables.</p> <h2>Pré-requis</h2>
<p><a href="http://html2pdf.fr/" hreflang="fr" title="Le site officiel HTML2PDF">HTML2PDF</a> utilise en fait deux bibliothèques : FPDF pour les programmes en PHP 4 et TCPDF pour les programmes en PHP 5. Je ne serais trop vous conseiller d'utiliser la version PHP 5.<br />
Normalement le code HTML doit être écrit en HTML 4 et doit être valide.<br />
Pour l'utiliser quelques connaissances en PHP, HTML et CSS sont obligatoires. Mais le niveau nécessaire n'est pas très élevé et le forum est plutôt bien fait.</p>
<h2>Rapide présentation de l'utilisation</h2>
<p>La bibliothèque doit être installer sur votre serveur, ça va sans dire.<br />
Vous devrez faire une maquette pour l'affichage de vos pages. Cette maquette doit être écrite avec un langage de balises proche du HTML.<br />
Ensuite vous n'avez plus qu'à fusionner votre maquette et le contenu de votre page via un peu de code PHP.<br />
Vous trouverez toutes les informations utiles sur le<a href="http://www.yaronet.com/html2pdf" hreflang="fr" title="Le forum de HTML2PDF"> forum officiel.</a><br />
À noter que, pour moi, le plus difficile a été de réaliser la maquette du fait de la gestion, parfois curieuse, du CSS.</p>
<h2>Et mon formulaire PDF ?</h2>
<p>En pratique vous allez injecter du code HTML dans un gabarit qui sera analysé par la bibliothèque de manière à générer un PDF fonctionnel. Le rendu des balises est donc prédéfini.<br />
Le comportement des balises input, select et textarea est donc prévisible. Une fois le PDF généré ces balises donnent des champs de formulaire tout à fait exploitables.<br />
La seule limite est que les attributs non compatible HTML 4 pour les inputs ne seront pas pris en compte.<br />
De plus les boutons du type « envoyer » ne fonctionnent plus une fois converti en PDF. Je n'ai pas testé l'insertion de code JavaScript, mais j'imagine que cela doit être tout à fait possible.</p>
<p>Vous pouvez voir un exemple de formulaire PDF généré dynamiquement à cette adresse (merci de cliquer sur le petit lien « version pdf ») :<br />
<a href="http://www.philippe-poisse.eu/index.php?page=contact&langue=fr&pdf=yes" hreflang="fr" title="Un exemple de formulaire PDF dynamique sur le site www.philippe-poisse.eu">http://www.philippe-poisse.eu/index.php?page=contact&langue=fr</a><br />
Vous noterez que la page qui est utilisée est écrite en HTML 5.</p>
<p>Au final, en moins d'une heure si votre maquette n'est pas trop complexe, vous pouvez facilement générer un formulaire PDF à partir d'une simple page Web.</p>http://blog.philippe-poisse.eu/index.php?post/2013/03/21/HTML2PDF%3A-un-formulaire-PDF-en-ligne-automatique#comment-formhttp://blog.philippe-poisse.eu/index.php?feed/atom/comments/52