<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.guillaume.lelarge.info/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>gleu's blog - Développement</title>
  <link>http://blog.guillaume.lelarge.info/index.php/</link>
  <atom:link href="http://blog.guillaume.lelarge.info/index.php/feed/category/Developpement/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Sun, 07 Sep 2008 18:13:59 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Geany, suite</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/03/11/Geany-suite</link>
    <guid isPermaLink="false">urn:md5:e4485c07bf8afc8f836fcf9f10a34195</guid>
    <pubDate>Tue, 11 Mar 2008 13:32:00 +0100</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
            
    <description>    &lt;p&gt;Je trouve que Geany est un excellent éditeur de code source. Il me manquait surtout un navigateur pour ouvrir rapidement un fichier. Je savais que la prochaine version en avait un, mais je ne voulais pas me lancer dans la compilation de la version SVN. Pas la peine, &lt;a href=&quot;http://nawer.freecontrib.org/index.php?2008/03/01/256-geany-sur-xubuntu-et-un-petit-ecran-d-eeepc&quot; hreflang=&quot;fr&quot;&gt;un .deb version 0.14-svn est disponible sur ce site&lt;/a&gt;. Et ça marche trop bien. Merci au packageur &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/03/11/Geany-suite#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/03/11/Geany-suite#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/952</wfw:commentRss>
      </item>
    
  <item>
    <title>Écriture d'un script bash</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash</link>
    <guid isPermaLink="false">urn:md5:e9c5b3668589ae32fd006ffa20dddc2b</guid>
    <pubDate>Fri, 05 Oct 2007 17:50:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>bash</category>    
    <description>    &lt;p&gt;Depuis quelques semaines, j'ai pris de bonnes résolutions pour mes scripts bash. Je suis arrivé à les structurer efficacement.&lt;/p&gt;


&lt;p&gt;Je commence tout d'abord par les variables configurables. Cela donne en gros ceci :&lt;/p&gt;

&lt;pre&gt;
##### Variables configurables #####
# outils
PGDUMP=$(which pg_dump)
PSQL=$(which psql)
# cet outil
ME=`basename $0`
# répertoires de travail
DIRBASE=${REPBASE:-&amp;quot;/opt/${ME}&amp;quot;}
# fichiers temporaires
FICTMP=&amp;quot;/tmp/${ME}.$$&amp;quot;
# journaux
FICLOG=&amp;quot;$DIRBASE/${ME}.log&amp;quot;
FICERR=&amp;quot;$DIRBASE/${ME}.err&amp;quot;
# fichiers de configuration
FICCONF=${1:&amp;quot;/etc/${ME}.conf&amp;quot;}
##### Fin des variables configurables #####
&lt;/pre&gt;


&lt;p&gt;En premier lieu, les outils. Par défaut, j'indique &lt;code&gt;$(which mon_outil)&lt;/code&gt; pour que l'emplacement système par défaut soit utilisé. Cependant, si l'utilisateur de ce script a compilé et installé lui-même cet outil dans un répertoire particulier, il peut directement modifier cette ligne en y mettant le chemin complet. Ensuite, nous avons les répertoires de travail, les fichiers temporaires, de configuration et les journaux. L'initialisation de la variable &lt;code&gt;DIRBASE&lt;/code&gt; est intéressante : elle signifie que &lt;code&gt;DIRBASE&lt;/code&gt; sera initialisée avec le contenu de la variable &lt;code&gt;REPBASE&lt;/code&gt; si cette variable est déjà initialisée et que, dans le cas contraire, elle prendra la valeur &lt;code&gt;/opt/${ME}&lt;/code&gt;. Cela a un très gros intérêt : cela me permet de modifier une variable suivant mon environnement. Je n'ai donc pas besoin de modifier le script pour que &lt;code&gt;DIRBASE&lt;/code&gt; considère un autre répertoire de travail. &lt;code&gt;FICCONF=${1:&amp;quot;/etc/${ME}.conf&amp;quot;}&lt;/code&gt; est un autre exemple de ce type de construction. La variable FICCONF prendra la valeur du premier argument en ligne de commande, s'il y en a un. Dans le cas contraire, FICCONF sera initialisée avec /etc/${ME}.conf. Cela me permet donc de modifier temporairement le fichier de configuration en le proposant sur la ligne de commande.&lt;/p&gt;


&lt;p&gt;Une fois les initialisations réalisées, il faut vérifier un certain nombre de points. Par exemple, je propose à l'utilisateur de modifier certaines variables. Il est donc essentiel que je vérifie que les modifications réalisées sont valides. Voici la vérification des variables :&lt;/p&gt;

&lt;pre&gt;
for variable in &amp;quot;PGDUMP&amp;quot; &amp;quot;PSQL&amp;quot; &amp;quot;ME&amp;quot; &amp;quot;DIRBASE&amp;quot; \
                &amp;quot;FICTMP&amp;quot; &amp;quot;FICLOG&amp;quot; &amp;quot;FICERR&amp;quot; &amp;quot;FICCONF&amp;quot;
do
  eval valeur=\$$variable
  if test -z &amp;quot;$valeur&amp;quot;
  then
    echo &amp;quot;ERREUR: mauvaise configuration de la variable $variable (actuellement vide)&amp;quot;
    exit 1
  fi
done
&lt;/pre&gt;


&lt;p&gt;Je vérifie ensuite l'existence des outils et leur « exécutabilité » :&lt;/p&gt;

&lt;pre&gt;
for outil in &amp;quot;$PSQL&amp;quot; &amp;quot;$PGDUMP&amp;quot;
do
  if test ! -x &amp;quot;$outil&amp;quot;
  then
    echo &amp;quot;ERREUR: $outil inexistant ou non exécutable&amp;quot;
    exit 2
  fi
done
&lt;/pre&gt;


&lt;p&gt;Ensuite, je vérifie les répertoires. Généralement, ce sont des répertoires de travail, donc, s'ils n'existent pas, il faut les créer :&lt;/p&gt;

&lt;pre&gt;
if test ! -d &amp;quot;$DIRBASE&amp;quot;
then
  mkdir -p &amp;quot;$REP_DUMP&amp;quot;
  if test $? -eq 0
  then
    echo &amp;quot;création du répertoire de sauvegarde '$REP_DUMP'&amp;quot;
  else
    echo &amp;quot;ERREUR lors de la création du répertoire de sauvegarde '$REP_DUMP'&amp;quot;
    exit 3
  fi
fi
&lt;/pre&gt;


&lt;p&gt;Voilà. Du coup, mes scripts comportent généralement plus de tests que de code réalisant la fonction première, mais bon, au moins, c'est assez blindé.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/841</wfw:commentRss>
      </item>
    
  <item>
    <title>Quelques trucs glanés au boulot...</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2007/03/03/Quelques-trucs-glaner-au-boulot</link>
    <guid isPermaLink="false">urn:md5:f4af37a7b0a5dbd5cfb48d55bcb5dd79</guid>
    <pubDate>Sat, 03 Mar 2007 16:47:00 +0100</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>jquery</category><category>trac</category>    
    <description>    &lt;p&gt;En fait, deux.&lt;/p&gt;


&lt;p&gt;Le premier concerne &lt;a href=&quot;http://trac.edgewall.org/&quot; hreflang=&quot;en&quot;&gt;trac&lt;/a&gt;. Vous pouvez modifier les pages générées par trac car elles sont créées à partir d'un template. Par exemple, pour la page de la roadmap, vous pouvez modifier le fichier roadmap.cs. Vous pouvez le faire de deux façons : le modifier dans le répertoire global (sur ma &lt;a href=&quot;http://www.debian.org/&quot; hreflang=&quot;fr&quot;&gt;Debian&lt;/a&gt;, il s'agit de &lt;code&gt;/usr/share/trac/templates&lt;/code&gt;) ou le copier dans le répertoire templates de votre session trac et le modifier là-bas. Le deuxième point est plus intéressant quand vous utilisez plusieurs trac sur une même machine et que vous ne voulez pas que les modifications sur un trac se voient sur l'autre.&lt;/p&gt;


&lt;p&gt;Le deuxième concerne &lt;a href=&quot;http://www.getfirebug.com&quot; hreflang=&quot;en&quot;&gt;Firebug&lt;/a&gt; et &lt;a href=&quot;http://www.jquery.com&quot; hreflang=&quot;en&quot;&gt;jQuery&lt;/a&gt;. Le premier est un outil vraiment génial pour concevoir des sites web, le second est une excellente bibliothèque JavaScript. Pas étonnant que son auteur soit parti bosser à la fondation &lt;a href=&quot;http://www.mozilla.com&quot; hreflang=&quot;en&quot;&gt;Mozilla&lt;/a&gt;. Les deux ensemble, c'est du bonheur &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2007/03/03/Quelques-trucs-glaner-au-boulot#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2007/03/03/Quelques-trucs-glaner-au-boulot#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/712</wfw:commentRss>
      </item>
    
  <item>
    <title>Ce matin, sur #postgresql</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2006/12/09/Ce-matin-sur-postgresql</link>
    <guid isPermaLink="false">urn:md5:863d4fcf247b9d9773751066e4a4b32e</guid>
    <pubDate>Sat, 09 Dec 2006 09:30:00 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>vb</category>    
    <description>    &lt;p&gt;Petite discussion entre deux personnes sur #postgresql ce matin :&lt;/p&gt;


&lt;pre&gt;[09:26] &amp;lt;guy1&amp;gt; VB sucks
[09:26] &amp;lt;guy1&amp;gt; i wish i never learned it
[09:26] &amp;lt;guy2&amp;gt; guy2; I agree, but its the cobol of this decade&lt;/pre&gt;


&lt;p&gt;J'ai anonymisé les noms mais je n'ai pas modifié les messages... Je suis en total accord avec eux.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2006/12/09/Ce-matin-sur-postgresql#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2006/12/09/Ce-matin-sur-postgresql#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/650</wfw:commentRss>
      </item>
    
  <item>
    <title>Deux livres que j'ai fini, un troisième en cours (enfin presque terminé)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2005/07/27/299-deux-livres-que-j-ai-fini-un-troisieme-en-cours-enfin-presque-termine</link>
    <guid isPermaLink="false">urn:md5:115e1cf8e9abfe5fe604f748463c026f</guid>
    <pubDate>Wed, 27 Jul 2005 23:59:35 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>joelonsoftware</category>    
    <description>    &lt;p&gt;Quand j'ai pris connaissance de la liste de bouquins que tout bon développeur doit avoir lu d'après Joël Spolski, j'ai commandé les deux plus intéressants, à mon goût, «&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0932633439/ref%3Dnosim/joelonsoftware/002-6624669-4539231&quot; hreflang=&quot;en&quot;&gt;Peopleware&amp;nbsp;: Productive Projects and Teams&lt;/a&gt;&amp;nbsp;» et «&amp;nbsp;&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/020161622X/ref%3Dnosim/joelonsoftware/002-6624669-4539231&quot; hreflang=&quot;en&quot;&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt;&amp;nbsp;».&lt;/p&gt;


&lt;p&gt;Ils sont tous les deux très bons, même si je suis un peu resté sur ma faim. «&amp;nbsp;Peopleware&amp;nbsp;: Productive Projects and Teams&amp;nbsp;» n'est pas spécialement orienté chef de projet. Tout développeur peut le lire pour tenter de comprendre les différents événements dans son travail de tous les jours. C'est très instructif et on retrouve plein d'événements du quotidien&amp;nbsp;: des réunions qui n'en finissent pas, des dates de livraison qui sont soit rallongés soit écourtés, des certitudes qui n'en sont pas. Le deuxième, «&amp;nbsp;The Pragmatic Programmer: From Journeyman to Master&amp;nbsp;», est orienté vers le développeur. C'est un ensemble de recettes permettant de passer de l'état développeur débutant (ie sortant de l'école d'ingé ou de la fac) à l'état de développeur confirmé/expert. Là-aussi, j'y ai retrouvé beaucoup de choses qui font mon quotidien... autant dans les mauvais points que dans les bons. À force de lire mes problèmes de tous les jours, il faut avouer que cela fait un peu liste d'idées totalement évidentes mais je pense qu'il est bon de les dire quand même.&lt;/p&gt;


&lt;p&gt;Un des conseils les plus frappants (donnés dans les deux livres) est de laisser du temps au développeur pour augmenter ses connaissances. Le deuxième livre préconise notamment d'apprendre un nouveau langage tous les ans &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Mais en fait, peu importe ce dernier conseil. L'important est de lire, de se tenir au courant des nouveautés, de l'évolution des technologies. Je l'avais beaucoup fait à un moment. Je lisais énormément de livres informatiques, j'imprimais des tonnes d'articles publiés sur Internet. J'apprenais énormément de choses. Il me semble que j'ai plus appris dans les livres qu'à la fac. Si je me souviens bien, à la fac, je faisais gentimment mon TD mais je n'allais pas voir plus loin. Ça ne m'intéressait pas. Quand j'ai commencé à bosser, certains problèmes se posaient à moi (par exemple, créer une documentation, la mettre à disposition des autres facilement)... je ne pouvais compter sur personne. C'est là que j'ai commencé à lire, à tester, à chercher à comprendre. C'est là que j'ai commencé à devenir un geek &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; (mentalement, parce que physiquement, je manque de barbe).&lt;/p&gt;


&lt;p&gt;Le gros avantage de ces deux livres, c'est qu'ils insistent tous les deux sur cet aspect formation, qu'il s'agisse d'une auto-formation ou d'une formation donnée par quelqu'un d'autre. Et que c'est quelque chose très difficile à faire admettre à une direction.&lt;/p&gt;


&lt;p&gt;Du coup, je me suis dit que j'allais me remettre un peu à lire des bouquins informatiques. Nessie m'ayant parlé du «&amp;nbsp;Programmation système en C sous Linux&amp;nbsp;» comme d'une oeuvre de référence, je l'ai commandé chez &lt;a href=&quot;http://www.eyrolles.fr/&quot; hreflang=&quot;fr&quot;&gt;Eyrolles&lt;/a&gt;. Je le dévore depuis, j'apprends des nouveaux trucs qui me rappellent de vieux souvenirs de fac... le problème avec les études, c'est qu'il faut apprendre pour apprendre. Quand vous bossez, vous devez apprendre pour résoudre un problème immédiat. Le problème, quand vous bossez, c'est que vous n'avez plus le temps d'apprendre... J'espère qu'un jour j'aurais un boulot où on me laissera un peu de temps pour apprendre quelque chose de nouveau, y compris si cela n'a aucun rapport avec mon projet immédiat.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2005/07/27/299-deux-livres-que-j-ai-fini-un-troisieme-en-cours-enfin-presque-termine#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2005/07/27/299-deux-livres-que-j-ai-fini-un-troisieme-en-cours-enfin-presque-termine#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/294</wfw:commentRss>
      </item>
    
  <item>
    <title>Qt - stage 2</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/266-qt-stage-2</link>
    <guid isPermaLink="false">urn:md5:7cbf54b2929ec3a1a46b75d88c34f8bd</guid>
    <pubDate>Fri, 17 Jun 2005 23:58:41 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>postgresql</category><category>qt</category>    
    <description>    &lt;p&gt;Comme une image est souvent plus parlante...
&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/images_dc1/qtpginfo/qtPgInfo.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Ça m'a pris une heure, montre en main. Il est vrai que mon code n'est pas très beau, que j'ai des fonctions qui se ressemblent beaucoup. Mais tout de même... mon application ne se connecte à PostgreSQL qu'à partir du moment où je clique sur le bouton «&amp;nbsp;Se connecter&amp;nbsp;» puis elle remplit les quatres tableaux avec les valeurs attendues. Les champs booléans disposent de cases à cocher, plutôt que d'un texte indiquant si l'option est active ou non.&lt;/p&gt;


&lt;p&gt;Je ne pensais pas que cela serait aussi rapide et aussi simple &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il faudrait maintenant que j'affiche aussi les stats une fois une base de données sélectionnée... ça attendra demain. Là, je vais aller me coucher.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/266-qt-stage-2#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/266-qt-stage-2#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/261</wfw:commentRss>
      </item>
    
  <item>
    <title>Qt - stage 1</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/265-qt-stage-1</link>
    <guid isPermaLink="false">urn:md5:8b7f6e9e62e158767b77b07fc6398ca8</guid>
    <pubDate>Fri, 17 Jun 2005 00:24:14 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>qt</category>    
    <description>    &lt;p&gt;En dehors de la réunion du CA ce soir, j'ai de nouveau attaqué un peu Qt. Je suis très étonné d'arriver à faire un petit programme simple en si peu de temps. J'avais peur que cela soit une galère en C++ mais j'arrive à me débrouiller plutôt bien.&lt;/p&gt;


&lt;p&gt;J'ai créé une classe représentant ma fenêtre. L'application se connecte à une base de données PostgreSQL, récupère la version du serveur, lance une requête sur la table des adhérents de galette et les affiche dans un tableau. Ça n'est pas aussi simple que cela paraît mais j'ai mis peu de temps. Je ne pense pas que j'aurais été plus vite en PHP ou en VC++. Voici le code de ma classe&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;#include &quot;pggl.h&quot;

#include &amp;lt;qapplication.h&amp;gt;
#include &amp;lt;qsqldatabase.h&amp;gt;
#include &amp;lt;qsqlquery.h&amp;gt;
#include &amp;lt;qlabel.h&amp;gt;
#include &amp;lt;qtable.h&amp;gt;


pggl::pggl(QWidget* parent, const char* name, WFlags fl)
    : Form1(parent,name,fl)
{
    db = QSqlDatabase::addDatabase(&quot;QPSQL7&quot;);
    db-&amp;gt;setDatabaseName(&quot;galette&quot;);
    db-&amp;gt;setUserName(&quot;guillaume&quot;);
    db-&amp;gt;setPassword(&quot;&quot;);
    db-&amp;gt;setHostName(&quot;localhost&quot;);

    if ( ! db-&amp;gt;open() ) {
      qWarning( &quot;Failed to open database : &quot; + db-&amp;gt;lastError().text() );
    }

    QSqlQuery query( &quot;SELECT version()&quot;, db );
    if ( query.isActive() ) {
      query.next();
      lblVersion-&amp;gt;setText(query.value(0).toString());
    }
}

void pggl::initialiseTable()
{
    int i = 0;
    QSqlQuery query2( &quot;select nom_adh, prenom_adh, ville_adh, activite_adh from adherents &quot;, db );
    table1-&amp;gt;setNumRows(query2.size());
    table1-&amp;gt;setNumCols(4);
    table1-&amp;gt;setColumnMovingEnabled(true);
    table1-&amp;gt;setShowGrid(false);
    table1-&amp;gt;setSelectionMode(QTable::SingleRow);
    table1-&amp;gt;setReadOnly(true);
    table1-&amp;gt;verticalHeader()-&amp;gt;hide();
    table1-&amp;gt;setLeftMargin(0);
    QHeader *header = table1-&amp;gt;horizontalHeader();
    header-&amp;gt;setLabel( 0, &quot;Nom&quot; );
    header-&amp;gt;setLabel( 1, &quot;Prénom&quot; );
    header-&amp;gt;setLabel( 2, &quot;Ville&quot; );
    header-&amp;gt;setLabel( 3, &quot;Actif&quot; );

    QCheckTableItem* chk;

    while ( query2.next() ) {
      table1-&amp;gt;setText( i, 0, query2.value(0).toString() );
      table1-&amp;gt;setText( i, 1, query2.value(1).toString() );
      table1-&amp;gt;setText( i, 2, query2.value(2).toString() );
      chk = new QCheckTableItem( table1, &quot;&quot;);
      chk-&amp;gt;setChecked( query2.value(3).toBool() );
      table1-&amp;gt;setItem( i, 3, chk );
      i++;
    }
}&lt;/pre&gt;


&lt;p&gt;Bref, simple, facile, rapide... ceci dit, j'arrive quand même à ajouter des cases à cocher dans mon tableau, à autoriser le drag and drop parmi les colonnes, etc. Je suis incapable de faire cela en VB ou en VC++.&lt;/p&gt;


&lt;p&gt;Évidemment, ce n'est qu'un début. Je ne suis pas très à l'aise en C + +. L'aide sur les &lt;a href=&quot;http://doc.trolltech.com/3.3/index.html&quot; hreflang=&quot;en&quot;&gt;API de Qt&lt;/a&gt; est remarquable. Le site «&amp;nbsp;&lt;a href=&quot;http://www.codeskipper.com/&quot; hreflang=&quot;en&quot;&gt;The Code Skipper&lt;/a&gt;&amp;nbsp;» est très utile. Je me lance donc dans un projet&amp;nbsp;: recoder &lt;a href=&quot;http://phppginfo.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;phpPgInfo&lt;/a&gt; en C + +/Qt. Un projet assez simple, mais qui va me permettre d'apprendre des tas de choses... et c'est tant mieux.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/265-qt-stage-1#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2005/06/17/265-qt-stage-1#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/260</wfw:commentRss>
      </item>
    
  <item>
    <title>Travail du développeur</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/263-travail-du-developpeur</link>
    <guid isPermaLink="false">urn:md5:f49554e9c6ae6e659952f77d58f37f87</guid>
    <pubDate>Wed, 15 Jun 2005 00:58:58 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
            
    <description>    &lt;p&gt;Bon, pour être un peu plus gai que mon précédent billet, voici un lien vers un &lt;a href=&quot;http://recycledknowledge.blogspot.com/2005/06/flow-stuckness-and-interruptions.html&quot; hreflang=&quot;fr&quot;&gt;article très intéressant sur le travail des développeurs&lt;/a&gt;. Notamment, l'article aborde trois dominantes dans la vie d'un développeur, ou plus généralement d'un intellectuel (comprendre ici le contraire du manuel)&amp;nbsp;: le flux&lt;sup&gt;[&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/#pnote-263-1&quot; id=&quot;rev-pnote-263-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; (the flow), le blocage&lt;sup&gt;[&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/#pnote-263-2&quot; id=&quot;rev-pnote-263-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; (stuckness) et les interruptions (déplorables dans certains cas, tout à fait intéressantes autrement).&lt;/p&gt;


&lt;p&gt;Cet article m'a beaucoup fait penser à un livre que je suis en train de lire, «&amp;nbsp;&lt;a href=&quot;http://www.amazon.fr/exec/obidos/ASIN/0932633439/qid=1118790136/sr=8-1/ref=sr_8_xs_ap_i1_xgl/171-8144766-5448245&quot; hreflang=&quot;fr&quot;&gt;Peopleware&lt;/a&gt;&amp;nbsp;». Il n'est donc pas étonnant de le trouver dans les références de l'article &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;J'essaierais de poster un billet plus long sur ce sujet une fois que j'aurais terminé de lire ce livre. En attendant, lisez cet article.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/#rev-pnote-263-1&quot; id=&quot;pnote-263-1&quot;&gt;1&lt;/a&gt;] lorsque vous savez exactement ce que vous devez coder et qu'on ne doit pas vous déranger pour ne pas interrompre ce flux&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/#rev-pnote-263-2&quot; id=&quot;pnote-263-2&quot;&gt;2&lt;/a&gt;] lorsqu'une réflexion est complètement bloquée, qu'il est du coup impossible de coder et qu'il vaut cent fois mieux vous interrompre&lt;/p&gt;&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/263-travail-du-developpeur#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2005/06/15/263-travail-du-developpeur#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/258</wfw:commentRss>
      </item>
    
  <item>
    <title>Dotclear, analyse de l'assistant d'installation</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2005/01/25/140-dotclear-revue-de-linstallation</link>
    <guid isPermaLink="false">urn:md5:eff80b73ff123d5f50c455528b028a08</guid>
    <pubDate>Tue, 25 Jan 2005 00:17:22 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
            
    <description>&lt;p&gt;Ce document n'a pas pour but de donner les étapes pour installer &lt;a href=&quot;http://www.dotclear.net&quot; hreflang=&quot;fr&quot;&gt;DotClear&lt;/a&gt;. Il existe pour cela d'&lt;a href=&quot;http://www.dotclear.net/support/install/&quot; hreflang=&quot;fr&quot;&gt;autres ressources sur le web&lt;/a&gt;. Non, le but de ce document est de plonger dans le code qui anime ce logiciel. Pourquoi l'analyser&amp;nbsp;? J'ai toujours entendu dire qu'&lt;a href=&quot;http://www.neokraft.net/blog/&quot; hreflang=&quot;fr&quot;&gt;Olivier Meunier&lt;/a&gt; est un formidable codeur... autant le vérifier soi-même. Et puis, j'ai besoin de me replonger un peu dans du code. Ça me change un peu de la traduction et ce n'est pas un mal.&lt;/p&gt;    &lt;p&gt;Commençons par dire qu'il n'usurpe pas du tout sa réputation (même si j'aurais pris des conventions de codage un peu plus strict). Ceci étant fait, passons aux choses sérieuses.&lt;/p&gt;


&lt;p&gt;Tout d'abord, je me demandais si Olivier utilisait un système de template. En effet, il est conseillé de séparer forme et fond. En ce qui concerne l'assistant d'installation, ce n'est pas le cas. Le code XHTML est complètement imbriqué dans le code PHP. En haut du script, un &lt;code&gt;require dirname(&lt;strong&gt;FILE&lt;/strong&gt;).'/__top.php';&lt;/code&gt; amène les en-têtes du standard XHTML avec encodage dépendant de la configuration. En bas du script, l'équivalent pour la fin de page se nomme &lt;code&gt;__bottom.php&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Comme il n'utilise pas de template mais qu'il fait usage d'un grand nombre de formulaires dans l'assistant, il a créé une classe form (&lt;code&gt;lib.form.php&lt;/code&gt;) lui permettant d'ajouter facilement une liste de sélection ou un ensemble de boutons radio, voire même un simple champ texte. L'avantage est de clarifier le fichier exécuté. Un simple appel de fonction permet d'ajouter un élément du formulaire avec quatre ou cinq caractèristiques (id, taille, taille max, valeur par défaut, ordre de tabulation, etc.). Les listes déroulantes sont créées à partir d'un élément de type array, moyen très élégant si les informations proviennent d'une base de données ou d'un fichier (type CSV par exemple).&lt;/p&gt;


&lt;p&gt;Un autre point qui m'impressionne dans son assistant est la liste de points de vérifications effectués ou d'actions réalisés. Là aussi, il utilise une classe (&lt;code&gt;class.checklist.php&lt;/code&gt;). Après l'avoir instancié, la fonction addItem permet d'ajouter des tests à effectuer. Après quelques ajouts, nous pouvons demander le code HTML représentant tous les tests, réussis et en échec (avec les images) puis de nous donner le résultat final.&lt;/p&gt;


&lt;p&gt;Tous les écrans de l'assistant d'installation fonctionnent ainsi&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;test si le formulaire a déjà été rempli&lt;br /&gt;
si oui,&lt;br /&gt;
vérification des arguments donnés, récupérés via la session php (pour la base de données, tentative de connexion ou de création des tables)&lt;br /&gt;
si la vérification est positive, un  simple &lt;code&gt;header ('location: fonction_suivant.php')&lt;/code&gt; permet d'accèder à la fenêtre suivante de l'assistant&lt;br /&gt;
si non,&lt;br /&gt;
affichage du formulaire&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Bref, c'est simple, c'est clair, c'est propre. Les fichiers sont petits, plutôt bien codés, très facile à comprendre. Olivier n'usurpe vraiment pas sa réputation. Sans parler des feuilles de style très jolies... un artiste en plus &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2005/01/25/140-dotclear-revue-de-linstallation#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2005/01/25/140-dotclear-revue-de-linstallation#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/138</wfw:commentRss>
      </item>
    
  <item>
    <title>De l'art du déboguage</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2004/11/20/87-de-lart-du-deboguage</link>
    <guid isPermaLink="false">urn:md5:bbc499d301a0df5b9d165955264fa73e</guid>
    <pubDate>Sat, 20 Nov 2004 14:24:03 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
            
    <description>    &lt;p&gt;Une petite citation de Brian Kernighan&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;En voici une petite traduction pour les anglophobes&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Le déboguage est deux fois plus difficile que l'écriture de code. Donc, si vous écrivez du code aussi intelligemment que possible, vous êtes, par définition, pas assez intelligent pour le déboguer.&lt;/p&gt;&lt;/blockquote&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2004/11/20/87-de-lart-du-deboguage#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2004/11/20/87-de-lart-du-deboguage#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/86</wfw:commentRss>
      </item>
    
  <item>
    <title>NSIS : fin de la création de l'installeur</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2004/08/31/16-nsis-fin-de-la-creation-de-linstalleur</link>
    <guid isPermaLink="false">urn:md5:78c401d81287a0f4165be7bfa81d033f</guid>
    <pubDate>Tue, 31 Aug 2004 21:55:00 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>installeur</category><category>nsis</category><category>vb</category>    
    <description>    &lt;p&gt;J'indiquais sur &lt;a href=&quot;http://www.traduc.org/%7Egleu/dotclear/index.php?2004/08/20/4-installeur-nsis-suite&quot;&gt;ce billet&lt;/a&gt; qu'il me manquait encore quelques fonctionnalités sur &lt;a href=&quot;http://nsis.sourceforge.net/&quot;&gt;NSIS&lt;/a&gt; que j'avais sur &lt;a href=&quot;http://www.installshield.com/&quot;&gt;InstallShield&lt;/a&gt;. Entre autres, il y avait l'enregistrement de composants &lt;acronym title=&quot;Visual Basic&quot;&gt;VB&lt;/acronym&gt;6, du pilote &lt;acronym title=&quot;Open DataBase Connectivity&quot;&gt;ODBC&lt;/acronym&gt; de &lt;a href=&quot;http://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt; et des modifications sur les bases de registre.&lt;/p&gt;
&lt;p&gt;Pour le premier point, au lieu de demander un « scan » de votre projet VB, éditez-le avec notepad ou &lt;a href=&quot;http://www.vim.org/&quot;&gt;gvim&lt;/a&gt; (oui, il existe sous &lt;a&gt;Windows&lt;/a&gt; &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; ). Vous y trouverez la liste des OCX et autres DLL que vous devez enregistré. La commande&lt;br /&gt;
&lt;code&gt;!insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED &amp;quot;msvbvm60.dll&amp;quot; &amp;quot;$SYSDIR\msvbvm60.dll&amp;quot; &amp;quot;$SYSDIR&amp;quot;&lt;/code&gt;&lt;br /&gt;
vous copiera et enregistrera la DLL msvbvm60.dll. Copiez ce code pour les autres OCX et DLL dont vous avez besoin et le tour est joué. Pour plus de détails, voir la &lt;a href=&quot;http://nsis.sourceforge.net/Docs/AppendixB.html#B.4&quot;&gt;documentation utilisateur de NSIS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le pilote ODBC a été plus dur. Le seul moyen que j'ai trouvé a été de lancer l'installation du fichier MSI du pilote (disponible sur le &lt;a href=&quot;ftp://ftp.postgresql.org/pub/odbc/versions/msi/&quot;&gt;site du projet psqlodbc&lt;/a&gt;). Pour cela, utilisez la commande&lt;br /&gt;
&lt;code&gt;msiexec.exe /i psqlodbc.msi /qn&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;/i&lt;/code&gt; pour demander une installation et &lt;code&gt;/qn&lt;/code&gt; pour demander une exécution silencieuse. La définition des arguments en ligne de commande de msiexec.exe est disponible sur le &lt;a href=&quot;http://msdn.microsoft.com/library/en-us/msi/setup/standard_installer_command_line_options.asp&quot;&gt;site du &lt;acronym title=&quot;MicroSoft Developer Network&quot;&gt;MSDN&lt;/acronym&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les lectures/écritures sur la base de registre sont très simples. Là  aussi, tout se trouve dans la &lt;a href=&quot;http://nsis.sourceforge.net/Docs/Chapter4.html#4.9.2&quot;&gt;documentation utilisateur de NSIS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un point que j'avais négligé concerne l'ajout d'interface personnalisée mais cela se réalise assez facilement avec l'outil &lt;a href=&quot;http://hmne.sourceforge.net/&quot;&gt;HM NIS EDIT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En tout cas, je vais certainement pouvoir jeter InstallShield rapidement &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2004/08/31/16-nsis-fin-de-la-creation-de-linstalleur#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2004/08/31/16-nsis-fin-de-la-creation-de-linstalleur#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/16</wfw:commentRss>
      </item>
    
  <item>
    <title>NSIS, Sunbird et un PC qui a du mal...</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2004/08/20/4-installeur-nsis-suite</link>
    <guid isPermaLink="false">urn:md5:b723f0b7d1e6e5ff702447572cf0fb3b</guid>
    <pubDate>Fri, 20 Aug 2004 00:18:00 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>nsis</category><category>odbc</category><category>sunbird</category>    
    <description>    &lt;ul&gt;
&lt;li&gt;J'ai passé une heure aujourd'hui à  travailler sur &lt;a href=&quot;http://nsis.sourceforge.net/&quot;&gt;NSIS&lt;/a&gt;. Pas de soucis pour des installations simples sous Windows &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Si vous pouvez vous contenter de copier quelques fichiers, de créer des raccourcis et autres modifications de fichiers .ini, ce programme vous permettra de vous en sortir avec les honneurs. Je vous conseille tout de même de récupérer &lt;a href=&quot;http://hmne.sourceforge.net/&quot;&gt;HM NIS EDIT&lt;/a&gt; car il dispose d'un assistant facilitant grandement le début de la création d'un installeur. Pour mes besoins, il me manque encore quelques points comme l'enregistrement de composants &lt;acronym title=&quot;Visual Basic&quot;&gt;VB&lt;/acronym&gt;6, du pilote &lt;acronym title=&quot;Open DataBase Connectivity&quot;&gt;ODBC&lt;/acronym&gt; de &lt;a href=&quot;http://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt; et des modifications sur les bases de registre.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozilla.org/projects/calendar/&quot;&gt;Sunbird&lt;/a&gt; vient de sortir en version autonome et cela vaut vraiment le détour. Je vais m'arranger pour tester cela au travail, voire l'intégrer à  certaines applications.&lt;/li&gt;
&lt;li&gt;Enfin, mon PC n'en finit plus de planter. Ça sent la réinstallation... mais avec une Debian Sarge &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2004/08/20/4-installeur-nsis-suite#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2004/08/20/4-installeur-nsis-suite#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
  <item>
    <title>Installeur libre sous Windows</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2004/08/17/2-installeur-libre-win32</link>
    <guid isPermaLink="false">urn:md5:08a84228d9c03765be5b96458efe5015</guid>
    <pubDate>Tue, 17 Aug 2004 00:13:00 +0000</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>installeur</category><category>logiciel libre</category><category>nsis</category>    
    <description>    &lt;p&gt;Cherchant un remplaçant libre à  &lt;a href=&quot;http://www.installshield.com&quot;&gt;Install Shield&lt;/a&gt;, j'ai fini par tomber sur celui de NullSoft : &lt;a href=&quot;http://nsis.sourceforge.net/&quot;&gt;NSIS&lt;/a&gt;. Celui-ci a l'air assez costaux pour mes besoins. Il a surtout un avantage sérieux. Son fichier de configuration est un simple fichier texte, facile à  conserver dans un &lt;acronym title=&quot;Concurrent Versioning System&quot;&gt;CVS&lt;/acronym&gt;.&lt;/p&gt;
&lt;p&gt;J'ai trouvé aussi quelques liens intéressants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le &lt;a href=&quot;http://nsis.sourceforge.net/Docs/&quot;&gt;manuel utilisateur&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;un &lt;a href=&quot;http://hmne.sourceforge.net&quot;&gt;éditeur libre pour le format NSIS&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;un &lt;a href=&quot;http://www.sullust.net/sw/dumpstate/&quot;&gt;outil de déboguage&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;un &lt;a href=&quot;http://wonko.com/mozupdate/&quot;&gt;exemple frappant de ce qu'il est possible de faire&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vivement que je teste ça.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2004/08/17/2-installeur-libre-win32#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2004/08/17/2-installeur-libre-win32#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/2</wfw:commentRss>
      </item>
    
</channel>
</rss>