<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Proglog - Accueil</title>
  <id>tag:proglog.cognitic.com,2007:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  
  <link href="http://proglog.cognitic.com/" rel="alternate" type="text/html" />
  <updated>2007-09-30T16:10:44Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/proglog" type="application/atom+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-09-30:20</id>
    <published>2007-09-30T16:10:00Z</published>
    <updated>2007-09-30T16:10:44Z</updated>
    <category term="Flash/Flex" />
    <link href="http://proglog.cognitic.com/2007/9/30/papervision3d-comment-localiser-votre-fichier-collada-sur-le-web" rel="alternate" type="text/html" />
    <title>Papervision3D : comment localiser votre fichier Collada sur le web</title>
<content type="html">
            &lt;p&gt;Petit problème avec le composant papervision3D collada scene : comment localiser le fichier .dae lors d'une publication sur un site dynamique?&lt;br /&gt;
Ma solution écrire l'url du fichier dans le paramètre Collada File et laisser vide le paramètre Local Directory.&lt;/p&gt;
&lt;p&gt;Qui dit mieux?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-09-29:22</id>
    <published>2007-09-29T20:58:00Z</published>
    <updated>2007-09-30T21:02:53Z</updated>
    <category term="Agilité" />
    <link href="http://proglog.cognitic.com/2007/9/29/revue-2007-des-technologies-informatiques" rel="alternate" type="text/html" />
    <title>Revue 2007 des technologies informatiques</title>
<content type="html">
            &lt;p&gt;Petite revue des points essentielles que j'ai noté sur les nouvelles technologies de l'année 2007.&lt;br /&gt;
Je ne traite pas des technologies Web et Open-sources qui occupent des niches souvent prometteuses mais moins diffusées dans l'industrie. Je ne traite pas non plus des technologies Sun par gout personnel...&lt;/p&gt;

&lt;h3&gt;Les technologies microsoft :&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;
&lt;strong&gt; Xaml&lt;/strong&gt; est définit à un niveau de granularité plus faible que le mxml, il est donc plus flexible mais nécessite de manipuler plus de code.&lt;/li&gt;&lt;li&gt;

&lt;strong&gt;WPF&lt;/strong&gt; est intégré à vista mais nécessite l'installation du Framework .net 3.0 pour les autres windows. C'est un chargement très lourd et peu pertinent. Une application WPF ayant une interface Xaml reste facilement skinnable.
.net CLR intègre de plus en plus de languages avec notamment ruby.&lt;/li&gt;&lt;li&gt;

&lt;strong&gt;Silverlight&lt;/strong&gt; sera intégré à Visual studio 2008 que microsoft propose déja une beta. Comme WPF il repose sur une interface Xaml.  Ces principaux point faibles sont le manque de &lt;a href="http://www.ddjsilverlight.com/tutorial/"&gt;références&lt;/a&gt;, une littérature encore limitée (Les bouquins amériquains sur silverlight 1.0 vont sortir à partir d'octobre). Les &lt;a href="http://silverlight.net/themes/silverlight/community/gallerydetail.aspx?cat=3"&gt;démos techniques&lt;/a&gt; sont prometteuses, et disposent de &lt;a href="http://metalinkltd.com/?p=108"&gt;bonnes performances&lt;/a&gt;.
&lt;/li&gt;&lt;/ul&gt;

&lt;h3&gt;Les technologies Adobe :&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;
&lt;strong&gt;ActionScript 3.0&lt;/strong&gt; dispose d'un compilateur JIT (just-in-time) très performant. Il permet notamment l'utilisation de technologies 3D avancées.&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;AIR&lt;/strong&gt; est très facile d'installation (moins de 10 mega), il intégre un browser webkit et permet à chaque application de s'auto-updater selon son numéro de version.&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;L'intégration de flex avec AIR&lt;/strong&gt; serait finalisée avec flex 3. La principale faiblesse de .air reste ses limites en terme de protocoles de communication en raison d'une sécurité élevée : .air peut seulement lire et écrire des fichiers, appeler des Webservices et accéder à une base de données SQLite.&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;L'interface mxml&lt;/strong&gt; est plus facilement skinnable que celles reposants sur des composants flash (à travers des attributs et la CSS).
&lt;/li&gt;&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-09-28:21</id>
    <published>2007-09-28T16:14:00Z</published>
    <updated>2007-09-30T16:19:54Z</updated>
    <category term="Flash/Flex" />
    <link href="http://proglog.cognitic.com/2007/9/28/utiliser-flexunit" rel="alternate" type="text/html" />
    <title>Utiliser Flexunit</title>
<content type="html">
            &lt;p&gt;Créer un launcher avec un affichage flexunit comme ci dessous.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;lt;&lt;span class="i"&gt;?x&lt;/span&gt;ml version=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; encoding=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;utf-8&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;mx&lt;span class="sy"&gt;:Application&lt;/span&gt; xmlns&lt;span class="sy"&gt;:mx=&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; http://www.adobe.com/2006/mxml&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; layout=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;absolute&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     xmlns&lt;span class="sy"&gt;:flexunit=&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;flexunit.flexui.*&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; applicationComplete=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ini()&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;mx&lt;span class="sy"&gt;:Script&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    import flexunit.framework.&lt;span class="co"&gt;TestSuite&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;   &lt;tt&gt;
&lt;/tt&gt;    private function ini()&lt;span class="sy"&gt;:void&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    {&lt;tt&gt;
&lt;/tt&gt;         testRunner.test = createSuite();&lt;tt&gt;
&lt;/tt&gt;         testRunner.startTest();&lt;tt&gt;
&lt;/tt&gt;     }&lt;tt&gt;
&lt;/tt&gt;     &lt;tt&gt;
&lt;/tt&gt;     private function createSuite()&lt;span class="sy"&gt;:TestSuite&lt;/span&gt; {&lt;tt&gt;
&lt;/tt&gt;              var suite : &lt;span class="co"&gt;TestSuite&lt;/span&gt; = new TestSuite(&lt;span class="co"&gt;MainTest&lt;/span&gt;);&lt;tt&gt;
&lt;/tt&gt;             &lt;span class="r"&gt;return&lt;/span&gt; suite;&lt;tt&gt;
&lt;/tt&gt;    }&lt;tt&gt;
&lt;/tt&gt;&amp;lt;&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;mx:Script&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;mx:Canvas x=&amp;quot;10&amp;quot; y=&amp;quot;19&amp;quot; width=&amp;quot;252&amp;quot; height=&amp;quot;247&amp;quot; borderColor=&amp;quot;#FFFFFF&amp;quot;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;mx&lt;/span&gt;&lt;/span&gt;&lt;span class="sy"&gt;:Canvas&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;flexunit&lt;span class="sy"&gt;:TestRunnerBase&lt;/span&gt; id=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;testRunner&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; width=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; height=&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; /&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;&lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="k"&gt;mx:Application&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Créer une suite de tests du type :&lt;/p&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;package {&lt;tt&gt;
&lt;/tt&gt; &lt;tt&gt;
&lt;/tt&gt;     import flexunit.framework.&lt;span class="co"&gt;TestCase&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;     import flexunit.framework.&lt;span class="co"&gt;TestSuite&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;     public &lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;MainTest&lt;/span&gt; extends &lt;span class="co"&gt;TestCase&lt;/span&gt; {&lt;tt&gt;
&lt;/tt&gt;         &lt;tt&gt;
&lt;/tt&gt;          public function MainTest() {&lt;tt&gt;
&lt;/tt&gt;               &lt;span class="r"&gt;super&lt;/span&gt;( methodName );&lt;tt&gt;
&lt;/tt&gt;           }&lt;tt&gt;
&lt;/tt&gt;     &lt;tt&gt;
&lt;/tt&gt;  public function testToInt()&lt;span class="sy"&gt;:void&lt;/span&gt; {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="rx"&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;/&lt;/span&gt;&lt;span class="mod"&gt;un&lt;/span&gt;&lt;/span&gt; test de la function toInt par exemple&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;           &lt;tt&gt;
&lt;/tt&gt;         &lt;tt&gt;
&lt;/tt&gt;      }&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Voila vous êtes prêt, il ne vous reste plus qu'à organiser votre code selon les tests. Pour plus de renseignement je vous renvois à ma &lt;a href="http://blog.iconara.net/2007/02/06/flexunit/"&gt;source d'inspiration&lt;/a&gt;.
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-09-23:19</id>
    <published>2007-09-23T21:04:00Z</published>
    <updated>2007-09-26T21:12:36Z</updated>
    <category term="Flash/Flex" />
    <link href="http://proglog.cognitic.com/2007/9/23/débuter-avec-flex-et-de-flash-cs3" rel="alternate" type="text/html" />
    <title>Débuter avec Flex et Flash CS3</title>
<content type="html">
            &lt;p&gt;Ce schéma représente l'ensemble des technologies du sdk flex et compatibles flash cs3.&lt;/p&gt;
&lt;img src="/images/flex_flash_tools.jpg" /&gt;

&lt;p&gt;Voici quelque liens pour découvrir les possibilités de Flex :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
&lt;a href="http://examples.adobe.com/flex2/inproduct/sdk/explorer/explorer.html"&gt;Component explorer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://weblogs.macromedia.com/mc/archives/FlexStyleExplorer.html"&gt;Style explorer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.merhl.com/flex2_samples/filterExplorer/"&gt;Filter explorer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://blog.keutgens.de/download/flexEffectExplorer/current/swf/TransitionsAndEffects.html "&gt;Effect explorer&lt;/a&gt;(ne marche pas actuellement)&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.3gcomm.fr/Flex/PrimitiveExplorer/Flex2PrimitiveExplorer.html"&gt;Primitive explorer&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Quelques démos techniques :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
&lt;a href="http://examples.adobe.com/flex2/inproduct/sdk/flexstore/flexstore.html"&gt;Flexstore&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.sliderocket.com/productTour.html"&gt;sliderocket&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/"&gt;cube 3D&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.floorplanner.com/tryit/"&gt;foorplanner&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.papercritters.com/pc.php"&gt;papercritters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.anywhere.fm/player/"&gt;anywhere.fm&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Quelques tutorials :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
&lt;a href="http://www.actionscript.org/resources/articles/636/1/Getting-Started-With-AS3-and-Flash-CS3/Page1.html"&gt;Débuter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://blog.flexexamples.com/2007/09/04/adding-animations-and-effects-to-flex-tool-tips/"&gt;Effects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.adobe.com/devnet/flash/articles/liquid_gui.html"&gt;Liquid layout&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://blogs.adobe.com/kiwi/2006/07/loading_flex_skins_at_runtime.html"&gt;Skinning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://www.richinternet.de/blog/index.cfm?entry=ADD4FDD1-9B48-BFBC-2A70F3C57EBC6892"&gt;Gradient&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Quelques documents de références :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/mx/core/UIComponent.html"&gt;UIComponent&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/events/Event.html"&gt;Evenement&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/display/Graphics.html"&gt;Dessin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/media/Sound.html"&gt;Son&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/media/Video.html"&gt;Video&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/display/BitmapData.html"&gt;Image&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-20:18</id>
    <published>2007-08-20T20:25:00Z</published>
    <updated>2007-08-20T21:23:38Z</updated>
    <category term="Ajax" />
    <link href="http://proglog.cognitic.com/2007/8/20/prototype-1-6-0-rc" rel="alternate" type="text/html" />
    <title>Prototype 1.6.0.rc</title>
<content type="html">
            &lt;p&gt;La version 1.5.1 supportait les sélecteurs CSS3, cette fois la principale amélioration concerne la gestion des évènements.&lt;br /&gt;
La &lt;a href="http://prototypejs.org/2007/8/15/prototype-1-6-0-release-candidate"&gt;release candidate 1.6&lt;/a&gt; propose les améliorations suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; La cadre de Element#oberve fait correspondre au "this" l'élement qui l'appelle automatiquement (pas besoin de binding, ou de Function#methodize).&lt;/li&gt;&lt;li&gt;
L'appelle à plusieurs méthodes "statiques" est désormais possible depuis les instances.
&lt;/li&gt;&lt;li&gt;On peut accèder à l'event.target dans tous les navigateurs.
&lt;/li&gt;&lt;li&gt;Element#fire permet de créer un type  d'évènement dont l'identité peut être "écoutée".
&lt;/li&gt;&lt;li&gt;La function onload ultime a été implémentée à travers l'évènement "contentloaded".
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cette nouvelles versions apporte d'autres nouveautés parmis lesquelles voici mes préférées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;document.viewport permet d'accéder aux dimensions et à la position de la fenêtre avec : getDimensions(), getWidth(), getHeight() et getScrollOffsets().
&lt;/li&gt;&lt;li&gt;Function#wrap permet d'étendre une fonction (ca doit permettre les mixins).
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Il y aussi ajout de syntaxique sugar :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;new Element(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, { name: &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, disabled: &lt;span class="pc"&gt;true&lt;/span&gt; })&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;header&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).setStyle(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;font-size: 12px; float: left; opacity: 0.5&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Et pour finir un exemple d'héritage bien sympathique:&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;// subclass that augments a method&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;var&lt;/span&gt; Cat = Class.create(Animal, {&lt;tt&gt;
&lt;/tt&gt;  eat: &lt;span class="r"&gt;function&lt;/span&gt;($&lt;span class="pc"&gt;super&lt;/span&gt;, food) {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;if&lt;/span&gt; (food instanceof Mouse) &lt;span class="r"&gt;return&lt;/span&gt; $&lt;span class="pc"&gt;super&lt;/span&gt;();&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;else&lt;/span&gt; &lt;span class="r"&gt;return&lt;/span&gt; &lt;span class="pc"&gt;this&lt;/span&gt;.say(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Yuk! I only eat mice.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;});&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-19:17</id>
    <published>2007-08-19T19:30:00Z</published>
    <updated>2007-08-23T21:49:52Z</updated>
    <category term="Ajax" />
    <link href="http://proglog.cognitic.com/2007/8/19/sécuriser-ses-données-javascript" rel="alternate" type="text/html" />
    <title>Sécuriser ses données Javascript </title>
<content type="html">
            &lt;p&gt;Connaissez vous le JavaScript Hijacking? Il s'agit d'une méthode qui pirate la protection du code éxécutable par votre navigateur (localisée par nom de domaine). Le pirate crée ou profite de brèches à travers le transfert Asynchrone (XHR, IFrame ou &amp;lt;script&gt;) pour récupérer des données sensibles.&lt;br /&gt;
Pour prévenir ce risque, de nombreuses bonnes pratiques sont à suivre, en voici quelques exemples :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Limiter l'accès aux URL qui renvoient les données non publiques, à l'aide d'une clé pouvant reposer sur l'identifiant de session, ou un paramètre obligatoirement envoyé en POST.&lt;/li&gt;&lt;li&gt;
L'ajout préfixé d'un code au JSON qui doit alors être nettoyé par le client.
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;La &lt;a href="http://prototypejs.org/2007/5/1/prototype-1-5-1-released"&gt;version 1.5.1 de prototype&lt;/a&gt; a aussi apporté des améliorations notables pour y faire face :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Codage et décodage JSON avec evalJSON(true) qui propose un paramètre sanitize pour éviter des attaques XSS (cross-site scripting, le danger de toute approche web2.0).&lt;/li&gt;&lt;li&gt;
Il est de plus hautement conseillé d'envoyer son JSON commenté, et avec le bon header requestHeaders: {Accept: 'application/json'},)&lt;/li&gt;&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-16:15</id>
    <published>2007-08-16T22:18:00Z</published>
    <updated>2007-08-16T22:35:38Z</updated>
    <category term="Ruby" />
    <link href="http://proglog.cognitic.com/2007/8/16/mop-la-programmation-orientée-mixin-ou-bien-orientée-alchimie" rel="alternate" type="text/html" />
    <title>MOP, La Programmation Orientée Mixin... ou bien Orientée Alchimie ? </title>
<content type="html">
            &lt;p&gt;Ruby est purement objet même lorsqu'il permet de la programmation fonctionnelle, mais le paradigme "héritage &amp; aggrégation" me semble remis en cause par son approche modulaire plus centrée sur le "namespace &amp; introspection". &lt;/p&gt;
&lt;p&gt;La métaphore qui se rapproche le plus du mixin est le skinning, on part d'une classe spécialisée auquelle on applique un comportement plus général. 
Pour simplifier, la OOP classique c'est de l'architecture et la MOP c'est de l'alchimie.&lt;/p&gt;
&lt;h3&gt;Warning! attention ce billet va partir en trip (vous êtes prévenu)&lt;/h3&gt;
&lt;p&gt;Programmation Orienté Alchimie ? L'idée m'a amusé et j'ai été voir ce que Wikipédia disait à ce propos. Je partages avec vous quelques &lt;a href="http://fr.wikipedia.org/wiki/Alchimie"&gt;passages tirés de sa définition&lt;/a&gt; :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;alchimie&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;L'alchimie est une science ésotérique dont l'objet est l'étude de la matière &lt;tt&gt;
&lt;/tt&gt;et de ses transformations...&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; +&lt;tt&gt;
&lt;/tt&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;..les textes alchimiques possèdent la particularité d'être codés. Il s'agit &lt;tt&gt;
&lt;/tt&gt;d'un savoir qui n'est transmis que sous certaines conditions..&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + &lt;tt&gt;
&lt;/tt&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;..seul un être vivant intelligent pourrait effectuer des opérations alchimiques. &lt;tt&gt;
&lt;/tt&gt;Vouloir automatiser les procédés alchimiques ne servirait donc à rien.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; +&lt;tt&gt;
&lt;/tt&gt;&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Les présupposés populaires laissent à penser que la terminologie descriptive&lt;tt&gt;
&lt;/tt&gt; de l'alchimie se réduit à une sémantique propriétaire ..C'est là une des plus &lt;tt&gt;
&lt;/tt&gt;grandes erreurs que commettent les profanes.&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Surprenant non? De là à trouver &lt;a href="http://fr.wikipedia.org/wiki/Pierre_philosophale"&gt;des vertus philosophales&lt;/a&gt; à notre chère pierre précieuse...(la pierre philosophale est vraiment censée être rouge! Après Da Vinci Code, serions nous en plein dans du Da Matz Code? ;) )&lt;/p&gt;
&lt;p&gt;La prochaine fois qu'on vous demandera ce que vous pouvez faire de plus gràce à Ruby, répondez donc de l'or!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-15:13</id>
    <published>2007-08-15T13:13:00Z</published>
    <updated>2007-08-16T13:19:57Z</updated>
    <category term="Flash/Flex" />
    <link href="http://proglog.cognitic.com/2007/8/15/focusmanager-pour-flex" rel="alternate" type="text/html" />
    <title>FocusManager pour Flex </title>
<content type="html">
            &lt;p&gt;Le FocusManager permet de donner le focus à un composant de votre interface, il est très facile d'utilisation :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;focusManager.setFocus(componentId);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Il m'est arrivé d'avoir des débordement de pile à cause d'un bug de flex présent dés qu'on utilise une autre application que la navigateur. Dans ce cas je conseille de mettre le focusEnabled de chaque composant à false.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-14:16</id>
    <published>2007-08-14T23:15:00Z</published>
    <updated>2007-08-16T23:32:27Z</updated>
    <category term="Ruby" />
    <link href="http://proglog.cognitic.com/2007/8/14/la-famille-eval" rel="alternate" type="text/html" />
    <title>La famille Eval</title>
<content type="html">
            &lt;p&gt;La famille Eval se compose des méthodes suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;eval()&lt;/strong&gt; interprête un string comme du code dans un contexte pouvant être rattaché à un binding.&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;instance_eval()&lt;/strong&gt; inclue le code interprété à l'instance qui l'appelle (l'objet self par défaut)&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;class_eval()&lt;/strong&gt; inclue le code interprété comme des méthode de la classe l'appelant&lt;/li&gt;&lt;li&gt;
&lt;strong&gt;module_eval()&lt;/strong&gt; est un alias de class_eval&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il faut surtout retenir que instance_eval et class_eval sont définis en fonction du cadre de leurs définitions et pas du destinataire final de leurs interprétation (La Class ou l'objet instancié).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-13:12</id>
    <published>2007-08-13T11:54:00Z</published>
    <updated>2007-08-13T12:28:22Z</updated>
    <category term="Rails" />
    <category term="Ruby" />
    <link href="http://proglog.cognitic.com/2007/8/13/ruby-is-so-cool" rel="alternate" type="text/html" />
    <title>Ruby is so cool !</title>
<content type="html">
            &lt;p&gt;Mon classement des trucs les plus cools avec Ruby :&lt;/p&gt;
&lt;ul class="chart"&gt;&lt;li&gt;
Mixin (Ruby)&lt;/li&gt;&lt;li&gt;
Minimal Syntax for DSL (Ruby)&lt;/li&gt;&lt;li&gt;
MVC (Rails)&lt;/li&gt;&lt;li&gt;
URL Routing (Rails)&lt;/li&gt;&lt;li&gt;
Eval family (Ruby)&lt;/li&gt;&lt;li&gt;
Pure OOP (Ruby)&lt;/li&gt;&lt;li&gt;
ActiveRecord (Rails)&lt;/li&gt;&lt;li&gt;
Introspection (Ruby)&lt;/li&gt;&lt;li&gt;
Functionnal Programming (Ruby Procs/Blocs)&lt;/li&gt;&lt;li&gt;
Automatisation (Rake, Capistrano, Rdoc)&lt;/li&gt;&lt;li&gt;
Migration (Rails)&lt;/li&gt;&lt;li&gt;
Shell scripting (Ruby)&lt;/li&gt;&lt;li&gt;
Active Resource (Rails)&lt;/li&gt;&lt;li&gt;
Generators (Rails)&lt;/li&gt;&lt;li&gt;
irb (Ruby)&lt;/li&gt;&lt;li&gt;
Gem (Ruby)
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Sacrée liste! je ne pensais pas qu'elle serait si longue quand je l'ai commencée. Ya pas à dire Ruby est vraiment cool!&lt;br /&gt;
On pourrait presque faire un bouquin avec ca, il devrait s'appeler: "Ruby is so cool !" (en fait je pense que &lt;a href="http://poignantguide.net/ruby/"&gt;Why est déja en train de l'écrire&lt;/a&gt;).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-11:11</id>
    <published>2007-08-11T01:35:00Z</published>
    <updated>2007-08-11T08:06:25Z</updated>
    <category term="Agilité" />
    <category term="Rails" />
    <category term="Ruby" />
    <link href="http://proglog.cognitic.com/2007/8/11/rake-sftp" rel="alternate" type="text/html" />
    <title>Rake sftp</title>
<content type="html">
            &lt;p&gt;J'ai eu envie de me simplifier la vie aujourd'hui. J'ai décidé d'écrire une tâche Rake pour uploader des fichiers souvent mis à jours, sur un serveur distant. 
&lt;br /&gt;Je n'avais aucunes idée de la meilleure solution et comme souvent dans ces cas là, ca n'a pas été simple de la découvrir.&lt;/p&gt;

&lt;p&gt;Je me suis d'abord intéressé à Capistrano mais je l'ai trouvé surdimensionné par rapports à mes besoins personnels. Je croyais que rsync serais à ma mesure mais le manque de documentation m'a freiné. 
&lt;br /&gt;Et puis j'ai réalisé qu'un simple sftp me convenait parfaitement. Cela avait plusieurs avantages : possible connection automatique (il semble que ce soit la différence avec scp) et possible utilisation de la librairie &lt;a href="http://net-ssh.rubyforge.org/sftp/faq.html"&gt;Net::SFTP&lt;/a&gt;.
&lt;br /&gt;Mais mauvaises surprises: je n'aime pas la syntaxe de Net::SFTP (NB: et il existe déja un &lt;a href="http://www.infoq.com/articles/ruby-file-upload-ssh-intro"&gt;script pour la synchronisation à distance&lt;/a&gt;) et la connection automatique de sftp par batchfile n'accepte pas les passwords! 
&lt;br /&gt;Il a donc fallu générer des clés partagées avec la commande (ssh-keygen -t rsa) et après un peu de shell scripting via le &lt;a href="http://www.ruby-doc.org/core/classes/Kernel.html#M005960"&gt;Kernel&lt;/a&gt;, voici donc une tâche Rake muy buena :&lt;/p&gt;

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;#Attention, n'utilisez pas ce script si vous ne le comprenez pas!&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#Nécessite d'avoir sftp d'installé et une clé partagée avec le serveur&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;sftp command to customize&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;task &lt;span class="sy"&gt;:sftp&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;#server address&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        server_address = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;you@example.com&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;#sftp command&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        source_dir = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/dir_to_upload/*&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        destination_dir = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;remote_dir/&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        command = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;put &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;+ source_dir&lt;tt&gt;
&lt;/tt&gt;        &lt;span class="c"&gt;#sftp call&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        call = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;sftp -b /dev/stdin&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + &lt;tt&gt;
&lt;/tt&gt;                server_address + &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + destination_dir + &lt;tt&gt;
&lt;/tt&gt;                &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; + command + &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="k"&gt;quit&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="k"&gt;EOF&lt;/span&gt;&lt;span class="ch"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        puts call&lt;tt&gt;
&lt;/tt&gt;        system(call)&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Pour ceux qui ne connaissent pas sftp, voici les principales commandes qu'il supporte :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
cd : changement de répertoire distant.
&lt;/li&gt;&lt;li&gt;lcd : changement de repertoire local.
&lt;/li&gt;&lt;li&gt;ls : liste des fichiers distants.
&lt;/li&gt;&lt;li&gt;lls : liste des fichiers locaux.
&lt;/li&gt;&lt;li&gt;put : upload de fichier.
&lt;/li&gt;&lt;li&gt;quit : fin de la connection.
&lt;/li&gt;&lt;li&gt;get : download de fichiers.
&lt;/li&gt;&lt;li&gt;mget : multiple get.
&lt;/li&gt;&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-10:10</id>
    <published>2007-08-10T03:33:00Z</published>
    <updated>2007-08-11T09:11:22Z</updated>
    <category term="Agilité" />
    <link href="http://proglog.cognitic.com/2007/8/10/what-is-agilité-about" rel="alternate" type="text/html" />
    <title>What is agilité about?</title>
<content type="html">
            &lt;p&gt;Vous avez remarquez ? ce billet est dans la section agilité, et bien ce n'est pas une technologie mais une philosophie qui participe à l'écriture de bon programmes.&lt;br /&gt;
Tout ca pour écrire ce que j'entends par agile :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; Une automatisation de tous les workflows répétitifs.
&lt;/li&gt;&lt;li&gt; Des fonctions organisées de facon à être testées et DRY.
&lt;/li&gt;&lt;li&gt; Une séparation souple de la configuration du programme et de ses règles logiques.
&lt;/li&gt;&lt;li&gt; Une approche pragmatique et itérative de la gestion de  projets.
&lt;/li&gt;&lt;li&gt; Pas de sur-optimisation et de sur-spécification.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;C'est ma vision personnel de ce que certains appellent &lt;a href="http://ucd.cognitic.com/11/11/2006/getting-real"&gt;Getting Real&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-09:9</id>
    <published>2007-08-09T17:34:00Z</published>
    <updated>2007-08-09T17:39:58Z</updated>
    <category term="Agilité" />
    <category term="Rails" />
    <link href="http://proglog.cognitic.com/2007/8/9/cache_page_now" rel="alternate" type="text/html" />
    <title>cache_page_now</title>
<content type="html">
            &lt;p&gt;J'ai décidé de partager &lt;strong&gt;une petite méthode qui génère le cache d'une page..&lt;/strong&gt;
&lt;br /&gt;Comment ca? ca existe déja!
Ha non attendez, c'est très différent regarder bien le nom des fonctions : caches_page (!=) caches_page_now.
&lt;/p&gt;
&lt;p&gt;Vouz avez compris? Non! Bon arrêtons de perdre notre temps, allez lire &lt;a href="http://proglog.cognitic.com/2007/8/1/un-autre-billet"&gt;un autre billet&lt;/a&gt; et revenez quand vous aurez besoin d'exporter des pages web.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;caches_page_now&lt;/span&gt;(attrs)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;#be carefull to add a route for '.html'&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    path = &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;&lt;span class="co"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/public/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;attrs[&lt;span class="sy"&gt;:controller&lt;/span&gt;]&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;attrs[&lt;span class="sy"&gt;:action&lt;/span&gt;]&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;.html&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;#don't forget to instanciate the action variables&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    content = render_to_string(&lt;span class="sy"&gt;:action&lt;/span&gt; =&amp;gt; attrs[&lt;span class="sy"&gt;:action&lt;/span&gt;])&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;File&lt;/span&gt;.delete(path) &lt;span class="r"&gt;if&lt;/span&gt; &lt;span class="co"&gt;File&lt;/span&gt;.exists?(path)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;FileUtils&lt;/span&gt;.makedirs(&lt;span class="co"&gt;File&lt;/span&gt;.dirname(path))&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;File&lt;/span&gt;.open(path, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;wb+&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) { |f| f.write(content) }&lt;tt&gt;
&lt;/tt&gt; &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-08:7</id>
    <published>2007-08-08T00:14:00Z</published>
    <updated>2007-08-08T09:57:39Z</updated>
    <category term="Rails" />
    <link href="http://proglog.cognitic.com/2007/8/8/rails-routes-pour-avoir-une-url-du-type-action-html-ou-id-html" rel="alternate" type="text/html" />
    <title>Rails Routes pour avoir une URL du type action.html ou id.html</title>
<content type="html">
            &lt;p&gt;Envie d'une url se terminant en .html pour votre application Rails?&lt;br /&gt;
Dans &lt;strong&gt;X_controller.rb&lt;/strong&gt;, redéfinissez la méthode default_url_options qui sert aux &lt;a href="http://api.rubyonrails.com/classes/ActionView/Helpers/UrlHelper.html"&gt;UrlHelper&lt;/a&gt; :&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;default_url_options&lt;/span&gt;(options)&lt;tt&gt;
&lt;/tt&gt;  { &lt;span class="sy"&gt;:format&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;Dans &lt;strong&gt;routes.rb&lt;/strong&gt; on définit le format des urls manipulées par Rails.&lt;/p&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;map.connect ':controller/:action.:format' # pour action.html&lt;tt&gt;
&lt;/tt&gt;map.connect ':controller/:action/:id.:format' # pour id.html&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://proglog.cognitic.com/">
    <author>
      <name>j_c</name>
    </author>
    <id>tag:proglog.cognitic.com,2007-08-07:6</id>
    <published>2007-08-07T21:03:00Z</published>
    <updated>2007-08-07T21:13:53Z</updated>
    <category term="Ruby" />
    <link href="http://proglog.cognitic.com/2007/8/7/la-métaprogrammation-avec-ruby" rel="alternate" type="text/html" />
    <title>La métaprogrammation avec Ruby</title>
<content type="html">
            &lt;p&gt;La métaprogrammation permet de personnaliser de Ruby à ses besoins, pour en faire un langage de programmation sur mesure. Que demander de plus à un langage &lt;span class="lt"&gt;haute-couture&lt;/span&gt; haute-programmation? Voici quelques exemples d'utilisation :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Créer dynamiquement des fonctions d'après un unique prototype avec eval&lt;/strong&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;make_function&lt;/span&gt;(function_name)&lt;tt&gt;
&lt;/tt&gt;  eval &amp;lt;&amp;lt;- &lt;span class="co"&gt;FLAG&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="c"&gt;#{function_name}(function_arg)&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class="er"&gt;@&lt;/span&gt;&lt;span class="c"&gt;#{function_name} = function_arg&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="co"&gt;FLAG&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Définir une syntaxe ouverte avec public_method_defined?(symbol)&lt;/strong&gt;


&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Modifier une fonction avec wrap_method&lt;/strong&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;Module&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;modify_function&lt;/span&gt;(function_name)&lt;tt&gt;
&lt;/tt&gt;     wrap_method(function_name) &lt;span class="r"&gt;do&lt;/span&gt; |org_method, args, block|&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="c"&gt;# exemple: args = args.collect{|x| puts x}&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;     org_method.call(*args, &amp;amp;block)&lt;tt&gt;
&lt;/tt&gt;     &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Charger dynamiquement des fichiers de codes avec load et require&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
          </content>  </entry>
</feed>
