<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.damienalexandre.fr/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>Damien ALEXANDRE</title>
  <link>http://blog.damienalexandre.fr/index.php?</link>
  <atom:link href="http://blog.damienalexandre.fr/index.php?feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Blog personnel de Damien ALEXANDRE, allias Mobman02.
Développeur web spécialisé PHP, symfony et développement front (intégration, javascript). Gros geek, passionné de musique et beaucoup plus du côté du lecteur que vrai rédacteur de ce blog...</description>
  <language>fr</language>
  <pubDate>Wed, 18 Aug 2010 15:25:05 +0200</pubDate>
  <copyright>Creative Commons by-nc-sa</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Désactiver temporairement Timestampable avec Doctrine</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2010/08/18/Desactiver-temporairement-Timestampable-avec-Doctrine</link>
    <guid isPermaLink="false">urn:md5:b9b3b508939e4f2b68f1c6e861a472cf</guid>
    <pubDate>Wed, 18 Aug 2010 15:54:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;Timestampable est un behavior Doctrine fort pratique qui permet de mettre en place des champs &quot;created_at&quot; et &quot;updated_at&quot; sur nos modèles sans avoir à s'en soucier.&lt;/p&gt;
&lt;p&gt;Il ont pleins &lt;a href=&quot;http://www.doctrine-project.org/documentation/manual/1_1/pl/behaviors:core-behaviors:timestampable&quot;&gt;d'options très pratiques&lt;/a&gt;, et sont entièrement automatique : à chaque save(), le updated_at est mis à jour.&lt;/p&gt;
&lt;p&gt;Seulement il peux arriver d'avoir besoin, occasionnellement, de désactiver ces automatismes (import en masse en souhaitant garder les anciennes dates, modification d'un contenu par un bot... chacun ces problèmes hein). Voici la marche à suivre.&lt;/p&gt;
&lt;pre&gt;// Récupérer le Listener (c'est pas forcement 0, ça dépend de l'ordre dans votre Table-&amp;gt;setUp())
$timestampable = $this-&amp;gt;getListener()-&amp;gt;get(0);&lt;/pre&gt;
&lt;pre&gt;// Changer les options voulu, et donc désactiver tel ou tel propriété du Behavior
$timestampable-&amp;gt;setOption(array('updated' =&amp;gt; array('disabled' =&amp;gt; true)));&lt;/pre&gt;
&lt;p&gt;Ce code se place au niveau de votre objet, dans l'idée vous pouvez vous faire une méthode,&amp;nbsp;appelée&amp;nbsp;occasionnellement donc :&lt;/p&gt;
&lt;pre&gt;public function disableTimestampableBehavior()
{
$timestampable = $this-&amp;gt;getListener()-&amp;gt;get(0);
$timestampable-&amp;gt;setOption(array('updated' =&amp;gt; array('disabled' =&amp;gt; true)));
}&lt;/pre&gt;
&lt;p&gt;De rien ! (ah et bien sûr c'est applicable aux autres Listeners !)&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2010/08/18/Desactiver-temporairement-Timestampable-avec-Doctrine#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2010/08/18/Desactiver-temporairement-Timestampable-avec-Doctrine#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/271</wfw:commentRss>
      </item>
    
  <item>
    <title>Exécuter des tests dans une base de donnée éphémère avec symfony / Doctrine</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2010/07/12/Executer-des-tests-unitaires-phpunit-dans-une-base-de-donnee-SQLite-avec-symfony-/-Doctrine</link>
    <guid isPermaLink="false">urn:md5:2a6dc8519b75dd68dc1a478cf66cd0e7</guid>
    <pubDate>Mon, 12 Jul 2010 15:01:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;Vous cherchez comment faire pour que vos test unitaire (phpunit où autres...)&amp;nbsp;s'exécutent&amp;nbsp;sur une base de donnée neuve (MySql, SQLite... peu importe) à chaque fois (avec chargement des fixtures) ? Simple. Suivez l'exemple.&lt;/p&gt;
&lt;p&gt;Dans votre fichier databases.yml, vous pouvez donner une configuration particulière à&amp;nbsp;l'environnement&amp;nbsp;de test :&lt;/p&gt;
&lt;pre&gt;test:
&amp;nbsp;&amp;nbsp;poney:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;param:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#dsn: &quot;sqlite::memory:&quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#dsn: mysql:host=127.0.0.1;dbname=poney
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dsn: sqlite:///%SF_DATA_DIR%/poney.db?mode=0666
&lt;/pre&gt;
&lt;p&gt;Tous l'intérêt de cette petite note technique réside dans le bout de code qui suit, qui va réinitialiser la base de donnée de test à chaque fois que vous lancerez vos tests :&lt;/p&gt;
&lt;pre&gt;define('SF_APP_NAME', 'backend');
define('SF_ENV', 'test');
define('SF_CONN', 'poney');
if ( SF_APP_NAME != '' )
{
&amp;nbsp;&amp;nbsp;require_once(dirname(__FILE__).'/../../../../config/ProjectConfiguration.class.php');
&amp;nbsp;&amp;nbsp;myTestClass::$configuration = ProjectConfiguration::getApplicationConfiguration( SF_APP_NAME , SF_ENV, true);
&amp;nbsp;&amp;nbsp;sfContext::createInstance(myTestClass::$configuration);
}
class myTestClass
{
&amp;nbsp;&amp;nbsp;public static $configuration = null;
&amp;nbsp;&amp;nbsp;public static $databaseManager = null;
&amp;nbsp;&amp;nbsp;public static $connection = null;
&amp;nbsp;&amp;nbsp;protected static function setup()
&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (self::$configuration)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self::$databaseManager = new sfDatabaseManager(self::$configuration);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$doctrine = new sfDoctrineBuildTask(self::$configuration-&amp;gt;getEventDispatcher(), new sfAnsiColorFormatter());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$doctrine-&amp;gt;setConfiguration(self::$configuration);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$doctrine-&amp;gt;run(array(), array(&quot;--db --and-load --no-confirmation --env=test&quot;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (SF_CONN) self::$connection = self::$databaseManager-&amp;gt;getDatabase(SF_CONN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new Exception(&quot;Unable to load the Database&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}
... ETC&lt;/pre&gt;&lt;p&gt;On lance en fait la task doctrine:build directement via le PHP, avec la très importante option &quot;--env=test&quot; qui évite d'écraser votre base de donnée de travail &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A vous de vous inspirer de ce code pour vos propres tests, il y a plein de&amp;nbsp;possibilités&amp;nbsp;(voir les lignes commentées dans le databases.yml) :&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;On peux utiliser une base de donnée&amp;nbsp;éphémère&amp;nbsp;en RAM&lt;/li&gt;
&lt;li&gt;Utiliser une base MySQL classique, ou oracle, ou n'importe quoi qui est supporté par Doctrine&lt;/li&gt;
&lt;li&gt;On peux choisir de charger des fixtures spécifique, ou pas...&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Bref vous êtes les maitres du monde. Ce code est utilisé ici avec symfony 1.4 et phpunit.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2010/07/12/Executer-des-tests-unitaires-phpunit-dans-une-base-de-donnee-SQLite-avec-symfony-/-Doctrine#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2010/07/12/Executer-des-tests-unitaires-phpunit-dans-une-base-de-donnee-SQLite-avec-symfony-/-Doctrine#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/269</wfw:commentRss>
      </item>
    
  <item>
    <title>Utiliser des fontes SVG avec Raphael.js</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2010/07/02/Utiliser-des-fontes-SVG-avec-Raphaeljs</link>
    <guid isPermaLink="false">urn:md5:d5fcb117fdbc26125e7a67388b879d93</guid>
    <pubDate>Fri, 02 Jul 2010 13:50:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;&lt;a href=&quot;http://raphaeljs.com&quot; hreflang=&quot;en&quot;&gt;Raphael.js&lt;/a&gt; est une librairie javascript permettant de dessiner du SVG très simplement, et ce sur tous les navigateurs actuels, IE6 compris (en passant par VML).&lt;/p&gt;
&lt;p&gt;Bref ça rox du poulet et je suis actuellement en train de jouer avec. Les limitations imposé par cette compatibilité sont assumées : il n'y a pas de méthode permettant d'utiliser tous les filters SVG comme&amp;nbsp;feGaussianBlur ou&amp;nbsp;feOffset (qui servent à dessiner une ombre portée) par exemple - tout simplement parce que ce n'est pas reproductible sous IE.&lt;/p&gt;
&lt;p&gt;Heureusement il est possible d'étendre Raphael pour y ajouter nos propres méthodes et ainsi exploiter pleinement &lt;a href=&quot;http://www.w3.org/TR/SVG/&quot; hreflang=&quot;en&quot;&gt;l'intégralité des spécifications SVG&lt;/a&gt; (à condition de faire fi de la compatibilité IE, mais on est là pour s'amuser non ?).&lt;/p&gt;
&lt;p&gt;Mon besoin était de mettre en place une police personnalisée. Il y a plusieurs solutions :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;utiliser des police &quot;web safe&quot; (dont le verdana, arial, helvetica...)&lt;/li&gt;
&lt;li&gt;utiliser @font-face pour déclarer une nouvelle police en CSS&lt;/li&gt;
&lt;li&gt;utiliser une fonte définie en SVG via la balise &amp;lt;font&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est ce dernier cas qui me paraissait le plus fun. J'ai donc trouvé une police libre, et j'ai convertie les glyphes qui m'intéressait en SVG grâce à l'excellent&amp;nbsp;&lt;a href=&quot;http://www.fontsquirrel.com/&quot;&gt;http://www.fontsquirrel.com/&lt;/a&gt;&amp;nbsp;!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Par contre, l'API de Raphael ne propose pas de méthode pour embedder une fonte externe. Voici ma solution, j'espère qu'elle vous sera utile &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;Raphael.fn.registerSvgFont = function (name, path)
{
var fontface = document.createElementNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;font-face&quot;);
fontface.setAttribute('font-family', name);
var fontfacesrc = document.createElementNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;font-face-src&quot;);
var fontfaceuri = document.createElementNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;font-face-uri&quot;);
fontfaceuri.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
var fontfaceformat = document.createElementNS(&quot;http://www.w3.org/2000/svg&quot;, &quot;font-face-format&quot;);
fontfaceformat.setAttribute('string', 'svg');
fontfaceuri.appendChild(fontfaceformat)
fontfacesrc.appendChild(fontfaceuri);
fontface.appendChild(fontfacesrc);
return this.defs.appendChild(fontface);
};&lt;/pre&gt;&lt;p&gt;A utiliser de la façon suivante dans votre code :&lt;/p&gt;
&lt;pre&gt;paper.registerSvgFont('pixelsplitter', '../fonts/pixelsplitter-bold-webfont.svg');&lt;/pre&gt;&lt;p&gt;createElementNS n'est pas compatible IE6 attention.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2010/07/02/Utiliser-des-fontes-SVG-avec-Raphaeljs#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2010/07/02/Utiliser-des-fontes-SVG-avec-Raphaeljs#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/268</wfw:commentRss>
      </item>
    
  <item>
    <title>Installer XHProf sous Ubuntu 9.10 et PHP5.3 (dotdeb)</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2010/06/16/Installer-XHProf-sous-Ubuntu-910-et-PHP53-dotdeb</link>
    <guid isPermaLink="false">urn:md5:57a98891a6f8e5f5813b990a9b55ee1d</guid>
    <pubDate>Wed, 16 Jun 2010 17:38:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;Si comme moi vous utilisez les dépôts dotdeb sur votre Ubuntu / Debian, l'installation de l'extension &lt;a href=&quot;http://mirror.facebook.net/facebook/xhprof/doc.html#installation&quot; hreflang=&quot;en&quot;&gt;XHProf&lt;/a&gt; peut s'avérer fastidieuse...&lt;/p&gt;
&lt;p&gt;Voici la procédure normale :&lt;/p&gt;
&lt;pre&gt;wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar xvfz xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension
phpize
./configure
make
sudo make install
sudo make test&lt;/pre&gt;
&lt;p&gt;On télécharge, on compile, on installe et on test. Si vous n'avez aucun soucis jusque là, GOOD FOR YOU. Vous pouvez modifier votre php.ini et jouer avec XHProf :&lt;/p&gt;
&lt;pre&gt;[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=(A REMPLIR)&lt;/pre&gt;&lt;p&gt;Maintenant si vous êtes comme moi, vous obtiendrez surement une erreur du style :&lt;/p&gt;
&lt;pre&gt;PHP Warning:  PHP Startup: xhprof: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match&lt;/pre&gt;&lt;p&gt;Normal ! Vous venez de compiler le module avec la mauvaise version de php5-dev (et donc de &lt;strong&gt;phpize&lt;/strong&gt;). Pour vérifier votre version, faite un phpize -v, si vous êtes en PHP 5.3 ça devrait être&amp;nbsp;20090626.&lt;br /&gt;Un petit tour dans apt-get nous apprend que php5-dev ne peux pas être mis à jour :&lt;/p&gt;
&lt;pre&gt;libtool (&amp;gt;= 2.2) mais 2.2.6a-4 devra être installé&lt;/pre&gt;
&lt;p&gt;Cette erreur ne veux pas dire grand chose, je ne l'ai toujours pas compris, mais il existe une solution ! Downgrader à la main &lt;strong&gt;libtool&lt;/strong&gt; et réinstaller le tout (car php5-dev est bien disponible chez dotdeb dans la version qui va bien) :&lt;/p&gt;
&lt;pre&gt;cd /tmp
wget http://fr.archive.ubuntu.com/ubuntu/pool/main/libt/libtool/libtool_1.5.26-1ubuntu1_i386.deb
sudo apt-get remove libtool
sudo dpkg -i libtool_1.5.26-1ubuntu1_i386.deb
sudo apt-get install php5-dev&lt;/pre&gt;
&lt;p&gt;Maintenant que vous avez la bonne version de php5-dev tout devrait rouler (vous pouvez&amp;nbsp;recommencer&amp;nbsp;depuis le début de ce post :P), et là j'ai eu le problème avec XHProf mais j'aurais pu avoir le même sur n'importe quel compilation de module.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2010/06/16/Installer-XHProf-sous-Ubuntu-910-et-PHP53-dotdeb#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2010/06/16/Installer-XHProf-sous-Ubuntu-910-et-PHP53-dotdeb#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/267</wfw:commentRss>
      </item>
    
  <item>
    <title>Petit test de Doctrine 2 beta 1</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2010/05/31/Petit-test-de-Doctrine-2</link>
    <guid isPermaLink="false">urn:md5:acacca723e36fa3ab4c84861aeee5a77</guid>
    <pubDate>Mon, 31 May 2010 14:44:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;&lt;em&gt;Tien, mais c'est vrai que j'ai un blog moi... Voici le copier / coller d'un billet écrit sur le &lt;a href=&quot;http://www.clever-age.com/veille/blog/quoi-de-neuf-dans-doctrine-2-.html&quot; hreflang=&quot;fr&quot;&gt;blog de Clever Age&lt;/a&gt; par mes petits doigts potelés. Bisou.&lt;/em&gt;&lt;/p&gt;
&lt;div dir=&quot;ltr&quot;&gt;&lt;strong&gt;Il y a environ 1 mois de cela, la première version&amp;nbsp;&lt;/strong&gt;&lt;a href=&quot;http://www.doctrine-project.org/blog/doctrine-2-0-0-beta1-released&quot;&gt;&lt;strong&gt;bêta de Doctrine 2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;nbsp;a été rendue publique, une petite prise en main rapide s’imposait&amp;nbsp;!&lt;/strong&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot;&gt;&lt;p&gt;&lt;em&gt;Je ne vais pas parler ici de l’intégration de Doctrine dans le framework MVC symfony, le plugin sfDoctrine2Plugin n’étant à l’heure actuelle pas testable en profondeur. Cet article porte donc sur Doctrine 2, l’ORM, uniquement.&lt;/em&gt;&lt;/p&gt;
&lt;dl&gt;&lt;dt&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/mai2010/doctrine_logo.png&quot; alt=&quot;&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;Logo de Doctrine, mai 2010&quot; /&gt;&lt;/dt&gt;&lt;/dl&gt;
&lt;h3&gt;Le schéma de description du modèle&lt;/h3&gt;
&lt;p&gt;Le classique schema.yml pour commencer, apporte son lot de nouveautés côté syntaxe. Il y a trois méthodes&amp;nbsp;: XML, Yaml et DocBlock (sous forme d’annotations PHP). À vous de configurer le bon Driver (&lt;code&gt;setMetadataDriverImpl()&lt;/code&gt;, dans votre configuration Doctrine), et donc de décrire votre modèle selon votre humeur&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;La méthode recommandée par Doctrine est celle des&amp;nbsp;&lt;strong&gt;annotations DocBlock&lt;/strong&gt;. Leur écriture n’est pas très sexy, mais elles peuvent être générée depuis les autres formats&amp;nbsp;:&lt;/p&gt;
&lt;div&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;namespace Entities;&lt;br /&gt;&lt;br /&gt;/** @Entity @Table(name=&quot;users&quot;) */&lt;br /&gt;class User&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp; &amp;nbsp; * @Id @Column(type=&quot;integer&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; * @GeneratedValue(strategy=&quot;AUTO&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp;private $id;&lt;br /&gt;&amp;nbsp; &amp;nbsp;/** @Column(type=&quot;string&quot;, length=50) */&lt;br /&gt;&amp;nbsp; &amp;nbsp;private $name;&lt;br /&gt;&amp;nbsp; &amp;nbsp;/**&lt;br /&gt;&amp;nbsp; &amp;nbsp; * @OneToOne(targetEntity=&quot;Address&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; * @JoinColumn(name=&quot;address_id&quot;, referencedColumnName=&quot;id&quot;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp;private $address;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;La&amp;nbsp;&lt;strong&gt;notation XML&lt;/strong&gt;&amp;nbsp;(si vous utilisez un IDE XML-friendly, vous aurez l’auto-complétion pour toutes les balises et attributs)&amp;nbsp;:&lt;/p&gt;
&lt;div&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;doctrine-mapping xmlns=&quot;http://doctrine-project.org/schemas/orm/doctrine-mapping&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;xsi:schemaLocation=&quot;http://doctrine-project.org/schemas/orm/doctrine-mapping&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;entity name=&quot;Entities\User&quot; table=&quot;users&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;id name=&quot;id&quot; type=&quot;integer&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;generator strategy=&quot;AUTO&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;field name=&quot;name&quot; type=&quot;string&quot; length=&quot;50&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;one-to-one field=&quot;address&quot; target-entity=&quot;Address&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;join-column name=&quot;address_id&quot; referenced-column-name=&quot;id&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/one-to-one&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/entity&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/doctrine-mapping&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;et, à l’ancienne, en&amp;nbsp;&lt;strong&gt;Yaml&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;
&lt;div&gt;&lt;code&gt;Entities\User:&lt;br /&gt;&amp;nbsp;type: entity&lt;br /&gt;&amp;nbsp;table: users&lt;br /&gt;&amp;nbsp;id:&lt;br /&gt;&amp;nbsp; &amp;nbsp;id:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;type: integer&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;generator:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strategy: AUTO&lt;br /&gt;&amp;nbsp;fields:&lt;br /&gt;&amp;nbsp; &amp;nbsp;name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;type: string&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;length: 50&lt;br /&gt;&amp;nbsp;oneToOne:&lt;br /&gt;&amp;nbsp; &amp;nbsp;address:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;targetEntity: Address&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;joinColumn:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name: address_id&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;referencedColumnName: id&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Vous noterez que la syntaxe est légèrement différente sur le format Yaml, mais pas de panique, la migration de vos projet de Doctrine 1 à Doctrine 2 est prévue, et on a donc une task&amp;nbsp;&lt;strong&gt;./doctrine orm:convert-d1-schema&lt;/strong&gt;&amp;nbsp;qui se charge de la conversion.&lt;/p&gt;
&lt;h3&gt;Les Entities et le EntityManager&lt;/h3&gt;
&lt;p&gt;Comme vous pouvez le voir dans la première méthode, la classe User que j’ai définie est une Entity&amp;nbsp;! C’est cette classe que je vais manipuler, et elle est vide. Pas de getter, pas de setter, pas de save(), elle n’étend rien...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/mai2010/Capture-Generate_Getters_and_Setters.png&quot; alt=&quot;&quot; style=&quot;float: left; margin-top: 0; margin-right: 1em; margin-bottom: 1em; margin-left: 0; &quot; title=&quot;Getters et Setters, mai 2010&quot; /&gt;C’est un des intérêts de Doctrine 2, tuer la magie (et ainsi améliorer les performances), c’est à vous d’écrire ce dont vous avez besoin, de façon explicite et ainsi plus simple à débugger.&lt;/p&gt;
&lt;p&gt;À savoir que la majorité des IDE permettent de générer les getters/ setters de vos propriétés automatiquement.&amp;nbsp;&lt;br /&gt;Sachez qu’il existe aussi une classe nommée&amp;nbsp;&lt;strong&gt;ActiveEntity&lt;/strong&gt;que vous trouverez dans le namespace DoctrineExtensions, qui implémente sur les Entities qui l’étendent les getters / setters magique, le save(), le ArrayAccess, le toArray()... mais il n’est pas recommandé de l’utiliser (ce n’est pas &quot;la façon de faire&quot; en Doctrine 2).&lt;/p&gt;
&lt;p&gt;Pour chaque connexion à votre base de donnée, vous avez un EntityManager.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$em = EntityManager::create($connectionOptions, $config);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;C’est cette classe qui permet de récupérer et de sauver nos Entities. Ainsi pour créer un User dans ma base, je procède de cette façon&amp;nbsp;:&lt;/p&gt;
&lt;div&gt;&lt;code&gt;$user = new \Entities\User();&lt;br /&gt;$user-&amp;gt;setName('Damien');&lt;br /&gt;$em-&amp;gt;persist($user);&lt;br /&gt;$em-&amp;gt;flush();&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;On donne des Entities à notre EntityManager (via la méthode&amp;nbsp;&lt;strong&gt;persist()&lt;/strong&gt;), et quand on souhaite mettre à jour la base de donnée, on&amp;nbsp;&lt;strong&gt;flush()&lt;/strong&gt;. Doctrine abandonne donc le&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Active_record_pattern&quot;&gt;pattern Active record&lt;/a&gt;&amp;nbsp;au profit d’une approche de Data Mapping (qui profite de&amp;nbsp;&lt;a href=&quot;http://www.php.net/manual/en/intro.reflection.php&quot;&gt;Reflection&lt;/a&gt;, introduit en PHP 5.3)&amp;nbsp;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;because we think it hurts testability, project maintainability and is not a suitable abstraction (80/20) for models that exceed the complexity of a blog or otherwise simple web application&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Côté requête, la magie des findBy* est toujours de la partie&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$user = $em-&amp;gt;getRepository('Entities\User')-&amp;gt;findOneByName('romanb');&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;(À noter que le&amp;nbsp;&lt;strong&gt;Repository&lt;/strong&gt;&amp;nbsp;est commun à toutes les Entities par défaut, il est ensuite possible d’en créer des spécifique pour chaque Entity, et ainsi d’avoir des classes de type &quot;UserTable&quot; comme dans Doctrine 1).&lt;/p&gt;
&lt;p&gt;La construction d’une requête plus complexe (avec des jointures par exemple) demandera de faire appel au&amp;nbsp;&lt;acronym title=&quot;Doctrine Query Language&quot;&gt;DQL&lt;/acronym&gt;. C’est la méthode la plus puissante et la plus flexible pour récupérer des objets depuis la base de données. Il permet d’interroger la base dans un langage objet, avec nos noms de classes, nos champs, nos héritages et associations sans nous soucier du nom des champs effectivement en base. Il est très similaire au SQL, mais ce n’est PAS du SQL&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$em-&amp;gt;createQuery('SELECT COUNT(a.id) FROM Entities\User u LEFT JOIN u.articles a WHERE u.username = ?1 GROUP BY u.id');&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le DQL de Doctrine 2 est très proche de ce qu’on faisait déjà avec Doctrine 1, avec quelques améliorations, comme par exemple la possibilité d’étendre le langage avec des&amp;nbsp;&lt;a href=&quot;http://www.doctrine-project.org/blog/doctrine2-custom-dql-udfs&quot;&gt;fonctions non native&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Essayer Doctrine 2&lt;/h3&gt;
&lt;p&gt;À l’heure où j’écris ces lignes, la sandbox de Doctrine 2 beta 1 ne fonctionne pas très bien. La meilleure solution pour jouer avec Doctrine 2 est de télécharger les sources depuis le&amp;nbsp;&lt;a href=&quot;http://github.com/doctrine/doctrine2&quot;&gt;dépôt GitHub&lt;/a&gt;&amp;nbsp;et de résoudre les dépendances comme&amp;nbsp;&lt;a href=&quot;http://wiki.github.com/doctrine/doctrine2/project-dependencies&quot;&gt;expliqué ici&lt;/a&gt;. Un package entièrement prêt à l’emploi pour la sandbox est en cours de préparation. Il y a aussi un petit&amp;nbsp;&lt;a href=&quot;http://www.doctrine-project.org/projects/orm/2.0/docs/reference/introduction/en#sandbox-quickstart&quot;&gt;quick-start dans la documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous souhaiter utiliser Mysql, modifiez les options comme ci-dessous dans index.php et cli-config.php&amp;nbsp;:&lt;/p&gt;
&lt;div&gt;&lt;code&gt;$connectionOptions = array(&lt;br /&gt;&amp;nbsp; &amp;nbsp;'driver' =&amp;gt; 'pdo_mysql',&lt;br /&gt;&amp;nbsp; &amp;nbsp;'user' =&amp;gt; 'login',&lt;br /&gt;&amp;nbsp; &amp;nbsp;'password' =&amp;gt; 'pass',&lt;br /&gt;&amp;nbsp; &amp;nbsp;'dbname' =&amp;gt; 'dbname'&lt;br /&gt;);&lt;/code&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://www.doctrine-project.org/projects/orm/2.0/docs/en&quot;&gt;La documentation&lt;/a&gt;&amp;nbsp;est très bien avancée, elle couvre déjà de nombreux domaines et c’est, pour l’instant, une des seules ressource viable.&lt;/p&gt;
&lt;p&gt;Pour finir, en l’état le plugin&amp;nbsp;&lt;strong&gt;sfDoctrine2Plugin&lt;/strong&gt;&amp;nbsp;(qui permet d’utiliser Doctrine 2 dans symfony 1, avec admin-generator, etc) n’est pas fonctionnel actuellement et il faudra encore attendre un peu avant de pouvoir l’utiliser entièrement.&lt;/p&gt;
&lt;/div&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2010/05/31/Petit-test-de-Doctrine-2#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2010/05/31/Petit-test-de-Doctrine-2#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/266</wfw:commentRss>
      </item>
    
  <item>
    <title>Convertir une fonte TrueType ou OpenType en EOT Embedded OpenType sous Ubuntu Linux</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/11/01/Convertir-une-fonte-TrueType-ou-OpenType-en-EOT-Embedded-OpenType-sous-Ubuntu-Linux</link>
    <guid isPermaLink="false">urn:md5:da988681dcbd7ab9908e74cc7ad27717</guid>
    <pubDate>Sun, 01 Nov 2009 18:18:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;Un titre à ralonge pour un petit tuto rapide qui va vous permettre de convertir vos polices de caractères OpenType (.otf) ou TrueType (.ttf) en Embedded OpenType (.eot), un format propre à Microsoft, utilisé dans Internet Explorer depuis Ubuntu Linux (je dis Ubuntu mais ça devrait fonctionner sur n'importe quel unix).&lt;/p&gt;
&lt;p&gt;EOT est le seul format de police accepté par Internet Explorer, il va donc falloir convertir les polices que je souhaite utiliser avec @font-face pour assurer la compatibilité. Microsoft propose un outil pour faire ça (&lt;a href=&quot;http://www.microsoft.com/typography/web/embedding/weft3/download.aspx&quot; hreflang=&quot;en&quot;&gt;WEFT&lt;/a&gt;), mais il est mal fichu et ne tourne pas sous Wine (testé avec Wine 1.0.1 sous Ubuntu 9.10). On va donc se débrouiller autrement !&lt;/p&gt;
&lt;h2&gt;Let me introduce &lt;a href=&quot;http://code.google.com/p/ttf2eot/&quot; hreflang=&quot;en&quot;&gt;ttf2eot&lt;/a&gt; !&lt;/h2&gt;
&lt;p&gt;Il s'agit simplement d'un utilitaire en ligne de commande pour&amp;nbsp;OpenTypeUtilities.cpp (une classe qui à la base vient de Chromium, le projet Open Source dont Google Chrome est issu). On télécharge donc les sources, et on fait un petit &quot;make&quot; dans le répertoire :&lt;/p&gt;
&lt;pre&gt;~/Bureau/ttf2eot-0.0.2-2$ make&lt;/pre&gt;
&lt;p&gt;Si tout se passe bien le binaire ttf2eot à été compilé (si ça foire, posez vous la question : est-ce que g++ est installé sur mon système ?).&lt;/p&gt;
&lt;p&gt;Comme son nom l'indique, on a plus qu'a lui passer un ttf pour qu'il nous génére le eot correspondant :&lt;/p&gt;
&lt;pre&gt;~/Bureau/ttf2eot-0.0.2-2$ ./ttf2eot &amp;lt; ../delicious-123/Delicious-Roman.ttf &amp;gt; ../delicious-123/Delicious-Roman.eot&lt;/pre&gt;
&lt;p&gt;Deux paramètre : le fichier d'entrée, et de destination :&lt;br /&gt;$ ./ttf2eot &amp;lt; &lt;strong&gt;input&lt;/strong&gt;.ttf &amp;gt; &lt;strong&gt;output&lt;/strong&gt;.eot&lt;br /&gt;That's all !&lt;/p&gt;
&lt;h2&gt;Convertir un fichier OpenType&lt;/h2&gt;
&lt;p&gt;C'est bien beau mais si notre police de caractère n'est pas en TrueType, ttf2eot ne sert à rien. Il n'existe pas d'équivalent pour OpenType, mais il est possible de convertir une fonte OpenType en TrueType. Voici la marche à suivre. On va avoir besoin de &lt;strong&gt;fontforge&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;$ sudo apt-get install fontforge&lt;/pre&gt;
&lt;p&gt;Ensuite on écrit un petit script shell qui nous évitera de passer par l'affreuse interface de fontforge (à sauver en &lt;strong&gt;otf2ttf.sh&lt;/strong&gt; par exemple) :&lt;/p&gt;
&lt;pre&gt;#!/usr/local/bin/fontforge
# Quick and dirty hack: converts a font to truetype (.ttf)
Print(&quot;Opening &quot;+$1);
Open($1);
Print(&quot;Saving &quot;+$1:r+&quot;.ttf&quot;);
Generate($1:r+&quot;.ttf&quot;);
Quit(0);&lt;/pre&gt;
&lt;p&gt;(Petit script &lt;a href=&quot;http://www.stuermer.ch/blog/convert-otf-to-ttf-font-on-ubuntu.html&quot; hreflang=&quot;en&quot;&gt;récupéré ici, merci &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;On s'en sert donc pour convertir notre fichier otf en ttf (et ensuite, on utilise ttf2eot pour enfin obtenir le fichier eot !) :&lt;/p&gt;
&lt;pre&gt;$ fontforge -script otf2ttf.sh&amp;nbsp;../delicious-123/Delicious-Roman.otf&lt;/pre&gt;&lt;h2&gt;Utilisation de @font-face&lt;/h2&gt;
&lt;p&gt;Si vous vous intéressez à eot c'est que vous allez utiliser @font-face (grillé !), mais savez-vous comment l'utiliser proprement ?&lt;/p&gt;
&lt;pre&gt;@font-face {
font-family:'Delicious';
src: url('Delicious-Roman.eot');
src: local('Delicious Roman'), local('Delicious'),
url('Delicious-Roman.otf') format('opentype');
}&lt;/pre&gt;
&lt;p&gt;Pour les explications, veuillez vous référer &lt;a href=&quot;http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/&quot; hreflang=&quot;en&quot;&gt;au billet de Paul Irish&lt;/a&gt;, qui est à l'origine de cette solution (qui en gros permet en une seule fois de déclarer une police pour tous les navigateur, sans requête HTTP superflue).&lt;/p&gt;
&lt;p&gt;Quelques liens :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://webfonts.info/wiki/index.php?title=@font-face_browser_support&quot; hreflang=&quot;en&quot;&gt;compatibilité de @font-face&lt;/a&gt; (on y voit que Google Chrome n'active pas Web Font par défaut)&lt;/li&gt;
&lt;li&gt;la police pour laquelle je me suis penché sur le sujet, &lt;a href=&quot;http://www.josbuivenga.demon.nl/delicious.html&quot; hreflang=&quot;en&quot;&gt;Delicious&lt;/a&gt; (ces conditions d'utilisations autorise @font-face)&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/11/01/Convertir-une-fonte-TrueType-ou-OpenType-en-EOT-Embedded-OpenType-sous-Ubuntu-Linux#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/11/01/Convertir-une-fonte-TrueType-ou-OpenType-en-EOT-Embedded-OpenType-sous-Ubuntu-Linux#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/265</wfw:commentRss>
      </item>
    
  <item>
    <title>Ubuntu 9.10 et Gnome Shell</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/10/31/Ubuntu-910-et-Gnome-Shell</link>
    <guid isPermaLink="false">urn:md5:e6a7dec40cf24fc5694a554c5c6bede9</guid>
    <pubDate>Sat, 31 Oct 2009 15:16:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>Linux</category>
            
    <description>    &lt;p&gt;J'ai passé cette nuit mon PC fixe de Ubuntu 9.04 à Ubuntu 9.10 (Karmic Koala), aucun problème majeur à signaler pour une fois :-)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;L'ensemble du système est toujours stable et mes applications ont survécus. Seulement je suis toujours déçu, et ce depuis quelques années maintenant, par l'aspect graphique général d'Ubuntu. On a enfin un boot graphique, mais il manque encore quelque chose. Et j'ai trouvé mon bonheur par hasard &lt;a href=&quot;http://blog.thesilentnumber.me/2009/09/top-things-to-do-after-installing.html&quot; hreflang=&quot;en&quot;&gt;dans ce billet&lt;/a&gt; : &lt;strong&gt;Gnome Shell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Gnome Shell est le remplaçant de&amp;nbsp;gnome-panel et du window manager metacity prévu pour Gnome 3.0 (qui lui-même sera inclut dans Ubuntu 10.10 ! On a le temps (c'est dans un an)).&lt;/p&gt;
&lt;p&gt;Il s'agit de remplacer toute l'interface utilisateur de Gnome (le menu / barre des tâche, bureau, etc) par quelque chose de beaucoup plus pratique ! C'est en tout cas l'effet que produit gnome-shell chez moi, j'ai le sentiment d'être dans un environnement beaucoup plus cool que le précédent : alors oui d'une part c'est le côté bling bling qui saute aux yeux, mais après quelques heures d'utilisation on se rend compte qu'on est vraiment aidé par cette nouvelle interface.&lt;/p&gt;
&lt;p&gt;Suffisement parlé, place à une vidéo :&lt;/p&gt;

&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/8FXSMxVyiGo&amp;hl=fr_FR&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/8FXSMxVyiGo&amp;hl=fr_FR&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;Pour l'installer sur votre 9.10, faite un petit apt-get du paquet&amp;nbsp;&lt;strong&gt;gnome-shell&lt;/strong&gt;, pour le lancer, il suffit de l'appeler dans un terminal :&lt;/p&gt;
&lt;pre&gt;gnome-shell --replace&lt;/pre&gt;
&lt;p&gt;Il va donc remplacer gnome-panel et metacity sans redémarrer la session. Ceci n'est pas permanent (gnome-shell est encore en cours de développement, bien que parfaitement stable) et donc il suffit de faire la manipulation inverse pour revenir à votre gestionnaire de fenêtre initiale :&lt;/p&gt;
&lt;pre&gt;metacity --replace
gnome-panel&lt;/pre&gt;
&lt;p&gt;Enjoy (&lt;a href=&quot;http://live.gnome.org/GnomeShell&quot; hreflang=&quot;en&quot;&gt;site officiel&lt;/a&gt;).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/10/31/Ubuntu-910-et-Gnome-Shell#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/10/31/Ubuntu-910-et-Gnome-Shell#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/264</wfw:commentRss>
      </item>
    
  <item>
    <title>Les sorties musicales du moment</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/10/25/Les-sorties-musicales-du-moment</link>
    <guid isPermaLink="false">urn:md5:2d893f5fb07d6de706d810827cff1950</guid>
    <pubDate>Sun, 25 Oct 2009 22:05:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>Musique</category>
            
    <description>    &lt;p&gt;Ce n'est pas parce qu'Hadopi 2 est passé qu'on doit s'empêcher d'écouter ce qu'on aime. Et ça tombe bien la période post-rentrée est pleine de sorties intéressantes :&lt;/p&gt;
&lt;h3&gt;Air - Love 2&lt;/h3&gt;
&lt;p&gt;Sortie au début du mois, le nouvel opus des deux Frenchies sonne comme un bol d'air frais (je sors -&amp;gt;[]). Je dis air frais, mais les influences sixties et seventies sont clairement affichés (&lt;em&gt;Eat my beat&lt;/em&gt;) et c'est pas pour me déplaire. L'album est comme d'habitude planant, relaxant. Les mélodies, la production léchée, le son cristallin et la voix féminine sont toujours présents. Enregistré dans les nouveaux studios du groupe à Paris (vers Belleville \o/) ça ne les as pas empêché de sortir l'opus une semaine avant au Japon, pays dans lequel le groupe est une divinité (si si, les écolières tag leurs trousses au tipex, colle des écussons sur leurs sacs et se coiffent comme Nicolas Godin). &lt;a href=&quot;http://open.spotify.com/album/5RZAH4Rn0G0DuKFvwbKJkP&quot;&gt;Love 2 sur Spotify&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Massive Attack -&amp;nbsp;Splitting the Atom&lt;/h3&gt;
&lt;p&gt;Massive Attack nous fait patienter avec un EP uniquement disponible en download et vinyl. Composé de 4 titres dont deux remix, ce nouvel opus est donc un avant gout de ce qui nous attends avec Weather Underground : leur véritable nouvel album qui a été repoussé à février 2010.&lt;/p&gt;
&lt;p&gt;Les Anglais ont prévu 8 dates en France en ce mois de novembre, pour ma part je les vois le 11 au Zenith de Paris &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; (avec&amp;nbsp;Martina Topley Bird en première partie en plus !). &lt;a href=&quot;http://open.spotify.com/album/4lBpAlKcllrmSOn0SidPdg&quot;&gt;Splitting the Atom sur Spotify&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Foo Fighters - Greatest Hits&lt;/h3&gt;
&lt;p&gt;Le groupe de Dave Grohl fête ses presque 15 ans d'existence avec son premier Greatest Hits (sortie le 3 novembre). On y retrouve donc tous leurs &quot;tubes&quot;, sauf (et ça me fait bien rager) &lt;em&gt;Let it die&lt;/em&gt; ! Pauvre de moi. Bon je crois que leur discographie est bien trop riche pour me contenter simplement d'une sélection. Il n'empêche que ce best of est dispo en vinyl... alors j'ai craqué &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;La tracklist :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All My Life&lt;/li&gt;
&lt;li&gt;Best Of You&lt;/li&gt;
&lt;li&gt;Everlong&lt;/li&gt;
&lt;li&gt;The Pretender&lt;/li&gt;
&lt;li&gt;My Hero&lt;/li&gt;
&lt;li&gt;Learn To Fly&lt;/li&gt;
&lt;li&gt;Times Like These&lt;/li&gt;
&lt;li&gt;Monkey wrench&lt;/li&gt;
&lt;li&gt;Big Me&lt;/li&gt;
&lt;li&gt;Breakout&lt;/li&gt;
&lt;li&gt;Long Road To Ruin&lt;/li&gt;
&lt;li&gt;This is a Call&lt;/li&gt;
&lt;li&gt;Skin and Bones&lt;/li&gt;
&lt;li&gt;Wheels&lt;/li&gt;
&lt;li&gt;Word Forward&lt;/li&gt;
&lt;li&gt;Everlong (acoustic)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je vous ai fait une &lt;a href=&quot;http://open.spotify.com/user/mobman02/playlist/6GWVylCKrD0WGvlaRlqe9o&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: none;&quot;&gt;playlist sur Spotify avec ces quelques titres&lt;/span&gt;&lt;/a&gt;. &lt;em&gt;Wheels &lt;/em&gt;(sortie en single et ayant &lt;a href=&quot;http://www.youtube.com/watch?v=jLdmTyE4_sA&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: none;&quot;&gt;un clip&lt;/span&gt;&lt;/a&gt;) et &lt;em&gt;Word Forward&lt;/em&gt; sont deux nouveaux titres enregistré exclusivement pour ce Greatest Hits (il ne s'agit donc pas de deux titres &quot;cultes&quot; du groupe).&lt;/p&gt;
&lt;h3&gt;Them Crooked Vultures - éponyme&lt;/h3&gt;
&lt;p&gt;Yeah ! Le super groupe de Josh Homme (le mec derrière les Desert Sessions et Queens of the stone age, deux monuments très important de ma bibliothèque musicale), Dave Grohl (batteur de Nirvana puis leader des Foo Fighters, il est aussi batteur sur &quot;Songs for the deaf&quot;, LE meilleur album des QOTSA) et John Paul Jones (bassiste de Led Zep) sort donc son premier album le 17 novembre, avec un single (New Fang) qui sort normalement demain. Pour les avoir vu en live à Rock En Seine cet été, je peux juste dire que ça déchire sévère &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; Je ne suis pas du tout objectif mais, on parle de rock là !!&lt;/p&gt;
&lt;p&gt;Pour écouter ce que ça donne, à part youtube il n'y a rien pour l'instant.&lt;/p&gt;
&lt;p&gt;EDIT : le premier single de Them Crooked Vultures :&amp;nbsp;&lt;a href=&quot;http://twt.fm/315221&quot;&gt;http://twt.fm/315221&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Voilà c'est pas la première fois que je parle de musique sur ce blog, là il me paraissait important de parler de ces 4 sorties, je sais pas si ça en vaut la peine mais j'ai du coup ouvert une nouvelle catégorie. Peut être un moyen de faire revivre ce blog !&lt;/em&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/10/25/Les-sorties-musicales-du-moment#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/10/25/Les-sorties-musicales-du-moment#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/263</wfw:commentRss>
      </item>
    
  <item>
    <title>Mettre en place sfWidgetFormTextareaTinyMCE, symfony 1.2</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/09/14/Mettre-en-place-sfWidgetFormTextareaTinyMCE-symfony-12</link>
    <guid isPermaLink="false">urn:md5:22e30aa1d7e2ef7afb1d5aa81a9bd8cc</guid>
    <pubDate>Mon, 14 Sep 2009 10:45:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;Hey les gens, j'en vois &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.lexik.fr/sfblog/symfony/sfformextraplugin-tinymce-197&quot;&gt;de belles&lt;/a&gt; à propos de TinyMCE sous symfony 1.2 !&lt;/p&gt;
&lt;p&gt;Non il n'y a aucun besoin de modifier le plugin sfFormExtra pour avoir un éditeur WYSIWYG sous symfony ! La marche à suivre est on ne peu plus simple (mais absolument pas documenté je vous l'accorde, &lt;a hreflang=&quot;en&quot; href=&quot;http://www.symfony-project.org/blog/2008/10/18/spice-up-your-forms-with-some-nice-widgets-and-validators&quot;&gt;ça manque&lt;/a&gt;).&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Installer le plugin : &lt;strong&gt;./symfony plugin:install sfFormExtraPlugin&lt;/strong&gt; (un &lt;em&gt;./symfony plugin:publish-assets&lt;/em&gt; et un &lt;em&gt;./symfony cc&lt;/em&gt; sont aussi conseillés)&lt;/li&gt;
&lt;li&gt;Télécharger &lt;a hreflang=&quot;en&quot; href=&quot;http://tinymce.moxiecode.com/download.php&quot;&gt;TinyMCE&lt;/a&gt;, déplacer le répertoire tiny_mce dans &lt;strong&gt;web/js/&lt;/strong&gt; (c'est une dépendance externe qui n'est pas incluse dans sfFormExtra)&lt;/li&gt;
&lt;li&gt;Déclarer l'utilisation du widget &lt;em&gt;sfWidgetFormTextareaTinyMCE&lt;/em&gt; dans le configure() de votre classeForm :
&lt;pre&gt;$this-&amp;gt;widgetSchema['content'] = new sfWidgetFormTextareaTinyMCE(array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'width'=&amp;gt;950,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'height'=&amp;gt;350,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ));&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Et enfin, ajouter le javascript &lt;strong&gt;js/tiny_mce/tiny_mce.js&lt;/strong&gt; à la réponse, dans le &lt;em&gt;view.yml&lt;/em&gt;, ou un appel à &lt;pre&gt;sfContext::getInstance()-&amp;gt;getResponse()-&amp;gt;addJavascript(sfConfig::get('sf_rich_text_js_dir').'/tiny_mce.js');&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's all.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/09/14/Mettre-en-place-sfWidgetFormTextareaTinyMCE-symfony-12#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/09/14/Mettre-en-place-sfWidgetFormTextareaTinyMCE-symfony-12#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/262</wfw:commentRss>
      </item>
    
  <item>
    <title>Fin des vacances</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/08/31/Fin-des-vacances</link>
    <guid isPermaLink="false">urn:md5:addb0cc031f3e67ea7ad9715bf2f1c6a</guid>
    <pubDate>Mon, 31 Aug 2009 23:34:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>3615 MaVie</category>
            
    <description>    &lt;p&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/aout2009/.DSCN0670_m.jpg&quot; alt=&quot;&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;Sziget et Rock en Seine 2009, aoû 2009&quot; /&gt;C'était un bon mois d'août, retour aux choses sérieuses.&amp;nbsp;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/08/31/Fin-des-vacances#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/08/31/Fin-des-vacances#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/261</wfw:commentRss>
      </item>
    
  <item>
    <title>jQuery, éviter la soumission multiple d'un formulaire</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/08/02/jQuery-eviter-la-soumission-multiple-d-un-formulaire</link>
    <guid isPermaLink="false">urn:md5:77dc4c9401203c49562ab479ea77695d</guid>
    <pubDate>Sun, 02 Aug 2009 12:17:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;Le morceau de code qui suit permet d'éviter la soumission multiple d'un formulaire en désactivant l'event submit d'un formulaire et en mettant les input submit en disabled dès la première soumission effectuée.&lt;/p&gt;
&lt;p&gt;J'ai été incapable de trouver quelque chose de correct, il existe même des plugins jQuery pour faire ça mais ils sont mauvais et inefficace (oui, on peux soumettre un formulaire autrement que par un click! sur un input:submit...). Donc voilà je publie mon code, il sera peut être utile à toi, visiteur de l'internet mondial :&lt;/p&gt;
&lt;pre&gt;$(document).ready(function() {&lt;br /&gt;  $('form').submit(function() {&lt;br /&gt;    if(typeof jQuery.data(this, &quot;disabledOnSubmit&quot;) == 'undefined') {&lt;br /&gt;      jQuery.data(this, &quot;disabledOnSubmit&quot;, { submited: true });&lt;br /&gt;      $('input[type=submit], input[type=button]', this).each(function() {&lt;br /&gt;        $(this).attr(&quot;disabled&quot;, &quot;disabled&quot;);&lt;br /&gt;      });&lt;br /&gt;      return true;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      return false;&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;});&lt;/pre&gt;
&lt;p&gt;Il s'agit en même temps d'un bon exemple d'utilisation de jQuery.data &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PS : peux poser des problèmes avec les solution d'autocomplete pour jquery :/&lt;/p&gt;
&lt;p&gt;PPS : non ce blog n'est pas mort, il survit.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/08/02/jQuery-eviter-la-soumission-multiple-d-un-formulaire#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/08/02/jQuery-eviter-la-soumission-multiple-d-un-formulaire#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/258</wfw:commentRss>
      </item>
    
  <item>
    <title>Retour du Symfony Live 09</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/06/15/Retour-du-Symfony-Live-09</link>
    <guid isPermaLink="false">urn:md5:cbdbbd030e8dae41f5ffab8120cceb45</guid>
    <pubDate>Mon, 15 Jun 2009 00:57:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;J'étais jeudi et vendredi dernier au &lt;a href=&quot;http://www.symfony-live.com/&quot; hreflang=&quot;fr&quot;&gt;Symfony Live 2009&lt;/a&gt;, petit retour rapide sur ce qui m'a plu, les choses que je retiens et le futur de symfony :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/n1k0/3619061341/&quot; title=&quot;Second Day - Symfony Live '09 de Nicolas Perriault, sur Flickr&quot;&gt;&lt;img width=&quot;450&quot; src=&quot;http://farm4.static.flickr.com/3402/3619061341_759b96e36d.jpg&quot; height=&quot;300&quot; alt=&quot;Second Day - Symfony Live '09&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Où est charlie ? ^^&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;- J'ai vu Fabien P. en vrai WOW&lt;/p&gt;
&lt;p&gt;- Doctrine c'est le futur (et Propel ne sera plus supporté par Sensio pour Symfony 2)&lt;/p&gt;
&lt;p&gt;- Toujours pas de solution cool pour gérer les javascripts entre ceux de l'application, ceux des plugins... (&lt;a href=&quot;http://dynamics.dakrazy.net/media/bonnes-pratiques-de-developpement-javascript.pdf&quot; hreflang=&quot;fr&quot;&gt;les deux solutions présentés&lt;/a&gt;&amp;nbsp;(pdf) me plaisent pas, pas envie de créer des fichiers de config en XML pour utiliser tel ou tel javascript).&lt;/p&gt;
&lt;p&gt;- PHPEdit (un IDE Français orienté PHP) propose une version &quot;symfony ready&quot;, avec de bonnes idées ! Mais c'est payant et Windows only : on va attendre Netbeans 7 (qui supportera aussi de façon avancée notre framework préféré). Pour ce qui est d'Eclipse... no comment.&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://www.sympalphp.org/&quot; hreflang=&quot;en&quot;&gt;sympal&lt;/a&gt; c'est juste énorme... Très impressioné par ce que j'ai vu &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; Drupal n'a qu'à bien se tenir ^^ Couplé au &lt;a href=&quot;http://www.symfony-live.com/pdf/sflive09fr/symfony-live-2009-gerer-des-medias-xavier-lacot-clever-age.pdf&quot; hreflang=&quot;fr&quot;&gt;gestionnaire de média&lt;/a&gt;&amp;nbsp;(pdf) de Xavier Lacot j'en parle même pas !&lt;/p&gt;
&lt;p&gt;- Fabrice Bernhard nous prépare de bonnes choses concernant &lt;a href=&quot;http://www.symfony-live.com/pdf/sflive09fr/symfony-live-sfGuardUser.pdf&quot; hreflang=&quot;fr&quot;&gt;l'intégration de Facebook dans nos applications symfony&lt;/a&gt;&amp;nbsp;(pdf) (connexion, création d'application...), conférences intéressantes (ne m'étant pas vraiment encore penché sur le sujet), un plugin à venir (sfFacebookConnect, qui interface sfGuard, la classe).&lt;/p&gt;
&lt;p&gt;- A voir, &lt;a href=&quot;http://www.symfony-live.com/pdf/sflive09fr/generation-de-tests-fonctionnels.pdf&quot; hreflang=&quot;fr&quot;&gt;un générateur de test fonctionnel&lt;/a&gt; ! L'idée est superbe, la réalisation aussi.&lt;/p&gt;
&lt;p&gt;- Une action dans votre contrôleur ne devrait jamais faire plus de 10 lignes&lt;/p&gt;
&lt;p&gt;- Il faut bien dormir entre les deux jours de conférences (le vendredi matin était pas facile :x)&lt;/p&gt;
&lt;p&gt;- Merci pour le tee-shirt &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; (quoi que je l'ai payé en fait :x)&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://www.eyrolles.com/Informatique/Livre/symfony-9782212124941&quot; hreflang=&quot;fr&quot;&gt;eyrolles&lt;/a&gt; va éditer un vrai livre en Français sur symfony \o/&lt;/p&gt;
&lt;p&gt;- 600 plugins ! Combien sont vraiment utiles / utilisable dans le tas ?&lt;/p&gt;
&lt;p&gt;- Les preExecute pas bien (pas explicite)&lt;/p&gt;
&lt;p&gt;- Découverte du paramétre app:enable/disable &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;- Que de MAC dans la salle !&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Voilà c'était bien, instructif, correctement organisé et dans un cadre sympa, 10/10.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/06/15/Retour-du-Symfony-Live-09#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/06/15/Retour-du-Symfony-Live-09#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/259</wfw:commentRss>
      </item>
    
  <item>
    <title>Back to black vinyl</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/04/10/Back-to-black-vinyl</link>
    <guid isPermaLink="false">urn:md5:39658b170862abca267e67c6e8a9d7ff</guid>
    <pubDate>Fri, 10 Apr 2009 00:42:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>Musique</category>
            
    <description>    &lt;p&gt;Alors qu'on est en plein débat (et &lt;a href=&quot;http://www.laquadrature.net/fr/hadopi-rejetee-a-lassemblee&quot; hreflang=&quot;fr&quot;&gt;dégustation de champomy&lt;/a&gt;) à propos d'Hadopi et des méchantes maisons de disques qui ne se font pas à l'idée que leur modèle économique doit évoluer,&lt;br /&gt;je me suis retrouvé nez à nez avec une bonne initiative de la part d'Universal.&lt;/p&gt;
&lt;p&gt;Ca s'apelle &lt;a href=&quot;http://www.backtoblackvinyl.com/&quot; hreflang=&quot;en&quot;&gt;Back To Black Vinyl&lt;/a&gt;, et c'est simplement une sous marque pour vendre des LP réédités. Outre le fait que vendre des best-seller en microsillon neuf est une superbe idée (parce que oui en 1991 j'en avais rien à foutre de Nirvana), le disque est livré avec un code top secret de la mort.&lt;/p&gt;
&lt;p&gt;Ce code sert à télécharger l'album en MP3, gratos, téléchargement unique, bonne qualité, mais sans les fritures ^^ Et j'ai bien cherché, aucune trace de DRM ou d'info personnelles cachées dans le fichier non plus. Je suis conquis \o/&lt;/p&gt;
&lt;p&gt;A savoir que le disque vinyle a quelques 60 années, et est encore très utilisé, que ça soit par les audiophiles / obsédés du son / groupies (moi) ou par &lt;a href=&quot;http://ternel.net/&quot; hreflang=&quot;fr&quot;&gt;les plus grand&amp;nbsp;disc-jockeys&lt;/a&gt; du monde. Vive l'analogique (non, cay pas sale).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/04/10/Back-to-black-vinyl#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/04/10/Back-to-black-vinyl#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/257</wfw:commentRss>
      </item>
    
  <item>
    <title>Snippet : Propel dans un test unitaire (Symfony 1.0)</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/02/27/Snippet-%3A-Propel-dans-un-test-unitaire-Symfony-10</link>
    <guid isPermaLink="false">urn:md5:3a120ded66866305c23aae1abf575444</guid>
    <pubDate>Fri, 27 Feb 2009 21:06:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;Les tests unitaires de base sous symfony 1.0 n'ont rien : pas d'autoload, pas de contexte (à l'inverse des tests fonctionnels).&lt;br /&gt;
Ce n'est pas extrêmement gênant, on peux inclure les lib dont on a besoin, mais quand on veux faire des appels à la base de donnée (et donc hydrater des objets, faisant souvent appel à de nombreuses classes liées...) c'est mission impossible.&lt;/p&gt;
&lt;p&gt;Voici la solution à base de SimpleAutoload :&lt;/p&gt;
&lt;pre&gt;define('SF_APP',         'frontend');
define('SF_ENVIRONMENT', 'test');
define('SF_DEBUG', TRUE);
require_once($sf_symfony_lib_dir.'/util/sfCore.class.php');
sfCore::initSimpleAutoload(array(SF_ROOT_DIR.'/lib/model'
,$sf_symfony_lib_dir
,SF_ROOT_DIR.'/lib'
,SF_ROOT_DIR.'/apps/'.SF_APP.'/lib'
,SF_ROOT_DIR.'/plugins'));
set_include_path($sf_symfony_lib_dir . '/vendor' . PATH_SEPARATOR . SF_ROOT_DIR . PATH_SEPARATOR . get_include_path());
sfCore::bootstrap($sf_symfony_lib_dir, $sf_symfony_data_dir);
sfContext::getInstance();
Propel::setConfiguration(sfPropelDatabase::getConfiguration());
Propel::initialize();&lt;/pre&gt;
&lt;p&gt;Utiliser un environnement &quot;test&quot; permet d'utiliser une base de donnée différente (à configurer dans database.yml).&lt;br /&gt;
Ce code pourrait (et c'est préférable) être placé dans un nouveau bootstrap dédiée aux test unitaires avec propel (attention c'est consommateur de ressource quand même, donc à n'utiliser que par obligation - à moins d'être heureux d'attendre 10s avant chaque test). Tout de suite après vous pouvez tout faire comme dans une action symfony de base, vous avez accès à toutes vos classes.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/02/27/Snippet-%3A-Propel-dans-un-test-unitaire-Symfony-10#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/02/27/Snippet-%3A-Propel-dans-un-test-unitaire-Symfony-10#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/256</wfw:commentRss>
      </item>
    
  <item>
    <title>Snippet : afficher la dernière requête (symfony)</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/02/23/Snippet-%3A-afficher-la-derniere-requete-symfony</link>
    <guid isPermaLink="false">urn:md5:71504b786b84c02b232587d34a568b16</guid>
    <pubDate>Mon, 23 Feb 2009 15:38:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>symfony</category>
            
    <description>    &lt;p&gt;J'inaugure une nouvelle &quot;idée&quot;, plutôt que de twitter quelque chose qui serait trop vite perdu, ou de me les noter en cachette et d'en priver le monde entier, je posterais &lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: line-through;&quot;&gt;régulièrement&lt;/span&gt; les petits bouts de codes que je ne veux pas perdre.&lt;/p&gt;
&lt;p&gt;On commence par quelque chose de vraiment archi basique mais loin d'être inutile &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Les objets Connection de Symfony ont une propriété lastQuery qui contient le SQL de la dernière requête.&lt;/p&gt;
&lt;pre&gt;Propel::getConnection()-&gt;lastQuery;&lt;/pre&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/02/23/Snippet-%3A-afficher-la-derniere-requete-symfony#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/02/23/Snippet-%3A-afficher-la-derniere-requete-symfony#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/255</wfw:commentRss>
      </item>
    
  <item>
    <title>Where the fuck is the writer ?</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2009/02/12/Where-the-fuck-is-the-writer</link>
    <guid isPermaLink="false">urn:md5:e4c0bc4d5f51b20608606b59a34360c7</guid>
    <pubDate>Sun, 15 Feb 2009 13:13:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>3615 MaVie</category>
            
    <description>    &lt;p&gt;Je remet en cause régulièrement l'existance de ce blog (à chaque fois qu'il reste plus de deux semaines sans contenu), mais un petit tour du côté des statistiques me remplis de remords et de pitiée, malgrès la qualité à la tangeante de la limite du bien vous êtes encore trop à vous abrutir / instruire / documenter / larver sur mes articles (raye la mention inutile). J'en conclus qu'il serait dommage de le rayer du oueb mondial.&lt;/p&gt;
&lt;p&gt;J'aurais bien des trucs à blogguer, qu'on se le dise. Mais c'est pas vraiment dans la ligne éditoriale... pour peu qu'il y en ai une.&lt;/p&gt;
&lt;p&gt;Pour ceux que ça intéresse, ma vie Parisienne se passe toujours bien, et le travail est toujours aussi motivant. J'apprend sans cesse de nouvelles choses, mes skills prennent des points et des bonus pack tous les jours, et c'est sacrément jouissif.&lt;/p&gt;
&lt;p&gt;Sinon, je me suis mis à la photo. C'est marrant ce qu'on peux faire avec un reflex quand même ! Ca change complétement ma vision de la photographie, et je vais continuer de faire des photos môches jusqu'à ce qu'elle soit belles !&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/fevrier2009/.DSC_4578_m.jpg&quot; alt=&quot;&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;DSC_4578.JPG, fév 2009&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Voilà donc à dans 6 mois pour le prochain billet &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; A moins que je décide de changer ma non-ligne éditoriale &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2009/02/12/Where-the-fuck-is-the-writer#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2009/02/12/Where-the-fuck-is-the-writer#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/254</wfw:commentRss>
      </item>
    
  <item>
    <title>Perspectives de mise en page css avec des tables</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2008/11/30/Perspectives-de-mise-en-page-css-avec-des-tables</link>
    <guid isPermaLink="false">urn:md5:22901be8fd4a0019ac3b00053ffc314b</guid>
    <pubDate>Sun, 30 Nov 2008 16:57:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Billet initialement publié sur le &lt;/span&gt;&lt;a href=&quot;http://www.clever-age.com/veille/blog/&quot; hreflang=&quot;fr&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;blog de Clever Age&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt; : &lt;/span&gt;&lt;a href=&quot;http://www.clever-age.com/veille/blog/perspectives-de-mise-en-page-css-avec-des-tables.html&quot; hreflang=&quot;fr&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Perspectives de mise en page css avec des tables&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Derrière ce titre accrocheur se cache une propriété CSS qui fait beaucoup parler d’elle ces derniers temps, et pour cause, on va bientôt pouvoir l’utiliser pour de vrai : &lt;code dir=&quot;ltr&quot;&gt;display:table;&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Historique de la mise en page&lt;/h3&gt;
&lt;p&gt;Il y a encore de cela quelques années, la grande majorité des sites web qui sortaient des agences étaient mis en pages avec des &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;table&gt;&lt;/code&gt;. Cette balise HTML a l’avantage de grandement faciliter la conception de site en plusieurs colonnes, plusieurs parties, et ont des propriétés difficiles à reproduire avec des div flottantes.&lt;/p&gt;
&lt;p&gt;On faisait des sites, ils fonctionnaient bien. Mais cette solution avait quand même ses défauts :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; même pour un design simple, il était souvent nécessaire d’imbriquer plusieurs tableaux&lt;/li&gt;
&lt;li&gt; le code devenait vite illisible, au vu du nombre de balises html nécessaires(des &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;table&gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;tr&gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;td&gt;&lt;/code&gt;, ou encore &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;thead&gt;&lt;/code&gt;, &lt;code dir=&quot;ltr&quot;&gt;&amp;lt;th&gt;&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt; beaucoup de code signifie aussi beaucoup de bande passante&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mais le vrai problème, ce sont &lt;strong&gt;les standards et la sémantique&lt;/strong&gt;. Un beau jour on s’est rendu compte qu’une table, &lt;strong&gt;ça ne servait pas à mettre en page&lt;/strong&gt;, mais à présenter des données tabulaires. On s’est alors démené pour changer nos habitudes, et concevoir des sites accessibles, standards et à la sémantique cohérente [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb1&quot; name=&quot;nh1&quot; id=&quot;nh1&quot; title=&quot;[1] Pas convaincu ? shouldiusetablesforlayout&quot;&gt;1&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;La solution la plus souvent utilisée (ici même par exemple) pour concevoir un site en colonne (un menu, un contenu et un autre menu optionnel) se nomment le &lt;em&gt;float&lt;/em&gt; et son ami le &lt;em&gt;clear&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/novembre2008/1.png&quot; alt=&quot;Layout classique en 3 colonnes, nov 2008&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;Layout classique en 3 colonnes, nov 2008&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Technique éprouvée, mais franchement pas idéale, elle montre ses limites en de nombreuses circonstances : qui ne connait pas le Three Pixel Text Jog [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb2&quot; name=&quot;nh2&quot; id=&quot;nh2&quot; title=&quot;[2] Le bug du Three Pixel Text Jog&quot;&gt;2&lt;/a&gt;] ou le Doubled Float Margin [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb3&quot; name=&quot;nh3&quot; id=&quot;nh3&quot; title=&quot;[3] Le bug du Doubled Float Margin&quot;&gt;3&lt;/a&gt;] ? (Des combos uniquement disponibles sous IE)&lt;/p&gt;
&lt;p&gt;Cette technique nous oblige aussi à ruser pour avoir visuellement des colonnes de même hauteur. En réalité, les colonnes de ce type site ne sont pas aussi longue que le contenu, on a mis une image en fond pour vous le faire croire [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb4&quot; name=&quot;nh4&quot; id=&quot;nh4&quot; title=&quot;[4] Technique du Faux Columns&quot;&gt;4&lt;/a&gt;] !&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/novembre2008/2.png&quot; alt=&quot;&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;Layout en 3 colonnes avec problème de fond, nov 2008&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Elle a aussi la fâcheuse tendance à ne pas être à toute épreuve (si un contenu venait à être plus large que son conteneur, bonjour les dégâts).
&lt;br /&gt;Citons aussi la technique &quot;position:absolute&quot;, moins problématique mais beaucoup moins souple (il y a aussi &lt;a href=&quot;http://giveupandusetables.com/&quot;&gt;cette technique&lt;/a&gt; mais je ne la conseille pas :P).&lt;/p&gt;
&lt;p&gt;Bref, avec les tables, c’était mieux et c’est là que &lt;code dir=&quot;ltr&quot;&gt;display:table;&lt;/code&gt; intervient.&lt;/p&gt;
&lt;h3&gt;La propriété &lt;code dir=&quot;ltr&quot;&gt;display:table;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Apparu dans la première version de CSS2 [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb5&quot; name=&quot;nh5&quot; id=&quot;nh5&quot; title=&quot;[5] La spécification W3C&quot;&gt;5&lt;/a&gt;] (c’était il y a 10 ans au moins !), avec tous ces petits amis (inline-table, table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, table-caption, mais on ne les verra pas en détails ici), l’implémentation de cette propriété dans les navigateurs web s’est faite très tard, et le couple IE6/IE7 ne la supporte pas [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb6&quot; name=&quot;nh6&quot; id=&quot;nh6&quot; title=&quot;[6] Détails de la compatibilité&quot;&gt;6&lt;/a&gt;] (46% de part de marché en octobre 2008 [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb7&quot; name=&quot;nh7&quot; id=&quot;nh7&quot; title=&quot;[7] Les statistiques de W3schools&quot;&gt;7&lt;/a&gt;], on ne peux pas passer outre).&lt;/p&gt;
&lt;p&gt;La bonne nouvelle, c’est le support complet de cette propriété dans IE8 beta 2 (en mode IE8). Si si bonne nouvelle, parce que d’ici trois ans on pourra peut-être enfin l’utiliser à tout va &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En attendant, petit rappel du fonctionnement global de la propriété.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On va prendre l’exemple le plus utile, un layout en 3 colonnes avec un footer.&lt;/p&gt;
&lt;p&gt;La solution à base de flottant est simple et rapide à coder, cependant si je veux que mes colonnes aillent toucher le footer, je suis obligé de tricher (image de fond à la place du fond gris clair) ou d’utiliser du Javascript.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.damienalexandre.fr/public/novembre2008/float.html&quot;&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/novembre2008/png_with-float-d6375.png&quot; alt=&quot;float.html&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;Avec float, nov 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Alors qu’en reprenant exactement le même code HTML, et en changeant juste un peu de CSS (on remplace les &lt;code dir=&quot;ltr&quot;&gt;float:left;&lt;/code&gt; par des &lt;code dir=&quot;ltr&quot;&gt;display:table-cell;&lt;/code&gt;) on est bon !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.damienalexandre.fr/public/novembre2008/table.html&quot;&gt;&lt;img src=&quot;http://blog.damienalexandre.fr/public/novembre2008/png_with-table-0c9bd.png&quot; alt=&quot;table.html&quot; style=&quot;margin-top: 0; margin-right: auto; margin-bottom: 0; margin-left: auto; display: block; &quot; title=&quot;png_with-table-0c9bd.png, nov 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pour visualiser ces pages web, cliquez sur les images (et utilisez un navigateur respectueux des standards).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ce qui est magique avec ces propriétés c’est que nous ne somme pas obligés d’utiliser le &lt;code dir=&quot;ltr&quot;&gt;display:table;&lt;/code&gt; et le &lt;code dir=&quot;ltr&quot;&gt;display:row;&lt;/code&gt; avant d’avoir un &lt;code dir=&quot;ltr&quot;&gt;display:table-cell;&lt;/code&gt;, en effet un tableau &quot;anonyme&quot; se place en parent des table-cell automatiquement. Ce dernier se charge d’englober les cellules qui se suivent dans la même ligne, les lignes qui se suivent dans le même tableau.&lt;/p&gt;
&lt;p&gt;On pourrait trouver encore de nombreuses applications, les tableaux ont des propriétés vraiment intéressante (le vertical-align qui permet d’aligner n’importe quoi verticalement par exemple).&lt;/p&gt;
&lt;h3&gt;Est-ce vraiment utile et pouvons-nous l’utiliser ?&lt;/h3&gt;
&lt;p&gt;Comme je le disais en introduction, ces propriétés ne fonctionnent pas sous &lt;acronym title=&quot;IE en version inférieures à la versions 8&quot;&gt;IE&amp;lt;8&lt;/acronym&gt;, bien sûr il existe des &lt;a href=&quot;http://tjkdesign.com/articles/float-less_css_layouts.asp&quot;&gt;alternatives à base de hack&lt;/a&gt; mais elles sont complexes et difficiles à mettre en place, &lt;acronym title=&quot;Keep it Simple, Stupid&quot;&gt;KISS&lt;/acronym&gt; [&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nb8&quot; name=&quot;nh8&quot; id=&quot;nh8&quot; title=&quot;[8] Qu'est-ce que le KISS ?&quot;&gt;8&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Utiliser la magie des propriétés de table est techniquement envisageable  (on peut tout à fait imaginer utiliser les &lt;em&gt;floats&lt;/em&gt; pour IE, et garder les &lt;code dir=&quot;ltr&quot;&gt;display:table;&lt;/code&gt; pour les navigateurs récents, mon code HTML est strictement le même pour les deux cas), mais cela relève plus d’un exercice de style pour site personnel que d’un choix pertinent. &lt;strong&gt;Utiliser cette technique à l’heure actuelle sur un site professionnel serait une perte de temps&lt;/strong&gt; (et d’argent). En effet, le gain de temps acquis grâce à la souplesse de cette solution serait aussitôt perdu dans les tentatives de compatibilité avec IE en versions inférieures à la version 8.&lt;/p&gt;
&lt;p&gt;En attendant la mort complète et définitive d’IE6 et d’IE7, ne changez pas vos habitudes : la mise en page reste un casse tête &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt; et la solution à base de &lt;em&gt;floats&lt;/em&gt; (ou d’&lt;em&gt;absolute&lt;/em&gt;, selon les gouts) a encore de beaux jours devant elle.&lt;/p&gt;
&lt;p&gt;La vraie révolution de la mise en page en CSS pointera le bout de son nez avec CSS3, et permettra de &lt;a href=&quot;http://www.w3.org/TR/css3-layout/&quot;&gt;définir nos layouts en ASCII&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh1&quot; name=&quot;nb1&quot; title=&quot;Notes 1&quot;&gt;1&lt;/a&gt;] Pas convaincu ? &lt;a href=&quot;http://shouldiusetablesforlayout.com/&quot;&gt;shouldiusetablesforlayout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh2&quot; name=&quot;nb2&quot; title=&quot;Notes 2&quot;&gt;2&lt;/a&gt;] Le &lt;a href=&quot;http://www.positioniseverything.net/explorer/threepxtest.html&quot;&gt;bug du Three Pixel Text Jog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh3&quot; name=&quot;nb3&quot; title=&quot;Notes 3&quot;&gt;3&lt;/a&gt;] Le &lt;a href=&quot;http://www.positioniseverything.net/explorer/doubled-margin.html&quot;&gt;bug du Doubled Float Margin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh4&quot; name=&quot;nb4&quot; title=&quot;Notes 4&quot;&gt;4&lt;/a&gt;] Technique du &lt;a href=&quot;http://www.alistapart.com/articles/fauxcolumns/&quot;&gt;Faux Columns&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh5&quot; name=&quot;nb5&quot; title=&quot;Notes 5&quot;&gt;5&lt;/a&gt;] La &lt;a href=&quot;http://www.w3.org/TR/CSS2/visuren.html#propdef-display&quot;&gt;spécification W3C&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh6&quot; name=&quot;nb6&quot; title=&quot;Notes 6&quot;&gt;6&lt;/a&gt;] Détails de la &lt;a href=&quot;http://www.quirksmode.org/css/display.html&quot;&gt;compatibilité&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh7&quot; name=&quot;nb7&quot; title=&quot;Notes 7&quot;&gt;7&lt;/a&gt;] Les &lt;a href=&quot;http://www.w3schools.com/browsers/browsers_stats.asp&quot;&gt;statistiques de W3schools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.damienalexandre.fr/index.php?post/2008/11/30/#nh8&quot; name=&quot;nb8&quot; title=&quot;Notes 8&quot;&gt;8&lt;/a&gt;] Qu’est-ce que &lt;a href=&quot;http://fr.wikipedia.org/wiki/KISS-principe&quot;&gt;le KISS ?&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2008/11/30/Perspectives-de-mise-en-page-css-avec-des-tables#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2008/11/30/Perspectives-de-mise-en-page-css-avec-des-tables#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/253</wfw:commentRss>
      </item>
    
  <item>
    <title>Tu surf avec Firefox ? Tu es concerné</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2008/11/14/Tu-surf-avec-Firefox-Tu-es-concerne</link>
    <guid isPermaLink="false">urn:md5:1cfeb326219d4816b48317a77d610acf</guid>
    <pubDate>Fri, 14 Nov 2008 00:35:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>Général</category>
            
    <description>    &lt;p&gt;Depuis maintenant deux ans, je suis membre de &lt;a href=&quot;http://www.april.org&quot; hreflang=&quot;fr&quot;&gt;l'April&lt;/a&gt; (http://www.april.org) qui est l'association
nationale de référence pour la promotion et la défense du logiciel
libre (citons Mozilla Firefox, Ubuntu, OpenOffice, Apache et une grosse partie du web). Son but est de promouvoir le logiciel libre, sensibiliser le plus
grand nombre aux enjeux des standards ouverts, défendre le logiciel
libre en amenant des décisions politiques favorables...&amp;nbsp;(candidats.fr par exemple, c'est eux).&lt;/p&gt;
&lt;p&gt;Afin de mieux promouvoir et défendre le logiciel libre l'April renouvelle sa grande campagne d'adhésion (plus on est de fou, et plus on a d'influence / de moyens...).&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Adhérer à l'April n'implique pas d'être actif dans l'association. Mais
forte de milliers de membres, l'April obtiendra plus facilement
l'audience des élus et du gouvernement. Grâce à nos cotisations, elle
pourra financer ses permanents et embaucher les personnes qu'exigent
ses actions et les dossiers de plus en plus complexes qu'elle traite.
Cette campagne d'adhésion a pour but de renforcer l'April dans sa
représentativité et dans ses moyens d'actions. L'April souhaite
atteindre dans un premier temps les 5 000 membres avant la fin de
l'année 2008.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voilà un peu de pub pour l'April donc ! On a en France une asso qui se bouge pour défendre nos libertés informatiques, à vous de voir si vous vous sentez concernés ou pas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.april.org/adherer?referent=Damien+ALEXANDRE+%28dalexandre%29&quot;&gt;&lt;img src=&quot;http://www.april.org/files/association/documents/bannieres/banniereadm6.php&quot; alt=&quot;Promouvoir et soutenir le logiciel libre&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2008/11/14/Tu-surf-avec-Firefox-Tu-es-concerne#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2008/11/14/Tu-surf-avec-Firefox-Tu-es-concerne#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/252</wfw:commentRss>
      </item>
    
  <item>
    <title>Cellule de table qui s'élargie en fonction du contenu</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2008/10/26/Cellule-de-table-qui-s-elargie-en-fonction-du-contenu</link>
    <guid isPermaLink="false">urn:md5:bcb16353f4cb7cbfbea0e79171aa3ba3</guid>
    <pubDate>Sun, 26 Oct 2008 01:45:00 +0100</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>DevBlog</category>
            
    <description>    &lt;p&gt;J'ai eu affaire récemment à un cas plutôt rare dans la longue liste des bugs de rendu sous IE. &lt;br /&gt;Un input text de largeur exprimé en %, dans une cellule de tableau : si on lui met un contenu long, et sans espace (un email par exemple), la cellule du tableau est poussé en fonction de la longueur du texte de l'input.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.damienalexandre.fr/public/octobre2008/fixed-is-magic.png&quot;&gt;&lt;img title=&quot;fixed-is-magic.png, oct 2008&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://blog.damienalexandre.fr/public/octobre2008/.fixed-is-magic_m.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vous avez alors beau vous battre avec tous les overflow, width et autres display le problème est insolvable : les cellules d'un tableau sont prévus pour s'adapter à leur contenu, et IE décide d'agrandir l'input si celui-ci contient une longue chaîne.&lt;/p&gt;
&lt;p&gt;La solution c'est la propriété &lt;a hreflang=&quot;en&quot; href=&quot;http://www.w3.org/TR/CSS21/tables.html#fixed-table-layout&quot;&gt;table-layout&lt;/a&gt; ! C'est elle qui dit comment le navigateur est censé calculer la largeur des cellules du tableau, elle a 3 valeurs possibles :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;auto : valeur par défaut, le contenu fait sa place et les width appliqué au tableau ne sont que des valeurs minimale&lt;/li&gt;
&lt;li&gt;inherit : comme son nom l'indique, c'est papa qui décide&lt;/li&gt;
&lt;li&gt;fixed : la valeur qui m'a sauvé ! Avec elle, toutes les cellules prennent la même largeur sans se soucier du contenu, et si on spécifie une width, elle est appliqué et respecté.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est (je pense) une propriété CSS assez méconnu et c'est pour ça que j'en parle &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; (et ça me sert de mémo pour plus tard aussi &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; ), cela dit &lt;strong&gt;ça n'explique pas le problème de l'input qui prend la largeur de son contenu&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les sources de test : &lt;a hreflang=&quot;en&quot; href=&quot;http://blog.damienalexandre.fr/public/octobre2008/html.html&quot;&gt;sans layout:fixed&lt;/a&gt;/&lt;a hreflang=&quot;en&quot; href=&quot;http://blog.damienalexandre.fr/public/octobre2008/html-fixed.html&quot;&gt;avec layout:fixed&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2008/10/26/Cellule-de-table-qui-s-elargie-en-fonction-du-contenu#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2008/10/26/Cellule-de-table-qui-s-elargie-en-fonction-du-contenu#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/251</wfw:commentRss>
      </item>
    
  <item>
    <title>C'est l'histoire d'un pot d'fleur</title>
    <link>http://blog.damienalexandre.fr/index.php?post/2008/09/20/Un-pot-de-fleur-en-CDI</link>
    <guid isPermaLink="false">urn:md5:7ec07a75a2b5b1dfd6932301dc302ebd</guid>
    <pubDate>Sat, 20 Sep 2008 14:40:00 +0200</pubDate>
    <dc:creator>Damien ALEXANDRE</dc:creator>
        <category>3615 MaVie</category>
            
    <description>    Dans le précédent billet je vous parlais d'un truc important qui se passerait dans ma petite vie le 10 septembre, et bim on est déjà le 20, ça fait 10 jours que vous vous desséchez devant votre ordinateur à rafraichir le vos flux RSS toutes les 5 min dans l'attente d'une réponse à la question qui nous anime tous : WTF. Si si, je le sais, j'ai reçu plusieurs mails de fans.&lt;br /&gt;&lt;p&gt;&lt;img title=&quot;Pot de fleur, sep 2008&quot; style=&quot;margin: 0 1em 1em 0; float: left;&quot; alt=&quot;&quot; src=&quot;http://blog.damienalexandre.fr/index.php?post/2008/09/20/../public/septembre2008/pot.jpg&quot; /&gt;Bon pour faire bref et arrêter de tourner autour du pot, parce que le pot il en a marre qu'on lui tourne toujours autour... Mais si mettez vous un peu à sa place, il reste immobile toute la journée, se fait arroser et les gens danse et tourne autour de lui sans se soucier de ses petits soucis de pot ! Comme la hausse du prix de l'eau ou encore l'effet de serre et les problème d'évaporation précoce ! C'est pas toujours rose la vie d'un pot, en plus il doit s'occuper de ses locataires, les maintenir en vie malgré les intempéries et les mettre en valeur : tout un art.&lt;/p&gt;
&lt;p&gt;Fermeture de la parenthèse &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Donc je ne le disais pas, j'ai commencé mon tout premier CDI ce 10 septembre 2008, à &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.clever-age.com/&quot;&gt;Clever-Age&lt;/a&gt; (big up &lt;a href=&quot;http://oncle-tom.net/&quot;&gt;Oncle-Tom&lt;/a&gt;), un cabinet de conseil en architecture technique
spécialisé dans la conception et l’intégration de systèmes
informatiques flexibles reposant sur les nouvelles technologies : autrement dit, une agence web orienté technique. &lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Oracle, sep 2008&quot; style=&quot;margin: 0 0 1em 1em; float: right;&quot; alt=&quot;&quot; src=&quot;http://blog.damienalexandre.fr/public/septembre2008/oracle-matrix.jpg&quot; /&gt;Voilà alors premier vrai boulot, je réalise pas encore ce qui me tombe sur la tête, fini la vie étudiante, les réducs au ciné (pour 0.90€ je vais pas pleurer cela dit), les vacances scolaires, les profs absents... et bonjour la thune, le plaisir de se lever le matin pour faire ce que j'aime, les collègues compétents et motivés, les projets intéressants, les défis techniques, le partage des connaissances...&lt;/p&gt;
&lt;p&gt;Mon premier projet me permet de mettre les pieds dans Symfony (cay cool) et Oracle (mais bon je préfère pas trop y toucher à lui :P). Pour moi Oracle c'est un programme de la Matrice, et c'est très bien comme ça ! &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;J'ai l'impression d'avoir déjà plus appris en 10 jours qu'en 4 mois de stage : pas forcement d'un point de vue programmation pure, mais sur tous le reste, comme la gestion d'un développement avec Trac / Subversion, les petits plugins Eclipse qui vont bien, Symfony, PEAR... et c'est loin d'être fini &lt;img src=&quot;/themes/v4-by-mdz/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Autre fait marquant fortement lié, le 12 et le 13 septembre, c'était le Mystery Tour 2008 ! Le principe est simple, tous les ans tous les employés sont invités pour un weekend de &lt;del&gt;débauche&lt;/del&gt;fun - cette année on est allé en Camargue et à la Grande Motte, faire du quad, du cheval, du jet ski... classique quoi ! &lt;/p&gt;
&lt;p&gt;Hors sujet mais quand même intéressant (ou pas), me suis acheté un Picooz et ça défonce.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Picooz, aoû 2008&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://blog.damienalexandre.fr/public/aout2008/picooz.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Pas de photo en vol parce que 1, c'est pas facile à stabiliser, et 2 mon APN n'est pas assez rapide)&lt;/em&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.damienalexandre.fr/index.php?post/2008/09/20/Un-pot-de-fleur-en-CDI#comment-form</comments>
      <wfw:comment>http://blog.damienalexandre.fr/index.php?post/2008/09/20/Un-pot-de-fleur-en-CDI#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.damienalexandre.fr/index.php?feed/rss2/comments/247</wfw:commentRss>
      </item>
    
</channel>
</rss>