<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Coding style</title>
	<atom:link href="http://www.codingstyle.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codingstyle.fr</link>
	<description>PHP, AJAX et autres friandises binaires</description>
	<pubDate>Fri, 10 Dec 2010 23:16:25 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Une décennie de technique</title>
		<link>http://www.codingstyle.fr/2010/02/08/une-decennie-de-technique/</link>
		<comments>http://www.codingstyle.fr/2010/02/08/une-decennie-de-technique/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 07:00:03 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Bases de données]]></category>

		<category><![CDATA[HTML/CSS]]></category>

		<category><![CDATA[Javascript/AJAX]]></category>

		<category><![CDATA[Mobile]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=208</guid>
		<description><![CDATA[En même temps que s&#8217;achevait cette décennie, je passais fin janvier le cap de 10 ans de programmation en milieu professionel. L&#8217;occasion de m&#8217;essayer à une petite synthèse@ sur les changements survenus entre 2000 et 2010.
Ce qui a changé depuis 2000 :

PHP n&#8217;est plus &#8220;le langage pour faire des formulaires de contact&#8221;
Javascript enrichit visuellement la [...]]]></description>
			<content:encoded><![CDATA[<p>En même temps que s&#8217;achevait cette décennie, je passais fin janvier le cap de 10 ans de programmation en milieu professionel. L&#8217;occasion de m&#8217;essayer à une petite synthèse@ sur les changements survenus entre 2000 et 2010.</p>
<p>Ce qui a changé depuis 2000 :</p>
<ul>
<li>PHP n&#8217;est plus &#8220;le langage pour faire des formulaires de contact&#8221;</li>
<li>Javascript enrichit visuellement la page (et plus seulement avec des alert)</li>
<li>Les GIF animé ont disparu</li>
<li>Linux a enfin une vraie distribution orientée utilisateur avec Ubuntu</li>
<li>ASP, Perl, ColdFusion&#8230;</li>
<li>Les smartphones (surtout depuis l&#8217;iPhone)</li>
<li>La vitesse de connexion à Internet, permettant d&#8217;y faire passer la TV et le téléphone</li>
<li>La sécurité des technologies Microsoft</li>
<li>Les charlatans qui imaginaient se faire rapidement du fric avec une start-up</li>
<li>La gestion de configuration, de Subversion à Git</li>
</ul>
<p>Ce qui n&#8217;a pas changé depuis 2000 :</p>
<ul>
<li>Flash met le feu au CPU</li>
<li>Java rame</li>
<li>Internet Explorer 6 est la lie de l&#8217;humanité</li>
<li>Les Design Pattern, à toujours avoir dans sa caisse à outils</li>
<li>Google</li>
<li>L&#8217;interprétation des pages par les navigateurs, obligeant à patcher pour chacun d&#8217;entre eux</li>
<li>Les commerciaux qui ne comprennent toujours rien à la technique</li>
<li>Les développeurs  vus comme des ours mal léchés</li>
<li>Les charettes dans les agences Web</li>
<li>Les protocoles utilisés sur Internet</li>
<li>Il manque toujours un truc à MySQL</li>
<li>L&#8217;open source est un laboratoire de bonnes idées</li>
<li>La loi de Moore</li>
<li>La loi de Murphy</li>
</ul>
<p>La liste est bien entendu pas exhaustive et totalement subjective. Vous voyez d&#8217;autres changements (ou pas) pendant cette décennie ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2010/02/08/une-decennie-de-technique/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Traitement d&#8217;un gros volume de données avec Symfony et Doctrine</title>
		<link>http://www.codingstyle.fr/2010/02/07/traitement-gros-volume-de-donnees-avec-symfony-et-doctrine/</link>
		<comments>http://www.codingstyle.fr/2010/02/07/traitement-gros-volume-de-donnees-avec-symfony-et-doctrine/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 08:18:50 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Bases de données]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[doctrine]]></category>

		<category><![CDATA[mémoire]]></category>

		<category><![CDATA[symfony]]></category>

		<category><![CDATA[task]]></category>

		<category><![CDATA[volumétrie]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=195</guid>
		<description><![CDATA[Retour d&#8217;expérience sur un projet avec Symfony, où il est question de consommation de mémoire excessive et de volumétrie.

Le site à réaliser est un portage d&#8217;un ancien projet PHP vers Symfony 1.2 + Doctrine. Un point d&#8217;attention en particulier touche à la reprise des données existantes du site V1 tournant sous un antique MySQL 3.23 [...]]]></description>
			<content:encoded><![CDATA[<p>Retour d&#8217;expérience sur un projet avec Symfony, où il est question de consommation de mémoire excessive et de volumétrie.</p>
<p><span id="more-195"></span></p>
<p>Le site à réaliser est un portage d&#8217;un ancien projet PHP vers Symfony 1.2 + Doctrine. Un point d&#8217;attention en particulier touche à la reprise des données existantes du site V1 tournant sous un antique MySQL 3.23 et un stockage MyISAM.</p>
<p>Le développement d&#8217;une pake task a été privilégiée au détriment de fixtures YAML :</p>
<ul>
<li>volume de données important (près de 500000 comptes utilisateurs à injecter dans des sfGuardUser, sans compter toutes les données dépendantes) qui aurait abouti à des fichiers YML longs à vérifier,</li>
<li>changements profonds dans la structure de la base de données entre la V1 et la V2</li>
<li>avoir le contrôle sur les données importées (notamment connaitre le nombre d&#8217;erreurs et leur nature)</li>
<li>pouvoir tirer malgré tout parti de la puissance de Symfony (Validators, Doctrine&#8230;)</li>
</ul>
<p>Quelques points sont cependant importants à vérifier.</p>
<p>1) <strong>Attention aux fuites mémoire avec les objets<br />
</strong><br />
L&#8217;import des données a donné lieu a de nombreuses boucles pour fabriquer les objets Doctrine. Ces derniers utilisent beaucoup de références circulaires, que PHP ne gère plus depuis la 5.2.5.<br />
Ceci se résoud avec deux appels importants :</p>
<ul>
<li>utilisation de la méthode <a href="http://www.doctrine-project.org/documentation/manual/1_1/en/improving-performance:free-objects" target="_blank">free</a> d&#8217;un objet Doctrine qui libère les ressources allouées à l&#8217;objet, et se débarrasse des références circulaires</li>
<li>utilisation de <a href="http://php.net/unset" target="_blank">unset</a>($obj) pour supprimer la variable complètement.</li>
</ul>
<p>La 1ère version du script qui engloutissait la mémoire, passe désormais sous une barre satisfaisante de 128M. Une boucle de traitement sur une ancienne table donne ceci :</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$results</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$datav1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #0000ff;">$o</span> = <span style="color: #000000; font-weight: bold;">new</span> ObjectV2<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$s</span>-&amp;gt;name = <span style="color: #0000ff;">$datav1</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #0000ff;">$o</span>-&amp;gt;save<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0000ff;">$o</span>-&amp;gt;free<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000066;">unset</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$o</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>2) <strong>Faire travailler au maximum MySQL plutôt que PHP<br />
</strong><br />
Nous avons trouvé des adresses emails folkloriques dans les comptes utilisateurs : des valeurs avec espaces et des formats d&#8217;adresses non-standard principalement, qui ont fait hurler sfValidatorEmail tout le long de l&#8217;import. La solution :</p>
<ul>
<li>requête de TRIM préalable pour &#8220;épurer&#8221; les adresses e-mail valides qui contenaient des espaces,</li>
<li>utilisation de la clause RLIKE sur la requête de chargement des utilisateurs, pour contrôler en amont - plutôt que de faire subir à Symfony et PHP - la validation de comptes avec des adresses e-mail bidons</li>
</ul>
<p>Le requête de filtrage avec RLIKE donne ceci :</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$sql</span> = <span style="color: #ff0000;">'SELECT t.* FROM MaTableV1 t WHERE t.email RLIKE <span style="color: #000099; font-weight: bold;">\'</span>^[[:alnum:][.period.][.hyphen.][.underscore.]]+@([[:alnum:][.hyphen.][.underscore.]]+[.period.])+.([[:alnum:][.hyphen.]]){2,4}$<span style="color: #000099; font-weight: bold;">\'</span>'</span>;
<span style="color: #0000ff;">$q</span> = <span style="color: #0000ff;">$conn</span>-&amp;gt;query<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sql</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$q1</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span> =&amp;gt; <span style="color: #0000ff;">$dataV1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// Traitement des données</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Sur le schéma de la base de données &#8220;V1&#8243;, il est également nécessaire de s&#8217;assurer que les optimisations basiques sont en place pour les requêtes d&#8217;import :</p>
<ul>
<li>présence de clés primaires</li>
<li>présence d&#8217;index sur les &#8220;clés étrangères&#8221;</li>
<li>présence d&#8217;index sur les champs utilisés dans les clauses WHERE, ORDER BY des requêtes d&#8217;import</li>
</ul>
<p>A noter que la lecture des données de la V1 est effectuée directement à l&#8217;aide de PDO :</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$conn</span> = <span style="color: #000000; font-weight: bold;">new</span> PDO<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'mysql:dbname='</span> . <span style="color: #0000ff;">$arguments</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#93;</span> . <span style="color: #ff0000;">';host='</span> . <span style="color: #0000ff;">$arguments</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'host'</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$arguments</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'username'</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #0000ff;">$arguments</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'password'</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
...
<span style="color: #0000ff;">$q</span> = <span style="color: #0000ff;">$conn</span>-&amp;gt;query<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$sql</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2010/02/07/traitement-gros-volume-de-donnees-avec-symfony-et-doctrine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Retour sur iPhone Tech Talk</title>
		<link>http://www.codingstyle.fr/2009/11/11/retour-sur-iphone-tech-talks/</link>
		<comments>http://www.codingstyle.fr/2009/11/11/retour-sur-iphone-tech-talks/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 11:42:40 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Mobile]]></category>

		<category><![CDATA[apple]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[tech talk]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=191</guid>
		<description><![CDATA[J&#8217;ai eu la possibilité lundi d&#8217;aller assister à l&#8217;iPhone Tech Talk donnée à Paris (Cité Universitaire ) par Apple. Dans le sens où je me suis autoformé sur la programmation Objective-C avec l&#8217;API d&#8217;Apple, c&#8217;était intéressant de voir où se situer au niveau des pratiques d&#8217;utilisation, d&#8217;optimisation de code, de débogage.
Les présentations étaient d&#8217;un bon [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-192" title="iPhone Tech Talks" src="http://www.codingstyle.fr/wp-content/uploads/2009/11/iphone-tech-300x274.png" alt="iPhone Tech Talks" width="300" height="274" />J&#8217;ai eu la possibilité lundi d&#8217;aller assister à l&#8217;iPhone Tech Talk donnée à Paris (Cité Universitaire ) par Apple. Dans le sens où je me suis autoformé sur la programmation Objective-C avec l&#8217;API d&#8217;Apple, c&#8217;était intéressant de voir où se situer au niveau des pratiques d&#8217;utilisation, d&#8217;optimisation de code, de débogage.</p>
<p>Les présentations étaient d&#8217;un bon niveau technique, les personnes dans la salle ayant déjà une licence développeur et avaient (sûrement) toutes déjà posté une appli sur l&#8217;App Store. Les &#8220;senior evangelists&#8221; d&#8217;Apple étaient déjà bien rôdés puisque Paris était leur dernière date.</p>
<p>Démarrage avec un speech d&#8217;une heure dont j&#8217;ai retenu quelques exemples de killer-apps, comme <a href="http://www.atebits.com/tweetie-iphone/" target="_blank">Tweetie</a> pour sa fonction de rechargement des Tweets, <a href="http://www.zipcar.com/iphone/" target="_blank">Zipcar</a> pour son appli de location d&#8217;autos, <a href="http://www.nationwide.com/mobile/iPhone-support.jsp" target="_blank">NationWide</a> pour son système de déclaration d&#8217;accidents.</p>
<p>Les présentations techniques que j&#8217;ai suivi sont restées dans la ligne de conduite que je m&#8217;étais fixée, à savoir le besoin immédiat pour mon job. Je suis donc resté suivre Effective Apps Parties 1 et 2, qui ont notamment traité de sujets sur le stockage d&#8217;informations utilisateur. J&#8217;ai surtout eu un très bon tuto sur l&#8217;excellente couche d&#8217;abstraction pour faire du threading avec NSOperations et NSOperationsQueue.</p>
<p>L&#8217;après midi était lui consacré à Core Data, un système d&#8217;objets relationnels avec backend SQLite qui fait totalement abstration du SQL pour tout piloter en Objective-C avec XCode. Puis aux tests unitaires et débogage, avec l&#8217;utilisation de SenTesting, et aussi Instruments pour détecter aussi bien les problèmes de mémoire que les UIView transparents (source de perte de performance).</p>
<p>La journée a été très riche en infos et je repars au feu avec plein de bonnes idées et d&#8217;astuces pour mener à bien les projets !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/11/11/retour-sur-iphone-tech-talks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mise en place de SSL pour des développements</title>
		<link>http://www.codingstyle.fr/2009/08/26/mise-en-place-de-ssl-pour-des-developpements/</link>
		<comments>http://www.codingstyle.fr/2009/08/26/mise-en-place-de-ssl-pour-des-developpements/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 09:42:22 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[ssl openssl auto-signe certificat apache iis]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=168</guid>
		<description><![CDATA[Dans le cadre d&#8217;un projet nécessitant de la sécurité, il peut s&#8217;avérer nécessaire de mettre en place SSL. L&#8217;achat d&#8217;un certificat pour des postes de développement s&#8217;avère coûteux et inutile, puisqu&#8217;il est possible de faire des certificats auto-signés pour Apache et IIS, en mettant un tout petit peu les mains dans le cambouis.

Dans les deux [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre d&#8217;un projet nécessitant de la sécurité, il peut s&#8217;avérer nécessaire de mettre en place SSL. L&#8217;achat d&#8217;un certificat pour des postes de développement s&#8217;avère coûteux et inutile, puisqu&#8217;il est possible de faire des certificats auto-signés pour Apache et IIS, en mettant un tout petit peu les mains dans le cambouis.</p>
<p><span id="more-168"></span></p>
<p>Dans les deux cas, la procédure est la même :<br />
- générer une demande de signature de certificat (CSR)<br />
- signer le certificat avec OpenSSL<br />
- intégrer le certificat dans la config de l&#8217;hôte virtuel</p>
<p>Dans le cas de IIS, le serveur génère une demande de certificat qu&#8217;on fera signer par OpenSSL. Dans le cas d&#8217;Apache, OpenSSL peut générer la demande et l&#8217;auto-signer.</p>
<p><strong>IIS</strong></p>
<p>Etape 1 : Aller dans les propriétés du site virtuel, puis dans l&#8217;onglet Sécurité de répertoire.</p>
<p>Cliquez sur le bouton Certificat serveur en bas de l&#8217;onglet.  Un assistant s&#8217;affiche.</p>
<p style="text-align: center;"><img class="aligncenter size-thumbnail wp-image-173" title="Propriétés IIS" src="http://www.codingstyle.fr/wp-content/uploads/2009/04/certif1-150x150.gif" alt="Propriétés IIS" width="150" height="150" /></p>
<p>Choisissez &#8220;Créer un certificat&#8221;, puis sur l&#8217;écran suivant &#8220;Préparer la demande mais ne pas l&#8217;envoyer maintenant&#8221;. Saisissez ensuite les informations administratives sur les écrans suivants et enfin l&#8217;emplacement où sera stockée votre demande (par défaut c:\certreq.txt).</p>
<p style="text-align: center;"><img class="aligncenter size-thumbnail wp-image-174" title="Créer un certificat" src="http://www.codingstyle.fr/wp-content/uploads/2009/04/certif2-150x150.gif" alt="Créer un certificat" width="150" height="150" /> <img class="aligncenter size-thumbnail wp-image-175" title="Préparer la demande mais ne pas l'envoyer maintenant" src="http://www.codingstyle.fr/wp-content/uploads/2009/04/certif3-150x150.gif" alt="Préparer la demande mais ne pas l'envoyer maintenant" width="150" height="150" /></p>
<p>Etape 2 : Installez une version Windows d&#8217;OpenSSL. Elle est disponible <a href="http://www.slproweb.com/products/Win32OpenSSL.html" target="_blank">ici</a>.</p>
<p>Etape 3 : Exécutez ensuite les commandes suivantes :</p>
<p>Génération de la clé :</p>

<div class="wp_syntax"><div class="code"><pre>openssl genrsa -des3 -out CA.key 1024</pre></div></div>

<p>Génération du certificat racine</p>

<div class="wp_syntax"><div class="code"><pre>openssl req -new -key CA.key -x509 -days 1095 -out CA.crt</pre></div></div>

<p>Signature de la demande générée par IIS (certreq.txt) dans un certificat (autosigne.cer) :</p>

<div class="wp_syntax"><div class="code"><pre>openssl x509 -req -days 365 -in c:/certreq.txt -CA CA.crt -CAkey CA.key
-CAcreateserial -out c:/autosigne.cer</pre></div></div>

<p>Etape 4 : Intégrer le certificat auto-signé sur le site web. Retourner dans l&#8217;onglet Sécurité de répertoire sur le site virtuel d&#8217;IIS, cliquer à nouveau sur Certificat serveur. Sélectionnez Traiter la demande en attente, puis sélectionnez le fichier autosigne.cer. Le certificat SSL est installé.</p>
<p style="text-align: center;"><img class="aligncenter size-thumbnail wp-image-176" title="Sélection du certificat signé" src="http://www.codingstyle.fr/wp-content/uploads/2009/04/certif4-150x150.gif" alt="Sélection du certificat signé" width="150" height="150" /></p>
<p><strong>Apache</strong></p>
<p>Le fonctionnement est assez simple pour Apache.</p>
<p>Etape 1 : installation d&#8217;OpenSSL avec votre outil préférentiel sous Linux (yum, apt-get, emerge&#8230;). Note pour les utilisateurs de WampServer : OpenSSL est déjà intégré dans le dossier bin d&#8217;Apache.</p>
<p>Etape 2 : création du CSR avec OpenSSL et génération de la clé et du certificat serveur.</p>

<div class="wp_syntax"><div class="code"><pre>openssl req -new -x509 -nodes -out server.crt -keyout server.key</pre></div></div>

<p>Placez les fichiers server.crt et server.key dans un dossier à part (par exemple dans un dossier /etc/ssl sous Linux, ou dans le dossier conf/ssl/ d&#8217;Apache Windows).</p>
<p>Etape 3 : intégration dans Apache.</p>
<p>Assurez vous d&#8217;avoir mod_ssl activé.  Le cas échéant lancez la commande :</p>

<div class="wp_syntax"><div class="code"><pre>a2enmod mod_ssl
/etc/init.d/apache2 reload</pre></div></div>

<p>ou activez-le depuis votre environnement WampServer ou EasyPHP.</p>
<p>Ensuite éditez le fichier de configuration Apache. Recherchez les directives SSLCertificateFile et SSLCertificateKeyFile (elles sont souvent en commentaire), et indiquez le chemin vers vos deux fichiers server.key et server.crt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/08/26/mise-en-place-de-ssl-pour-des-developpements/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quelques optimisations en JS</title>
		<link>http://www.codingstyle.fr/2009/03/26/quelques-optimisations-en-js/</link>
		<comments>http://www.codingstyle.fr/2009/03/26/quelques-optimisations-en-js/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 06:30:14 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Javascript/AJAX]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[optimisation]]></category>

		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=81</guid>
		<description><![CDATA[Cet article présente quelques astuces en Javascript pour optimiser vos algorithmes et la performance de vos scripts.
Au niveau du code 
Précalculer le plus possible
Mise en &#8220;cache&#8221; dans des variables : par exemple l&#8217;accès à la propriété d&#8217;un objet enfouie sous plusieurs niveaux, ou un valeur utilisée dans la déclaration d&#8217;une boucle for.

// Pas bien
for (var [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article présente quelques astuces en Javascript pour optimiser vos algorithmes et la performance de vos scripts.</p>
<p><strong>Au niveau du code </strong></p>
<p><em>Précalculer le plus possible</em></p>
<p>Mise en &#8220;cache&#8221; dans des variables : par exemple l&#8217;accès à la propriété d&#8217;un objet enfouie sous plusieurs niveaux, ou un valeur utilisée dans la déclaration d&#8217;une boucle for.</p>

<div class="wp_syntax"><div class="code"><pre>// Pas bien
for (var n = 0; n &amp;lt; monObjet.maPropriete1.maPropriete2.valeur; n++) {
	// ...
}
&nbsp;
// Bien
var len = monObjet.maPropriete1.maPropriete2.valeur;
&nbsp;
for (var n = 0; n &amp;lt; len; n++) {
	// ...
}</pre></div></div>

<p><em>Interdiction d&#8217;utiliser eval ! </em></p>
<p>A l&#8217;instar de n&#8217;importe quel langage, la fonction eval est un gouffre à performances. L&#8217;éviter autant que possible. Il y a bien entendu des alternatives :</p>

<div class="wp_syntax"><div class="code"><pre>// Pas bien
eval(&quot;obj.&quot;+prop)
&nbsp;
// Bien
obj[prop]</pre></div></div>

<p><em>Concaténation de chaines</em></p>
<p>Utilisation d&#8217;un Array pour concaténer les chaines et liaison à l&#8217;aide de la méthode join(). Les développeurs de Microsoft le recommandent dans le doc en bas, à la manière d&#8217;un StringBuilder en .Net ou en Java :</p>

<div class="wp_syntax"><div class="code"><pre>var sb = new Array();
sb.push(&quot;
&nbsp;
&quot;);
sb.push(monTexte);
sb.push(monTexte2);
sb.push(&quot;
&nbsp;
&quot;);
&nbsp;
var s = sb.join(&quot;&quot;);</pre></div></div>

<p><strong>Au niveau des fichiers</strong></p>
<p><em>Minifier les Javascripts en production</em></p>
<p>But : optimiser le chargement du script pour l&#8217;interprétation (bande passante utilisée, temps d&#8217;interprétation par le moteur JS du navigateur). Il existe d&#8217;excellents outils pour effectuer cette tâche : <a href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUICompressor</a>, <a href="http://fmarcia.info/jsmin/test.html" target="_blank">JSMinifier</a>&#8230; Dans l&#8217;idéal, s&#8217;assurer que tout le JS est envoyé avec un seul appel HTTP.</p>
<p><em>Mettre les déclarations en bas de page </em></p>
<p>Le plus près possible de la fermeture de l&#8217;élément body (&lt;/body&gt;). Cela permet d&#8217;exécuter le code à l&#8217;issue du chargement complet du HTML, évitant du coup un blocage en plein milieu du rendu de la page.</p>
<p><strong>Bibliographie rapide<br />
</strong></p>
<ul>
<li>IEBlog : IE+Javascript Performance Recommendations : <a href="http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx" target="_blank">Partie 1</a>, <a href="http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx" target="_blank">Partie 2</a>, et <a href="http://blogs.msdn.com/ie/archive/2007/01/04/ie-jscript-performance-recommendations-part-3-javascript-code-inefficiencies.aspx" target="_blank">Partie 3</a></li>
<li>JScript Blog : Performance optimization of arrays : <a href="http://blogs.msdn.com/jscript/archive/2008/03/25/performance-optimization-of-arrays-part-i.aspx" target="_blank">Partie 1</a> et <a href="http://blogs.msdn.com/jscript/archive/2008/04/08/performance-optimization-of-arrays-part-ii.aspx" target="_blank">Partie 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/03/26/quelques-optimisations-en-js/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blog indisponible</title>
		<link>http://www.codingstyle.fr/2009/02/22/blog-indisponible/</link>
		<comments>http://www.codingstyle.fr/2009/02/22/blog-indisponible/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 10:56:59 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Autres]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[permissions]]></category>

		<category><![CDATA[suexec]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=154</guid>
		<description><![CDATA[Une coupure du blog durant 2 jours depuis vendredi l&#8217;a rendu inaccessible, affichant une très esthétique page d&#8217;erreur 500.
La raison est qu&#8217;OVH a pris le soin d&#8217;activer le suEXEC d&#8217;Apache, bloquant de fait mes fichiers qui avaient - à tort - des permissions trop élevées. Après quelques aller-retours sur la doc de suEXEC, et sur les [...]]]></description>
			<content:encoded><![CDATA[<p>Une coupure du blog durant 2 jours depuis vendredi l&#8217;a rendu inaccessible, affichant une très esthétique page d&#8217;erreur 500.</p>
<p>La raison est qu&#8217;OVH a pris le soin d&#8217;activer le suEXEC d&#8217;Apache, bloquant de fait mes fichiers qui avaient - à tort - des permissions trop élevées. Après quelques aller-retours sur la <a href="http://httpd.apache.org/docs/trunk/fr/suexec.html" target="_blank">doc de suEXEC</a>, et sur les<a href="http://forums.ovh.net/" target="_blank"> forums d&#8217;OVH</a>, j&#8217;ai finalement trouvé la solution : mettre des permissions 755 (rwxr-xr-x) sur les dossiers et 644 (rw- r&#8211; r&#8211;) sur les fichiers.</p>
<p>Je vous fais partager un petit script vite fait pour redéfinir correctement les permissions sur les 3 blogs hébergés sur mon espace :</p>

<div class="wp_syntax"><div class="code"><pre class="bash"><span style="color: #808080; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#91;</span> ! -d /chemin/vers/www/$<span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#93;</span>
<span style="color: #b1b100;">then</span>
        <span style="color: #000066;">echo</span> <span style="color: #ff0000;">&quot;Veuillez specifier un dossier valide&quot;</span>
        <span style="color: #000066;">exit</span> <span style="color: #cc66cc;">0</span>
<span style="color: #b1b100;">fi</span>
&nbsp;
<span style="color: #000066;">echo</span> <span style="color: #ff0000;">&quot;Correction des permissions du dossier $1&quot;</span>
&nbsp;
find /chemin/vers/www/$<span style="color: #cc66cc;">1</span> -<span style="color: #000066;">type</span> d -<span style="color: #000066;">exec</span> chmod <span style="color: #0000ff;">u=</span>rwx,<span style="color: #0000ff;">go=</span>rx <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span> \;
find /chemin/vers/www/$<span style="color: #cc66cc;">1</span> -<span style="color: #000066;">type</span> f -<span style="color: #000066;">exec</span> chmod <span style="color: #0000ff;">u=</span>rw,<span style="color: #0000ff;">go=</span>r <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span> \;
&nbsp;
<span style="color: #000066;">echo</span> <span style="color: #ff0000;">&quot;OK effectue&quot;</span></pre></div></div>

<p>Enregistrez le script sous fix_suexec.sh, mettez lui les droits en exécution pour l&#8217;utilisateur propriétaire, puis lancez-le comme suit :</p>

<div class="wp_syntax"><div class="code"><pre>user@hebergement:~/# ./fix_suexec.sh mondossierweb</pre></div></div>

<p>Je ne remercie pas OVH sur ce coup, pour faire des modifications aussi critiques sur son hébergement sans prendre la peine de prévenir ses utilisateurs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/02/22/blog-indisponible/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Modules de paiement sécurisés (5/5)</title>
		<link>http://www.codingstyle.fr/2009/01/29/modules-de-paiement-securises-55/</link>
		<comments>http://www.codingstyle.fr/2009/01/29/modules-de-paiement-securises-55/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 06:00:11 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[Bases de données]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[carte bancaire]]></category>

		<category><![CDATA[cic]]></category>

		<category><![CDATA[credit mutuel]]></category>

		<category><![CDATA[cybermut]]></category>

		<category><![CDATA[e-commerce]]></category>

		<category><![CDATA[m-commerce]]></category>

		<category><![CDATA[paiement]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/?p=43</guid>
		<description><![CDATA[Dernier article qui clôt ce mini-dossier présente le module Paybox et conclut avec un comparatif synthétique des modules.
Paybox
Paybox est édité par la société éponyme. Le module de paiement sécurisé est décliné en plusieurs moutures : version avec interface de paiement tierce, paiement envoyédepuis le site marchand, version pour mobile.
La plupart des grandes fonctionnalités sont présentes [...]]]></description>
			<content:encoded><![CDATA[<p>Dernier article qui clôt ce mini-dossier présente le module Paybox et conclut avec un comparatif synthétique des modules.</p>
<p><span id="more-43"></span><strong>Paybox</strong></p>
<p><a href="http://www1.paybox.com" target="_blank">Paybox</a> est édité par la société éponyme. Le module de paiement sécurisé est décliné en plusieurs moutures : version avec interface de paiement tierce, paiement envoyédepuis le site marchand, version pour mobile.</p>
<p>La plupart des grandes fonctionnalités sont présentes : modalités de paiements divers (en N fois, en différé,  abonnement&#8230;), support des grandes cartes bancaires, interface multi-lingue. Par analogie avec se concurrents, ses 2 grands atouts résident dans son indépendance bancaire totale, et dans le support du m-Commerce avec une interface pour téléphones mobiles.</p>
<p>L&#8217;intégration technique du module consiste comme SIPS dans l&#8217;utilisation d&#8217;un module exécutable. La différence est qu&#8217;ici il qui va être utilisé comme relai direct vers l&#8217;interface de paiement. En pratique, on déclare ce fichier (avec une extension .cgi) comme action du formulaire, en lui passant une série de paramètres indiqués dans la documentation : langue de l&#8217;interface, montant à payer, n° de la commande, url de retour. Il s&#8217;occupe ensuite de rediriger l&#8217;utilisateur vers le paiement sécurisé et de notifier le site marchand lorsque le paiement a été fait ou refusé.</p>
<p><strong>Les plus</strong></p>
<ul>
<li>Support complet des modalités de paiements</li>
<li>Indépendance vis-à-vis des banques</li>
<li>Support du m-Commerce</li>
</ul>
<p><strong>Les moins</strong></p>
<ul>
<li>Support limité des devises</li>
<li>API pour interaction avec le site un peu bancale</li>
</ul>
<p><strong>Conclusion </strong></p>
<p>Les 5 modules évoqués ont, malgré leurs similarité, des fonctionnalités spécifiques qui pourront pencher dans la balance, lors du choix technique à effectuer pour le paiement de votre site.</p>
<p>Afin d&#8217;avoir les idées claires, j&#8217;ai crée une grille comparative de ces modules, que vous trouverez ci-dessous.<br />
Je suis volontairement resté sur les fonctionnalités &#8220;usuelles&#8221; des modules, afin de ne pas trop déséquilibrer la comparaison : Paypal fait par exemple compétition à part si on ajoute les fonctionnalités d&#8217;accès multi-utilisateur, paiement multi-boutiques, calcul de taxes etc.; on peut également citer la dépendance particulière à une banque qui peut influer sur votre choix&#8230;</p>
<p><a title="Matrice de comparaison des paiements" href="http://www.codingstyle.fr/wp-content/uploads/2009/01/comparaison.png" rel="lightbox"><img class="aligncenter size-thumbnail wp-image-151" title="Matrice de comparaison des modules d epaiement" src="http://www.codingstyle.fr/wp-content/uploads/2009/01/comparaison2-150x150.png" alt="Matrice de comparaison des modules d epaiement" width="150" height="150" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/01/29/modules-de-paiement-securises-55/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Modules de paiement sécurisés (4/5)</title>
		<link>http://www.codingstyle.fr/2009/01/26/modules-de-paiement-securises-45/</link>
		<comments>http://www.codingstyle.fr/2009/01/26/modules-de-paiement-securises-45/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 06:00:36 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[carte bancaire]]></category>

		<category><![CDATA[e-commerce]]></category>

		<category><![CDATA[m-commerce]]></category>

		<category><![CDATA[paiement]]></category>

		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/2009/01/26/modules-de-paiement-securises-45/</guid>
		<description><![CDATA[Cet article présente un des modules de paiement les plus populaires : Paypal.
Paypal est une interface de paiement multi-boutiques, à la fois pour le marchand et - c&#8217;est un de ses points forts - pour l&#8217;acheteur. Ce dernier a en effet le possibilité de créer un compte qu&#8217;il peut créditer selon ses besoins.
Les fonctionnalités offertes [...]]]></description>
			<content:encoded><![CDATA[<p>Cet article présente un des modules de paiement les plus populaires : Paypal.</p>
<p><span id="more-41"></span><a href="http://www.paypal.com" target="_blank">Paypal </a>est une interface de paiement multi-boutiques, à la fois pour le marchand et - c&#8217;est un de ses points forts - pour l&#8217;acheteur. Ce dernier a en effet le possibilité de créer un compte qu&#8217;il peut créditer selon ses besoins.</p>
<p>Les fonctionnalités offertes vont bien au-delà de la simple interface de paiement car on trouve un bouton d&#8217;achat immédiat plaçable dans le site, ou encore une fonctionnalité de panier intégrée dans l&#8217;interface de Paypal. Le panier peut en revanche tout à fait être géré par vos soins comme sur un site classique.</p>
<p>L&#8217;interface de Paypal est très élaborée et peut prendre en charge une phase plus grande de la partie paiement. Le paramétrage des informations concerne :</p>
<ul>
<li>Informations financières</li>
<li>Remboursements</li>
<li>Personnalisation des pages de paiement</li>
<li>Notifications au site marchand</li>
<li>Taxes : calcul automatique de TVA, de frais d&#8217;expédition et de livraison</li>
<li>Devises autorisées, types de paiements autorisés</li>
<li>Langues</li>
<li>Accès multi-utilisateurs à la console de gestion</li>
</ul>
<p>Côté technique,  l&#8217;interfaçage réside dans l&#8217;utilisation de HTML et de variables cryptées à l&#8217;aide d&#8217;un certificat. Toutes les informations (URLs de retour, identifiant marchand&#8230;) y sont placées.<br />
Les informations sont transmises à une URL de retour pour que votre site marchand valide ou invalide définitivement la transaction, à l&#8217;instar des modules que j&#8217;avais déjà présenté précédemment.  Un environnement de test est disponible pour recetter proprement l&#8217;application.</p>
<p><strong>Les plus</strong></p>
<ul>
<li>Facile à intégrer</li>
<li>Indépendance technologique : on peut même l&#8217;utiliser sur un site HTML !</li>
<li>Multi-devises, multi-lingue&#8230; multi-tout !</li>
<li>La documentation fournie</li>
<li>Support des téléphones mobiles</li>
<li>Des plugins pour la plupart des grands frameworks et CMS (Magento, osCommerce, Symfony&#8230;)</li>
</ul>
<p><strong>Les moins </strong></p>
<ul>
<li>Les commissions sur les paiements</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2009/01/26/modules-de-paiement-securises-45/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sélecteurs CSS</title>
		<link>http://www.codingstyle.fr/2008/10/27/selecteurs-css/</link>
		<comments>http://www.codingstyle.fr/2008/10/27/selecteurs-css/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 21:16:28 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[HTML/CSS]]></category>

		<category><![CDATA[jquery]]></category>

		<category><![CDATA[mootools]]></category>

		<category><![CDATA[prototype]]></category>

		<category><![CDATA[sélecteur css]]></category>

		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/2008/10/27/selecteurs-css/</guid>
		<description><![CDATA[Une des fonctionnalités apparues avec le Javascript avancé et plus généralement d&#8217;AJAX concerne les sélecteurs CSS. Un outil magnifique : simple et efficace.

Petit historique
Simon Willison a eu en 2003 l&#8217;idée lumineuse d&#8217;utiliser la syntaxe des règles CSS pour récupérer des éléments du DOM. Il en résulte la première fonction nommée document.getElementsBySelector().
Les premiers sélecteurs arrivent fin [...]]]></description>
			<content:encoded><![CDATA[<p>Une des fonctionnalités apparues avec le Javascript avancé et plus généralement d&#8217;AJAX concerne les sélecteurs CSS. Un outil magnifique : simple et efficace.</p>
<p><span id="more-80"></span></p>
<p><strong>Petit historique</strong></p>
<p><a href="http://simonwillison.net/2003/Mar/25/getElementsBySelector/" target="_blank">Simon Willison a eu en 2003</a> l&#8217;idée lumineuse d&#8217;utiliser la syntaxe des règles CSS pour récupérer des éléments du DOM. Il en résulte la première fonction nommée document.getElementsBySelector().<br />
Les premiers sélecteurs arrivent fin 2005. On retient notamment CssQuery de Dean Edwards (auteur notamment de la mini-bibliothèque IE7 qui apportait un support CSS2 à IE6), et jSelect qui préfigure jQuery l&#8217;année suivante.<br />
La démocratisation s&#8217;achève en 2006 et 2007 avec l&#8217;arrivée des frameworks JS/AJAX majeurs du marché, embarquant chacun leur sélecteur CSS.</p>
<p>Le succès tient en quelques é&#8221;vidences : des manipulations du DOM très efficaces avec très peu de lignes de code, surtout lorsque la bibliothèque offre des fonctionnalités de chaînage (comme jQuery).</p>
<p><strong>En pratique</strong></p>
<p>Voici quelques exemples de codes agissant sur cette page :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript"><span style="color: #003366; font-weight: bold;">var</span> liens = $$<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'.list-blogroll li a'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// Liens du blog rollvar titre = $$('#headerimg h1 a'); // Lien du titre</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> liens = $$<span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">'.list-archives li a[&quot;title=mai 2008&quot;]'</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #009900; font-style: italic;">// Lien archive de mai 2008</span></pre></div></div>

<p>La performance de ces sélecteurs est saisissante. Elle tient à quelques astuces d&#8217;implémentation, en particulier l&#8217;utilisation de <a href="http://ejohn.org/blog/xpath-css-selectors/" target="_blank">XPath</a> qui permet d&#8217;obtenir des résultats extrêmement rapides.</p>
<p>Pour le comparer, un test de performance (Slickspeed) est disponible sur le site de Mootools : <a href="http://mootools.net/slickspeed/" target="_blank">http://mootools.net/slickspeed/</a> (à tester sur les différents navigateurs)</p>
<p><strong>Implémentation native dans les navigateurs </strong></p>
<p>Le W3C a très vite mis en chantier une <a href="http://www.w3.org/TR/selectors-api/" target="_blank">API</a>, réfléchissant dès le début 2006 à une implémentation native du sélecteur CSS dans les navigateurs.</p>
<p>Les résultats de ces travaux arrivent cette année dans les <em>A-grade browsers</em> :</p>
<ul>
<li>WebKit a sorti une implémentation en février 2008, Safari 3.1 devrait offrir le support</li>
<li>Mozilla a une implémentation native dans Firefox 3.1 alpha</li>
<li>Microsoft a d&#8217;ores et déjà une implémentation opérationnelle dans la Beta 1 d&#8217;Internet Explorer 8</li>
<li>Opera sortira sa version des sélecteurs natifs pour Opera 10.</li>
</ul>
<p>Les fonctions natives sont utilisables de la manière suivante</p>

<div class="wp_syntax"><div class="code"><pre class="javascript"><span style="color: #003366; font-weight: bold;">var</span> el = document.<span style="color: #006600;">querySelector</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">&quot;#headerimg&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #003366; font-weight: bold;">var</span> matches = document.<span style="color: #006600;">querySelectorAll</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">&quot;.list-blogroll, .list-archives&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2008/10/27/selecteurs-css/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Modules de paiement sécurisés (3/5)</title>
		<link>http://www.codingstyle.fr/2008/10/06/modules-de-paiement-securise-35/</link>
		<comments>http://www.codingstyle.fr/2008/10/06/modules-de-paiement-securise-35/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 21:23:00 +0000</pubDate>
		<dc:creator>Christophe Buguet</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[caisse d'épargne]]></category>

		<category><![CDATA[carte bancaire]]></category>

		<category><![CDATA[e-commerce]]></category>

		<category><![CDATA[idtronic]]></category>

		<category><![CDATA[m-commerce]]></category>

		<category><![CDATA[paiement]]></category>

		<category><![CDATA[spplus]]></category>

		<guid isPermaLink="false">http://www.codingstyle.fr/2008/10/06/modules-de-paiement-securise-35/</guid>
		<description><![CDATA[Suite du tour d&#8217;horizon des paiements électroniques avec le 3ème module français : SPPlus. 
SPPlus est commercialisé par la Caisse d&#8217;Epargne. Hormis le cas particulier d&#8217;avoir un compte entreprise dans cette banque, il y a normalement peu de chances que vous soyez concerné par ce module.
Cependant, vous pourriez y trouver un bon intérêt car ce [...]]]></description>
			<content:encoded><![CDATA[<p>Suite du tour d&#8217;horizon des paiements électroniques avec le 3ème module français : SPPlus. <span id="more-79"></span><a href="https://www.spplus.net/" target="_blank"></a></p>
<p><a href="https://www.spplus.net/" target="_blank">SPPlus</a> est commercialisé par la Caisse d&#8217;Epargne. Hormis le cas particulier d&#8217;avoir un compte entreprise dans cette banque, il y a normalement peu de chances que vous soyez concerné par ce module.</p>
<p>Cependant, vous pourriez y trouver un bon intérêt car ce système de paiement offre des fonctionnalités assez intéressantes :</p>
<ul>
<li>support des grandes cartes du marché français (CB, Visa, Mastercard, Amex, Diner&#8217;s Card)</li>
<li>support de quelques cartes de crédit à la consommation (Cofinoga, Aurore)</li>
<li>paiement par chèque</li>
<li>système de paiement multiple très poussé : paiement en N fois, abonnement, acomptes&#8230;</li>
</ul>
<p>Le principe, à l&#8217;instar des deux modules évoqués précédemment, repose sur :</p>
<ul>
<li>une requête envoyée au serveur bancaire avec une clé de hachage (sceau),</li>
<li>une communication après paiement directement entre le serveur bancaire et le site Internet</li>
<li>une redirection de l&#8217;utilisateur vers une URL du site une fois le paiement effectué et la validation banque/site Internet terminée</li>
</ul>
<p>Sur la partie technique, les informations du marchand (une clé et un code SIRET) servent d&#8217;informations pour les hachages envoyés au serveur et au retour pour le décryptage.</p>
<p>SPPlus est livré avec un kit PHP comportant une extension à installer. Après un rapide coup d&#8217;oeil sur le module en détails, on se rend compte qu&#8217;il se réduit à faire des hachages dans des fonctions natives, plutôt qu&#8217;en pur PHP (comme avec P@iement CIC par exemple). Attention donc si vous devez l&#8217;utiliser en environnement mutualisé, vous risquez d&#8217;avoir besoin de charger le module à la volée (si les permissions le permettent).<br />
A noter : le kit existe également pour Java et C notamment. Ce qui donne une bonne indication sur la possibilité d&#8217;intégration pour des appareils mobiles.</p>
<p>Deux petits &#8220;plus&#8221; par rapport aux concurrents : la liste des IP des serveurs bancaires est connue et le script d&#8217;exemple fourni effectue un test sur $_SERVER['REMOTE_ADDR'] sur ces IP. Le test a une fiabilité relative, les variables $_SERVER étant toujours potentiellement piratables, il peut être judicieux de rajouter une petite sécurité supplémentaires en mettant une restriction à ces adresses dans un vrai pare-feu.</p>
<p>D&#8217;autre part, le site fournit des URLs pour effectuer quelques actions de paiement, ou traitement de paiement à distance, ce qui peut faciliter l&#8217;intégration dans une admin. Sur cette seconde fonctionnalité je suis extrêmement perplexe, car le script d&#8217;exemple laisse la clé directement dans le fichier PHP. Un pirate qui récupère le fichier à la main pour créer des paiements à sa guise&#8230; gloups. Assurez-vous dans tous les cas de mettre la clé en lieu sûr sur le serveur (non accessible par le web de préférence).</p>
<p><strong>Les plus</strong></p>
<ul>
<li>Paiement rapide à intégrer</li>
<li>Documentation clean et efficace</li>
<li>Les fonctionnalités de paiement en N fois / par abonnement</li>
<li>La liste des IP des serveurs bancaires</li>
<li>L&#8217;administration distante, pratique pour l&#8217;intégration du backoffice de paiement dans le site.</li>
</ul>
<p><strong>Les moins</strong></p>
<ul>
<li>Le module PHP avec des fonctions de hachage dedans&#8230; est-ce vraiment nécessaire ?</li>
<li>Clés marchand à sortir des scripts et à mettre dans un endroit plus sûr</li>
<li>Réservé aux écureuils <img src='http://www.codingstyle.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codingstyle.fr/2008/10/06/modules-de-paiement-securise-35/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

