<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>tail -f /dev/dim</title>
    <link>http://tapoueh.org/index.html</link>
    <description>Dimitri Fontaine's blog</description>
    <language>en-us</language>
    <generator>Emacs Muse</generator>
<item>
  <title>The Need For Speed</title>
  <link>http://tapoueh.org/blog/2013/03/29-the-need-for-speed.html</link>
  <description><![CDATA[<p>Hier se tenait la <a href="http://www.postgresql-sessions.org/en/5/start">cinquième édition</a> de la conférence organisée par <em>dalibo</em>,
où des intervenants extérieurs sont régulièrement invités. Le thème hier
était à la fois clair et très vaste : la performance.</p>

<p>J'ai eu le plaisir de réaliser une présentation intitulée « The Need for
Speed » dans laquelle on replace l'effort d'optimisation dans son contexte
métier, afin de faire une étude des coûts et bénéfices et de savoir non
seulement à quoi s'attendre mais aussi quand s'arrêter.</p>

<center>
<p><a class="image-link" href="../../../images/confs/the_need_for_speed.pdf">
<img src="../../../images/confs/the_need_for_speed-3.png"></a></p>
</center>

<p>Merci à <em>dalibo</em> pour cette conférence !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Fri, 29 Mar 2013 09:49:00 +0100</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2013/03/29-the-need-for-speed.html</guid>
</item>
<item>
  <title>Extensions en simple SQL</title>
  <link>http://tapoueh.org/blog/2011/10/31-extensions-sql.html</link>
  <description><![CDATA[<p>La <a href="http://2011.pgconf.eu/">conférence européenne à Amsterdam</a> était un très bon évènement de la
communauté, avec une organisation impeccable dans un hôtel accueillant. J'ai
eu le plaisir d'y parler des extensions et de leur usage dans le cadre du
développement applicatif « interne », sous le titre
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/138-extensions-are-good-for-business-logic/">Extensions are good for business logic</a>.</p>


<center>
<p><a class="image-link" href="http://wiki.postgresql.org/images/f/f1/Using-extensions.pdf">
<img src="../../../images/using-extensions-10.png"></a></p>
</center>

<p>L'idée de ma présentation, que la plupart d'entre vous a loupé je suppose
(en tout cas je n'avais qu'une petite poignée de français dans la salle, et
j'espère avoir des lecteurs qui n'étaient pas à Amsterdam), l'idée est
d'utiliser les mécanismes offerts par les extensions afin de maintenir le
code <code>PL</code> que vous utilisez en production.</p>

<p>Il s'agit la plupart du temps de procédures qui implémentent une partie de
la logique métier de vos applications, mais si proche des données que cela
termine en base directement : c'est une bonne chose, en particulier depuis
<em>PostgreSQL 9.1</em>. Cette version propose en effet une gestion assez complète
des extensions.</p>

<p>Il s'agit de réaliser un <em>empaquetage</em> de vos procédures en suivant la
documentation en ligne et son chapitre
<a href="http://docs.postgresqlfr.org/9.1/extend-extensions.html">35.15. Empaqueter des objets dans une extension</a>. Une fois cela fait, il est
alors possible de déployer votre ensemble de procédure stockée avec la
commande <code>CREATE EXTENSION mesprocs;</code>, et ensuite la commande <code>psql</code> <code>\dx</code> vous
permet de lister les extensions installées et leur numéro de version.</p>

<p>Les mises à jours sont également gérées avec une commande SQL dédiée, il
s'agit alors de <code>ALTER EXTENSION mesprocs UPDATE [TO version];</code>. Il suffit de
fournir des scripts intermédiaires nommés par exemple <code>mesprocs--1.0--1.1.sql</code>
et <code>mesprocs--1.1--1.2.sql</code> et PostgreSQL saura comment passer de <code>1.0</code> à <code>1.1</code>.</p>

<p>Voilà, vous savez presque tout de ma présentation à Amsterdam et vous pouvez
retrouver le reste sur le support proposé en début d'article. Bien sûr je
n'ai pas reproduit ici les questions intéressantes qui m'ont été posées, une
bonne partie d'entre elles sont venues enrichir ma liste de Noël pour les
extensions. Si vous voulez être sûr de trouver cela sous votre sapin,
cependant, le meilleur moyen est encore de m'en parler : sponsoriser les
développement Open Source est une belle démarche :)</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Mon, 31 Oct 2011 14:22:00 +0100</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/10/31-extensions-sql.html</guid>
</item>
<item>
  <title>Extensions, applications</title>
  <link>http://tapoueh.org/blog/2011/10/10-extensions-applicatives.html</link>
  <description><![CDATA[<p>La <a href="http://2011.pgconf.eu/">conférence PostgreSQL annuelle en Europe</a> a lieu la semaine prochaine à
Amsterdam, et j'espère que vous avez déjà vos billets, car cette édition
s'annonce comme un très bon millésime !</p>

<p>Je présenterai donc comment utiliser les extensions, le titre en anglais est
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/138-extensions-are-good-for-business-logic/">Extensions are good for business logic</a>, et l'idée est de voir comment
exploiter les extensions afin de mieux gérer vos mises à jours en bases de
données.</p>

<p>Le cycle de vie des bases de données en production inclue souvent
l'utilisation d'une base de développement où le schéma évolue au rythme des
besoins des développeurs, et de temps en temps on consolide une partie de
ces modifications (dans des <em>rollouts</em>, scripts contenant principalement des
<code>DDL</code>) afin de les déployer en production — si possible avec une étape
intermédiaire en préproduction, tout de même.</p>

<p>Savoir ce qui est déployé en développement et comment en retirer le script à
jouer en production peut être parfois fastidieu.  Quand ce n'est pas le cas,
c'est que le travail a été fait en amont, ce qui est le signe d'une bonne
organisation, avec les surcoûts que l'on peut imaginer.</p>

<p>Les <a href="http://www.postgresql.org/docs/9.1/static/extend-extensions.html">extensions</a> telles que présentes dans PostgreSQL 9.1 vous permettent de
mieux gérer ce genre de cas, en optimisant le surcoût : il ne disparaît pas,
mais devient opérationnel plutôt que de rester une charge d'organisation.</p>

<p>Allez, je vous laisse maintenant, je dois me préparer pour la conférence :)</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Mon, 10 Oct 2011 10:35:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/10/10-extensions-applicatives.html</guid>
</item>
<item>
  <title>PostgreSQL à Amsterdam</title>
  <link>http://tapoueh.org/blog/2011/09/27-pgconf-eu.html</link>
  <description><![CDATA[<p>Dans moins d'un mois se tient la conférence européenne PostgreSQL,
<a href="http://2011.pgconf.eu/">pgconf.eu</a>.  Il s'agit de quatre jours consacrés à votre SGBD préféré, où
vous pourrez rencontrer la communauté européenne, consituée d'utilisateurs,
d'entreprises de toutes tailles, de développeurs, de participants en tout
genre.</p>

<p>C'est l'endroit où aller pour apprendre comment le projet fonctionne,
comprendre les impacts des nouvelles versions sur votre architecture, avoir
une discussion technique pointue sur cette fonctionalité que vous voudriez
voir arriver dans la prochaine version, ou simplement vous rendre compte de
l'énergie formidable qui est insuflée dans ce projet !</p>

<p>Évidemment <a href="http://2ndquadrant.fr/">2ndQuadrant</a> sera de la partie, nous présenterons plusieurs de nos
<a href="http://www.2ndquadrant.com/fr/les-fonctionnalites-de-postgresql-91/">contributions PostgreSQL 9.1</a>.  Cela commencera avec la formation d'une
journée complète de <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/81-greg-smith/">Greg</a>, <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/162-performance-from-start-to-crash/">Performance From Start to Crash</a> : si vous voulez
apprendre comment aborder les performances d'un serveur PostgreSQL par le
<em>leader</em> international du domaine, auteur du livre
<a href="http://www.amazon.fr/Bases-donn%C3%A9es-PostgreSQL-Gregory-Smith/dp/274402483X/ref=sr_1_1?ie=UTF8&amp;qid=1316183931&amp;sr=8-1">Bases de données PostgreSQL 9.0</a>, réservez vite votre place !</p>

<p>Les présentation au format classique commencent le lendemain, et en trois
jours la liste des présentation de notre <a href="http://www.2ndquadrant.com/fr/profil-de-lequipe/">équipe 2ndQuadrant</a> est assez
copieuse.  Voyons cela.</p>

<p>Nous commençons avec <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/144-migration-to-postgresql-a-holistic-view/">Migration to PostgreSQL - a holistic view</a> par
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/78-harald-armin-massa/">Harald Armin Massa</a>, qui propose un point de vue intéressant sur les raisons
qui retiennent certaines migrations.  Ensuite <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/34-gianni-ciolli/">Gianni Ciolli</a> présentera
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/159-look-out-the-window-functions-and-free-your-sql/">Look Out The Window Functions (and free your SQL)</a> ou comment résoudre
simplement des problèmes complexes lorsque l'on dispose d'outils avancés.</p>

<p>Une autre présentation à ne pas rater,
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/156-synchronous-replication-and-durability-tuning/">Synchronous Replication and Durability Tuning</a> détaille comment profiter au
mieux de PostgreSQL 9.1 afin d'obtenir les garanties de durabilité des
données souhaitées dans votre application.  Et cette présentation est animée
par <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/81-greg-smith/">Greg Smith</a> et <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/17-simon-riggs/">Simon Riggs</a>.  Ce dernier a développé la <em>réplication
synchrone</em>, et <em>Hot Standby</em> avant cela.  Vous ne trouverez personne au monde
mieux placé pour faire cette présentation !</p>

<p>Les deux prochaines présentation de nos <a href="http://expert-postgresql.fr/">experts PostgreSQL</a>, en continuant
notre lecture du <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/">programme de pgconf.eu</a> dans l'ordre, ont lieu au même
moment.  Le choix ne sera pas facile entre <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/158-improving-vacuum-suction/">Improving VACUUM Suction</a> par Greg
à nouveau, et une comparaison de <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/183-londiste-3-et-slony-21/">londiste 3 et slony 2.1</a> par
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/57-cedric-villemain/">Cédric Villemain</a>, en français.</p>

<p>À suivre, <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/138-extensions-are-good-for-business-logic/">Extensions are good for business logic</a> que je vous présenterai
moi-même, vous pouvez voir ma présentation sur la fiche qui porte mon nom :
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/14-dimitri-fontaine/">Dimitri Fontaine</a>.  Il s'agit d'une présentation en anglais qui détaille
comment utiliser les extensions dans le cadre de la maintenance de la partie
<em>procédures stockées</em> d'une application.</p>

<p>Et pour finir le deuxième jour des conférences 2ndQuadrant, vous pourrez
apprendre avec Gianni comment
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/160-debugging-complex-sql-queries-with-writable-ctes/">Debugging complex SQL queries with writable CTEs</a>, une fonctionnalité
contribuée au projet par un autre consultant <a href="http://www.2ndquadrant.com/fr/contact/">2ndQuadrant</a>, Marko Tiikkaja.</p>

<p>Et il reste encore une journée !  Nous ne mentons pas en disant que le
programme est complet !  Le dernier jour de la conférence n'est pas le moins
intéressant, j'espère que vous aurez su garder un peu d'énergie pour suivre…</p>

<p><a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/speaker/17-simon-riggs/">Simon Riggs</a> qui présentera sa vision de la <a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/199-postgresql-roadmap/">PostgreSQL Roadmap</a> pour les
prochaines années.  Ce n'est bien sûr que sa vision personnelle, mais
lorsque l'on fait le bilan de ces 7 dernières années de
<a href="http://www.2ndquadrant.com/fr/histoire-postgresql/">contributions à PostgreSQL</a>, on voit à quel point son opinion personnelle
peut avoir du poids dans le développement du projet.</p>

<p>À suivre, la présentation de Greg sur son sujet de prédilection :
<a href="http://www.postgresql.eu/events/schedule/pgconfeu2011/session/157-bottom-up-database-benchmarking/">Bottom-up Database Benchmarking</a>.  Tout ce que vous avez toujours voulu
savoir sur les mesures de performances de vos bases de données, sans jamais
oser le demander.  Quelque chose dans ce style en tout cas :)</p>

<p>Bien sûr d'autres présentations sont disponibles et retiendront votre
attention, ce billet vous présente seulement celles qui seront données par
les <a href="http://expert-postgresql.fr/">experts PostgreSQL</a> de <a href="http://www.2ndquadrant.com/fr/expertise-postgresql/">2ndQuadrant</a>.  En vous souhaitant bonne conférence
à tous, j'espère avoir le plaisir de vous retrouver à Amsterdam le mois
prochain !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Tue, 27 Sep 2011 11:10:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/09/27-pgconf-eu.html</guid>
</item>
<item>
  <title>PostgreSQL 9.1</title>
  <link>http://tapoueh.org/blog/2011/09/19-sortie-de-9.1.html</link>
  <description><![CDATA[<p><a href="http://www.postgresql.org/about/news.1349">PostgreSQL 9.1</a> est dans les bacs ! Vous n'avez pas encore cette nouvelle
version en production ?  Pas encore évalué pourquoi vous devriez envisager
de migrer à cette version ?  Il existe beaucoup de bonnes raisons de passer
à cette version, et peu de pièges.</p>

<p>Nous commençons à lire des articles qui reprennent la nouvelle dans la
presse française, et j'ai le plaisir de mentionner celui de <a href="http://www.programmez.com/actualites.php?titre_actu=Sortie-de-PostgreSQL-91-&#33;&amp;id_actu=10190">programmez.com</a>
qui annonce « un système d'extensions inégalé ».  En tant que développeur
des <a href="http://www.postgresql.org/docs/9.1/static/extend-extensions.html">Extensions</a> dans PostgreSQL, je ne peux qu'être non seulement d'accord
avec eux, mais aussi flatté :)</p>

<p>Bons tests à tous, et bonne mises à jour pour les plus chanceux !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Wed, 14 Sep 2011 10:00:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/09/19-sortie-de-9.1.html</guid>
</item>
<item>
  <title>Éviter les injections SQL</title>
  <link>http://tapoueh.org/blog/2011/09/07-eviter-les-injections-sql.html</link>
  <description><![CDATA[<p>Nous avons parlé la dernière fois les règles d'<a href="http://tapoueh.org/blog/2011/08/18-echappements-de-chaine.html">échappement de chaînes</a> avec
PostgreSQL, et mentionné qu'utiliser ces techniques afin de protéger les
données insérées dans les requêtes SQL n'était pas une bonne idée dans la
mesure où PostgreSQL offre une fonctionnalité bien plus adaptée.</p>

<p>Nous faisons face ici à un problème de sécurité très bien décrit dans le
billet humoristique de <a href="http://xkcd.com/327/">Little Boby Tables</a>, dont je vous recommande la
lecture. L'idée est simple, la mise en place de contre mesure fourmille de
pièges subtils, à moins d'utiliser la solution décrite ci-après.</p>

<center>
<p><img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" alt=""></p>
</center>

<p>Lorsque l'on envoie une requête SQL à PostgreSQL, celle-ci contient
pêle-mêle un mélange de mots-clés SQL et de données utilisateurs. Dans la
requête <code>SELECT colname FROM table WHERE pk = 1234;</code>
l'élément <code>1234</code> est une donnée fournie à PostgreSQL. Lorsque l'on utilise
d'autre types de données, on va parler de <em>litéral</em>, qui peut être ou non
<em>décoré</em>.  Un exemple ?</p>

<pre class="src">
=# SELECT <span style="color: #ad7fa8; font-style: italic;">'undecorated literal'</span>, pg_typeof(<span style="color: #ad7fa8; font-style: italic;">'undecoreted literal'</span>),
          date <span style="color: #ad7fa8; font-style: italic;">'today'</span>, pg_typeof(date <span style="color: #ad7fa8; font-style: italic;">'today'</span>);
      ?column?       | pg_typeof |    date    | pg_typeof
<span style="color: #888a85;">---------------------+-----------+------------+-----------
</span> undecorated literal | unknown   | 2011-09-07 | date
(1 row)
</pre>

<p>Outre l'aspect types de données (un litéral non décoré est de type <em>unknown</em>
jusqu'à ce qu'une opération force son type, c'est ce qui permet d'avoir du
polymorphisme dans PostgreSQL), nous voyons ici que PostgreSQL doit faire la
différence entre le SQL lui-même et les paramètres qui le composent. Il sait
bien sûr faire cela, il suffit d'encadrer les valeurs dans des simples
guillemets ou bien d'utiliser la notation dite de <a href="http://docs.postgresqlfr.org/9.0/sql-syntax.html#sql-syntax-dollar-quoting">dollar quoting</a>. Mais si
l'on ne prend pas de précautions, l'utilisateur peut terminer la séquence
d'échappements depuis le champ de saisie du formulaire…</p>

<p><a href="http://docs.postgresql.fr/9.1/libpq.html">libpq</a> est la librairie standard cliente de PostgreSQL et fourni des <em>API</em> de
connexion et propose une fonction <a href="http://docs.postgresql.fr/9.1/libpq-exec.html#libpq-pqexecparams">PGexecParams</a>. Cette fonction expose un
mécanisme disponible dans le protocole de communication de PostgreSQL
lui-même : il est possible de faire parvenir le SQL et les données qu'il
contient dans deux parties différentes du messages plutôt que de les
mélanger. Ainsi, le serveur n'a plus du tout à deviner où commencent et où
terminent les données dans la requête, il lui suffit de regarder dans le
tableau séparé contenant les données quand il en a besoin.</p>

<p>Terminées les injections SQL !</p>

<p>Note : cette fonction est exposée dans la plupart des pilotes de connexion,
et même en PHP, dont la popularité et l'exposition me poussent à donner une
référence plus précise : utilisez <a href="http://fr2.php.net/manual/en/function.pg-query-params.php">pg_query_params</a>, son intérêt n'est pas
simplement syntaxique, il va jusque dans la définition des échanges de
données entre le client (votre code PHP) et le serveur (PostgreSQL).</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Wed, 07 Sep 2011 11:36:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/09/07-eviter-les-injections-sql.html</guid>
</item>
<item>
  <title>Échappement de chaînes</title>
  <link>http://tapoueh.org/blog/2011/08/18-echappements-de-chaine.html</link>
  <description><![CDATA[<p>Parmis les nouveautés de la <a href="http://www.postgresql.org/about/news.1331">prochaine version</a> de <a href="http://www.postgresql.org/">PostgreSQL</a>, la fameuse <code>9.1</code>,
il faut signaler le changement de valeur par défaut de la variable
<code>standard_conforming_strings</code>, qui passe à <em>vraie</em>.</p>

<p>En effet, l'utilisation d'échappements avec le caractère « anti-slash »
n'est pas conforme au standard SQL.  Le paramètre
<code>standard_conforming_strings</code> permet de contrôler le comportement de
PostgreSQL lorsqu'il lit une chaîne de caractère dans une requête SQL.</p>

<p>Voyons quelques exemples :</p>

<pre class="src">
dimitri=# set standard_conforming_strings to true;
SET
dimitri=# select 'hop''';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# select 'hop\'';
dimitri'# ';
 ?column?
----------
 hop\';

(1 ligne)

dimitri=# select E'hop\'';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# set standard_conforming_strings to false;
SET
dimitri=# select E'hop\'';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# select 'hop\'';
ATTENTION:  utilisation non standard de \' dans une cha&#238;ne litt&#233;rale
LIGNE 1 : select 'hop\'';
                 ^
ASTUCE : Utilisez '' pour &#233;crire des guillemets dans une cha&#238;ne ou utilisez
la syntaxe de cha&#238;ne d'&#233;chappement (E'...').
 ?column?
----------
 hop'
(1 ligne)
</pre>

<p>Il existe un moyen de forcer PostgreSQL à accepter l'utilisation
d'échappements avec « anti-slash » indépendamment de la valeur de
<code>standard_conforming_strings</code>, c'est la notation préfixée avec <code>E</code>.  Il est
recommandé de toujours l'utiliser dès lors que la chaîne de caractère
contient des « anti-slash » utilisés comme échappement (du caractère simple
guillemet en général).</p>

<p>Le paramètre <code>escape_string_warning</code>, enfin, permet de désactiver les
avertissements tels que présentés dans le dernier exemple ci-dessus,
lorsqu'il est positionné à <code>off</code>.  Bien sûr, sa valeur par défaut est <code>on</code>.</p>

<p>Toute apparition de ce <em>WARNING</em> lorsque <code>escape_string_warning</code> est <code>on</code> signifie
que votre application n'est pas prête à migrer à <code>9.1</code> avec son paramétrage
par défaut.  Il existe deux actions possible : changer le paramétrage de sa
nouvelle valeur par défaut à sa précédente, ou bien corriger ses
applications pour utiliser le préfixe <code>E</code> dès que cela est nécessaire.</p>

<p>L'utilisation de <code>standard_conforming_strings</code> à <code>on</code> présente un autre avantage
au respect du standard SQL : la sécurité contre les injections.  S'il n'est
pas possible d'échapper le guillemet simple qui termine toute chaîne de
caractère utilisateur, il devient compliqué de jouer au plus malin avec le
<em>parser</em>.  Le mieux ici reste bien sûr d'utiliser les requêtes paramétrées, à
suivre dans un prochain article.</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Thu, 18 Aug 2011 19:01:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/18-echappements-de-chaine.html</guid>
</item>
<item>
  <title>Échappement de chaînes</title>
  <link>http://tapoueh.org/blog/2011/08/18-echappements-de-chaine.html</link>
  <description><![CDATA[<p>Parmis les nouveautés de la <a href="http://www.postgresql.org/about/news.1331">prochaine version</a> de <a href="http://www.postgresql.org/">PostgreSQL</a>, la fameuse <code>9.1</code>,
il faut signaler le changement de valeur par défaut de la variable
<code>standard_conforming_strings</code>, qui passe à <em>vraie</em>.</p>

<p>En effet, l'utilisation d'échappements avec le caractère « anti-slash »
n'est pas conforme au standard SQL.  Le paramètre
<code>standard_conforming_strings</code> permet de contrôler le comportement de
PostgreSQL lorsqu'il lit une chaîne de caractère dans une requête SQL.</p>

<p>Voyons quelques exemples :</p>

<pre class="src">
dimitri=# set standard_conforming_strings to true;
SET
dimitri=# select 'hop''';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# select 'hop\'';
dimitri'# ';
 ?column?
----------
 hop\';

(1 ligne)

dimitri=# select E'hop\'';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# set standard_conforming_strings to false;
SET
dimitri=# select E'hop\'';
 ?column?
----------
 hop'
(1 ligne)

dimitri=# select 'hop\'';
ATTENTION:  utilisation non standard de \' dans une cha&#238;ne litt&#233;rale
LIGNE 1 : select 'hop\'';
                 ^
ASTUCE : Utilisez '' pour &#233;crire des guillemets dans une cha&#238;ne ou utilisez
la syntaxe de cha&#238;ne d'&#233;chappement (E'...').
 ?column?
----------
 hop'
(1 ligne)
</pre>

<p>Il existe un moyen de forcer PostgreSQL à accepter l'utilisation
d'échappements avec « anti-slash » indépendamment de la valeur de
<code>standard_conforming_strings</code>, c'est la notation préfixée avec <code>E</code>.  Il est
recommandé de toujours l'utiliser dès lors que la chaîne de caractère
contient des « anti-slash » utilisés comme échappement (du caractère simple
guillemet en général).</p>

<p>Le paramètre <code>escape_string_warning</code>, enfin, permet de désactiver les
avertissements tels que présentés dans le dernier exemple ci-dessus,
lorsqu'il est positionné à <code>off</code>.  Bien sûr, sa valeur par défaut est <code>on</code>.</p>

<p>Toute apparition de ce <em>WARNING</em> lorsque <code>escape_string_warning</code> est <code>on</code> signifie
que votre application n'est pas prête à migrer à <code>9.1</code> avec son paramétrage
par défaut.  Il existe deux actions possible : changer le paramétrage de sa
nouvelle valeur par défaut à sa précédente, ou bien corriger ses
applications pour utiliser le préfixe <code>E</code> dès que cela est nécessaire.</p>

<p>L'utilisation de <code>standard_conforming_strings</code> à <code>on</code> présente un autre avantage
au respect du standard SQL : la sécurité contre les injections.  S'il n'est
pas possible d'échapper le guillemet simple qui termine toute chaîne de
caractère utilisateur, il devient compliqué de jouer au plus malin avec le
<em>parser</em>.  Le mieux ici reste bien sûr d'utiliser les requêtes paramétrées, à
suivre dans un prochain article.</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Thu, 18 Aug 2011 19:01:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/18-echappements-de-chaine.html</guid>
</item>
<item>
  <title>Tutoriel pgloader</title>
  <link>http://tapoueh.org/blog/2011/08/15-tutoriel-pgloader.html</link>
  <description><![CDATA[<p>En reprenant le contenu des articles de la série sur <a href="http://tapoueh.org/pgsql/pgloader.html">pgloader</a>, j'ai pris le
temps de compiler un tutoriel complet, en anglais.  Si j'en crois les
quelques mails que je reçois régulièrement au sujet de <code>pgloader</code> depuis
quelques années maintenant, cela devrait aider les nouveaux utilisateurs.</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Mon, 15 Aug 2011 15:39:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/15-tutoriel-pgloader.html</guid>
</item>
<item>
  <title>Champs statiques &amp; pgloader</title>
  <link>http://tapoueh.org/blog/2011/08/12-pgloader-constantes.html</link>
  <description><![CDATA[<p>Dans la série de nos articles sur <a href="http://tapoueh.org/tags/pgloader.html">pgloader</a>, l'article du jour décrit
<a href="http://tapoueh.org/blog/2011/08/12-pgloader-udc.html">comment insérer des valeurs constantes</a> (absentes du fichier de données)
pendant le chargement.  Cela permet par exemple d'ajouter un champ
« origine », qui dépend typiquement de la chaîne de production des données
et se retrouve souvent dans le nom du fichier de données lui-même.</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Fri, 12 Aug 2011 11:01:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/12-pgloader-constantes.html</guid>
</item>
<item>
  <title>Reformater avec pgloader</title>
  <link>http://tapoueh.org/blog/2011/08/05-reformater-avec-pgloader.html</link>
  <description><![CDATA[<p>Dans la série de nos articles sur <a href="http://tapoueh.org/tags/pgloader.html">pgloader</a>, le dernier venu détaille comment
utiliser la fonction de <em>reformatage</em> de cet outil.  Dans le cadre
d'utilisation d'un <a href="http://fr.wikipedia.org/wiki/Extract_Transform_Load">ETL</a>, cela est assimilé à la phase <em>Transform</em>, ce qui fait
de <code>pgloader</code> une solution <em>simple</em> pour vos besoins d'ETL.</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Fri, 05 Aug 2011 11:26:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/05-reformater-avec-pgloader.html</guid>
</item>
<item>
  <title>pgloader en parallèle</title>
  <link>http://tapoueh.org/blog/2011/08/01-pgloader-en-parallele.html</link>
  <description><![CDATA[<p>Dans la série des articles sur <a href="../../../pgsql/pgloader.html">pgloader</a>, nous détaillons cette fois la
configuration du paraléllisme de chargement des données.  Une fois de plus,
je vous réfère à l'article de référence en anglais : <a href="http://tapoueh.org/blog/2011/08/01-parallel-pgloader.html">Parallel pgloader</a>.</p>

<p>L'ensemble des articles de cette série permettra de constituer un tutoriel
pgloader plus étoffé que l'actuel.  Si vous êtes intéressés par une version
française, un mail de votre part justifierait l'effort que cela représente !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Mon, 01 Aug 2011 12:15:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/08/01-pgloader-en-parallele.html</guid>
</item>
<item>
  <title>Configurer pgloader</title>
  <link>http://tapoueh.org/blog/2011/07/29-configurer-pgloader.html</link>
  <description><![CDATA[<p>Je viens de publier un billet en anglais intitulé <a href="http://tapoueh.org/blog/2011/07/29-how-to-setup-pgloader.html">How to Setup pgloader</a>, qui
complète l'écriture en cours d'un <a href="http://tapoueh.org/pgsql/pgloader.html">tutoriel pgloader</a> plus complet.  Une fois
de plus, je n'ai pas pris le temps de traduire cet article en français avant
de savoir si cela vous intéresse, ô lecteurs.  Si c'est le cas il suffit de
me l'indiquer par mail (ou <em>courriel</em>, après tout) pour que j'ajoute cela dans
ma <code>TODO</code> liste.</p>

<p>Bonne lecture !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Fri, 29 Jul 2011 15:00:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/07/29-configurer-pgloader.html</guid>
</item>
<item>
  <title>Comment Utiliser pgloader</title>
  <link>http://tapoueh.org/blog/2011/07/22-comment-utiliser-pgloader.html</link>
  <description><![CDATA[<p>C'est une question qui revient régulièrement, et à laquelle je pensais avoir
apporté une réponse satisfaisante avec <a href="https://github.com/dimitri/pgloader/tree/master/examples">les exemples pgloader</a>. Ce document
ressemble un peu à un <em>tutoriel</em>, en anglais, et je l'ai détaillé dans
l'article <a href="22-how-to-use-pgloader.html">how to use pgloader</a> sur ce même site, en anglais. Si la demande
est suffisante, je le traduirai en français.</p>

<p>En attendant, bonne lecture !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Fri, 22 Jul 2011 13:48:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/07/22-comment-utiliser-pgloader.html</guid>
</item>
<item>
  <title>Skytools3 : les slides</title>
  <link>http://tapoueh.org/blog/2011/07/19-skytools3-slides.html</link>
  <description><![CDATA[<p>La conférence <a href="http://char11.org/">CHAR(11)</a> étant maintenant terminée, il est d'usage de publier
les <em>slides</em> utilisés.  J'ai présenté <a href="http://wiki.postgresql.org/wiki/SkyTools">Skytools</a> <code>3.0</code> dont la prochaine version
sera publiée dès que j'aurais eu le temps de terminer de revoir (en fait
principalement d'écrire) la documentation.</p>

<center>
<p><a class="image-link" href="../../../images/skytools3.pdf">
<img src="../../../images/skytools3-0.png"></a></p>
</center>

<p>Les <em>slides</em> de l'ensemble des présentations devraient être publiés en ligne à
terme, mais cela ne va pas pouvoir être fait aussi rapidement que nous le
voudrions tous.  Alors voici un peu de lecture en attendant la suite !</p>
]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Tue, 19 Jul 2011 14:39:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/07/19-skytools3-slides.html</guid>
</item>
<item>
  <title>De retour de CHAR(11)</title>
  <link>http://tapoueh.org/blog/2011/07/13-de-retour-de-char11.html</link>
  <description><![CDATA[h1>De retour de CHAR(11)</h1>
<div id="breadcrumb"><a href=../../../index.html>/dev/dim</a> / <a href=../../../blog/index.html>blog</a> / <a href=../../../blog/2011/index.html>2011</a> / <a href=../../../blog/2011/07/index.html>07</a> / </div>
<div class="date">Wednesday, July 13 2011, 17:30</div>
</div>
<div id="article">
<p>Quelle meilleure occupation dans le train du retour de <a href="http://char11.org/schedule">CHAR(11)</a> que de se
faire reporteur pour l'occasion ?  En réalité, dormir serait une idée tant
les soirées se sont prolongées !</p>

<p>Nous avons eu le plaisir d'écouter <strong><em>Jan Wieck</em></strong> présenter un historique
simplifié de la réplication avec <a href="http://www.postgresql.org/">PostgreSQL</a>.  Étant lui-même l'un des
pionniers du domaine, son point de vue est des plus intéressants.  Il a
parlé de l'évolution des solutions de réplication, et je ne peux m'empêcher
de penser que par bien des côtés <a href="http://wiki.postgresql.org/wiki/SKytools">Skytools</a> est une évolution de <a href="http://slony.info/">Slony</a> — Jan,
auteur de Slony, semblait d'accord avec cela.</p>

<p>En effet Skytools est né de limitations de Slony.  Certaines d'entre elles
existent toujours, comme l'absence de séparation entre la couche de <strong><em>queuing</em></strong>
et la couche de réplication elle-même, et certaines ont été résolues depuis,
comme les difficultés à subir de fortes charges en écriture.  Et puis les
deux solutions partagent même une partie de leur implémentation, depuis
PostgreSQL 8.3, avec les types de données <code>txid</code> et <a href="http://www.postgresql.org/docs/8.3/interactive/functions-info.html#FUNCTIONS-TXID-SNAPSHOT">txid_snapshot</a>.  Bien sûr,
l'objectif de Skytools est d'avoir une solution la plus simple possible,
parfaitement adapée à un ensemble de cas d'utilisation précis et bornés,
alors que Slony essaye de résoudre automatiquement les problèmes les plus
difficiles du domaine, au prix d'une interface très complexe.</p>

<p>Bien sûr, <strong><em>Jan</em></strong> a pris le temps de comparer objectivement ces solutions de
réplication avec la solution intégrée dans PostgreSQL, <em>Streaming Replication</em>
et <em>Hot Standby</em>.  Nous avions déjà la réplication binaire asynchrone,
PostgreSQL 9.1 nous apporte la réplication synchrone avec un contrôle par
transaction.  <a href="http://database-explorer.blogspot.com/">Simon Riggs</a>, auteur de la fonctionalité, a insisté sur
l'innovation que cela représente : aucun autre projet ne permet de contrôler
la garantie de durabilité des données avec une granularité aussi souple et
précise !</p>

<p><a href="http://projects.2ndquadrant.com/repmgr">repmgr</a> est une solution d'administration de <em>cluster</em> animés avec <em>Hot Standby</em>
et <em>Streaming Replication</em> (synchrone ou non).  Son fonctionnement a été
détaillé par <strong><em>Greg Smith</em></strong> et <strong><em>Cédric Villemain</em></strong>.  Le premier a montré comment
mettre au point une architecture permettant de répartir la charge en
lecture, et le second comment obtenir un système tolérant aux pannes grâce
au <em>failover</em> automatique intégré dans repmgr. Cette solution innovante a été
mise au point en grande partie par 2ndQuadrant France, nous l'avons déjà
estampillée <em>production ready</em>.</p>

<p><strong><em><a href="http://www.hagander.net/">Magnus Hagander</a></em></strong> a beaucoup travaillé sur le protocole de <em>streaming</em> utilisé
pour la réplication intégrée dans PostgreSQL 9.1, ainsi que sur les outils
qui exploitent ce protocole.  Il a naturellement présenté cela, et l'idée
d'un <em>proxy</em> relayant le flux binaire des journaux de transaction est revenue
dans les discutions (nous avions déjà envisagé cela en 2010, l'article en
anglais <a href="../../2010/05/27-back-from-pgcon2010.html">Back from PgCon2010</a> contient quelques éléments sur le sujet).  Avec
la réplication synchrone, il devient possible de concevoir des architectures
avancées, robustes et versatiles — le proxy pourrait maintenant s'occuper à
la fois des archives et des serveurs <em>standby</em>.</p>

<p><a href="http://database-explorer.blogspot.com/">Simon Riggs</a> nous a ensuite proposé une rétrospective des 7 dernières années
de travail qu'il a réalisé avec PostgreSQL, de l'implémentation du <em>Point in
Time Recovery</em> à la réplication synchrone, en passant par <em>Hot Standby</em>.  Ce
que nous avons dans PostgreSQL 9.0 correspond déjà à ce qu'Oracle propose de
plus avancé en terme de durabitilé des données, et 9.1 permet de franchir
l'étape suivante.  Cela ne freine en rien <strong><em>Simon</em></strong> qui parlait déjà des projets
à venir pour les 10 prochaines années.</p>

<p>Enfin, <a href="http://www.heroku.com/">Heroku</a> nous a présenté leur incroyable entreprise.  Ils ont
aujourd'hui plus de <code>150 000</code> instances de PostgreSQL en production,
démontrant que notre <code>SGBD</code> préféré est prêt pour les hébergeurs. <strong><em>Heroku</em></strong> est
en train de concevoir et réaliser une solution prête à l'emploi pour le
fameux <em>Cloud</em> si difficile à définir.  Ici, il s'agit d'être capable
d'ajouter des nouveaux réplicas en lecture seule à la volée pour encaisser
les pics de trafic, créer des instances de développement d'un clic, etc.</p>

<p>Cet article ne couvre qu'une petite sélection des sujets abordés à la
conférence, je compte sur <a href="http://blog.guillaume.lelarge.info/">Guillaume</a> pour lui aussi vous parler de <a href="http://char11.org/schedule">CHAR(11)</a>,
mais il faudra peut être attendre son retour des <a href="http://2011.rmll.info/">RMLL</a> (quelle énergie !).</p>


<h2>Tags</h2>

<p><a href="../../../tags/postgresqlfr.html">PostgreSQLFr</a> <a href="../../../tags/conferences.html">Conferences</a> <a href="../../../tags/skytools.html">Skytools</a></p>


</div>

]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Wed, 13 Jul 2011 17:30:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/07/13-de-retour-de-char11.html</guid>
</item>
<item>
  <title>Prêt pour CHAR(11) ?</title>
  <link>http://tapoueh.org/blog/2011/07/04-pret-pour-char11.html</link>
  <description><![CDATA[h1>Prêt pour CHAR(11) ?</h1>
<div id="breadcrumb"><a href=../../../index.html>/dev/dim</a> / <a href=../../../blog/index.html>blog</a> / <a href=../../../blog/2011/index.html>2011</a> / <a href=../../../blog/2011/07/index.html>07</a> / </div>
<div class="date">Monday, July 04 2011, 20:15</div>
</div>
<div id="article">
<p>La semaine prochaine <strong>déjà</strong> se tient <a href="http://www.char11.org/">CHAR(11)</a>, la conférence spécialisée sur
le <em>Clustering</em>, la <em>Haute Disponibilité</em> et la <em>Réplication</em> avec <a href="http://www.postgresql.org/">PostgreSQL</a>.
C'est en Europe, à Cambridge cette fois, et c'est en anglais même si
plusieurs compatriotes seront dans l'assistance.</p>

<p>Si vous n'avez pas encore jeté un œil au <a href="http://www.char11.org/schedule">programme</a>, je vous encourage à le
faire. Même si vous n'aviez pas prévu de venir… parce qu'il y a de quoi vous
faire changer d'avis !</p>

<p>Il est déjà difficile de suivre les <a href="http://archives.postgresql.org/">listes de diffusions PostgreSQL</a> en
anglais, pour une simple question de temps, mais parfois la barrière de la
langue peut également jouer. Alors si vous n'aviez pas bien suivi, je me
permets de préciser qui sont les principaux intervenants à cette conférence.</p>

<p><strong><em>Jan Wieck</em></strong> assure la première intervention avec un rétrospectif des solutions
de réplication pour PostgreSQL. Il a initié <a href="http://slony.info/">Slony</a> et continue d'être très
actif dans son architecture et son développement.</p>

<p><strong><em>Greg Smith</em></strong>, un collègue chez <a href="http://www.2ndquadrant.us/">2ndQuadrant</a>, est monsieur performances « bas
niveau » : sa spécialité est de tirer le meilleur de votre matériel, de
votre configuration serveur, de PostgreSQL lui-même, et des requêtes que
vous lui soumettez. Son livre <a href="http://www.2ndquadrant.com/books/postgresql-9-0-high-performance/">PostgreSQL High Performance</a> est un
incontournable, à ce titre <a href="http://blog.guillaume.lelarge.info/index.php/post/2011/05/01/%C2%AB-Bases-de-donn%C3%A9es-PostgreSQL&#44;-Gestion-des-performances-%C2%BB">traduit en français</a>.</p>

<p>Nous avons ensuite <strong><em>Magnus Hagander</em></strong> qui a rejoint récemment la <em>core team</em>
(l'organisation centrale du projet), et qui contribue depuis plus de 10 ans
au code de PostgreSQL.</p>

<p><strong><em>Simon Riggs</em></strong>, lui aussi un de <a href="http://www.2ndquadrant.com/about/#riggs">nos collègues</a>, a réalisé le <em>PITR</em>, l'archivage
des journaux de transactions, la réplication asynchrone et pour la prochaine
version de PostgreSQL, la réplication synchrone.</p>

<p><strong><em>Hannu Krosing</em></strong> (devinez <a href="http://www.2ndquadrant.com/">où</a> il travaille ?) a conçu l'architecture (et les
outils) qui permettent à <a href="http://www.skype.com/">Skype</a> d'annoncer une « scalability » infinie, en
tout cas annoncée pour supporter jusqu'à <a href="http://highscalability.com/skype-plans-postgresql-scale-1-billion-users">1 milliard d'utilisateurs</a>.</p>

<p><strong><em>Koichi Suzuki</em></strong> dirige les efforts du produit prometteur <a href="http://postgres-xc.sourceforge.net/">PostgreS-XC</a>, un bel
exemple de collaboration entre différents acteurs du marché, ici
<a href="http://www.enterprisedb.com/">EnterpriseDB</a> et <a href="https://www.oss.ecl.ntt.co.jp/ossc/">NTT Open Source Software Center</a>. Ce qui montre une fois de
plus que l'<a href="http://fr.wikipedia.org/wiki/Open_source">Open Source</a> est solidement ancré dans entreprises commerciales.</p>

<p>Bien sûr, Cédric et moi-même, de la partie française de <a href="http://www.2ndquadrant.fr/">2ndQuadrant</a>, serons
de la partie. Nous interviendrons sur des sujets que nous connaissons bien
pour avoir participé à leur développement et pour les déployer et les
maintenir en production, <a href="http://projects.2ndquadrant.com/repmgr">repmgr</a> et <a href="http://wiki.postgresql.org/wiki/Londiste_Tutorial">Londiste</a>.</p>

<p>Et je passe sur d'autres profils, dont les sujets ne serront pas moins
intéressants. Bref, si <em>réplication</em> et <em>cluster</em> sont des thèmes que vous
voulez conjuguer avec PostgreSQL, c'est l'endroit où passer le début de la
semaine prochaine !</p>


<h2>Tags</h2>

<p><a href="../../../tags/postgresqlfr.html">PostgreSQLfr</a> <a href="../../../tags/conferences.html">Conferences</a> <a href="../../../tags/skytools.html">skytools</a></p>


</div>

]]></description>
  <author>dim@tapoueh.org (Dimitri Fontaine)</author>
  <pubDate>Mon, 04 Jul 2011 20:15:00 +0200</pubDate>
  <guid isPermaLink="true">http://tapoueh.org/blog/2011/07/04-pret-pour-char11.html</guid>
</item>
  </channel>
</rss>
