<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2807958853352636280</id><updated>2012-03-16T12:46:08.927Z</updated><category term='ruby'/><category term='rhosync'/><category term='rails'/><category term='androïd'/><category term='administrations de vos applications Rails'/><category term='rhodes'/><title type='text'>Dakar Ruby User Group</title><subtitle type='html'>DRUG est le Dakar Ruby User Group; une communauté de développeurs Ruby basé à Dakar et aux alentours. Nous nous réunissons au moins une fois par mois,le dernier samedi du mois, nous avons des réunions avec des conférences, des démonstrations et code clinics.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-3394169086821824340</id><published>2011-11-15T23:37:00.005Z</published><updated>2012-03-03T21:18:34.646Z</updated><title type='text'>Active Admin !!!</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/-7v8jErlEi6U/TsL-z60r8BI/AAAAAAAAAGw/T4WSiFK6TNY/s1600/active_admin.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5675378648357269522" src="http://3.bp.blogspot.com/-7v8jErlEi6U/TsL-z60r8BI/AAAAAAAAAGw/T4WSiFK6TNY/s320/active_admin.PNG" style="cursor: hand; cursor: pointer; display: block; height: 87px; margin: 0px auto 10px; text-align: center; width: 274px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Hello c'est moi...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Aujourd'hui j'aimerais vous parler d'un souci majeur dans un processus de développement : la mise en place d'un module d'administration souple efficace, et intuitif. Sur les différents projets dans lesquels j'ai eu a travailler, c'était souvent la partie la plus laborieuse et bien souvent bâclée.  On se comprend....&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Mais comme le monde n'est pas toujours si cruel, on a notre petite communauté qui nous a mijoté un petit bijou, une &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;b&gt;gem&lt;/b&gt;&lt;/span&gt;, pour la mise en place d'un module d'administration. Hé oui oui...si si je blague pas...en 10 min et encore c'est déjà beaucoup vous aurez une interface d'administration &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;clean&lt;/span&gt; et flexible.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;Comment fonctionne cette &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;gem&lt;/span&gt; ?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Bah très simplement une fois l'installation effectuée, il suffit de spécifier les ressources qui font l'objet de cette administration, par ressource j'entends les modèles.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;En effet Active &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;admin&lt;/span&gt; se base sur les &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;modèles&lt;/span&gt; pour récupérer les différents champs et construire les différents formulaires, champs de recherche, filtres et autres outils.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;La commande a taper est &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;tres&lt;/span&gt; simple :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; rails g active_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;admin&lt;/span&gt;:&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;resource&lt;/span&gt; nom_du_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;model&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="blsp-spelling-error"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Prenez le temps de googler tout ça, vous ne le regretterez sûrement pas.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Quelques liens utiles : &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;a href="http://activeadmin.info/"&gt;http://activeadmin.info/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;a href="http://railscasts.com/episodes/284-active-admin"&gt;http://railscasts.com/episodes/284-active-admin&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;C'était moi...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-3394169086821824340?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/3394169086821824340/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/11/active-admin-ou-comment-avoir-une.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3394169086821824340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3394169086821824340'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/11/active-admin-ou-comment-avoir-une.html' title='Active Admin !!!'/><author><name>Khalil</name><uri>http://www.blogger.com/profile/09619044779363630864</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-muRCRS9idr4/TZ37R5XhXpI/AAAAAAAAACM/7qvfcjfw_qo/s220/33781_1683923026109_1478632835_2563544_2593074_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-7v8jErlEi6U/TsL-z60r8BI/AAAAAAAAAGw/T4WSiFK6TNY/s72-c/active_admin.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-3609534216703387831</id><published>2011-11-15T09:46:00.001Z</published><updated>2011-11-15T09:50:34.438Z</updated><title type='text'>Dakar Ruby Brigade : Meetup</title><content type='html'>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-j48rBwZEpXI/TsI04_llvaI/AAAAAAAAAWg/PYnAX1hehes/s1600/ruby_logo_text_bottom.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-j48rBwZEpXI/TsI04_llvaI/AAAAAAAAAWg/PYnAX1hehes/s1600/ruby_logo_text_bottom.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;Reprise des activités ce &lt;b&gt;Samedi&lt;/b&gt; &lt;b&gt;19&lt;/b&gt;&amp;nbsp;novembre 2011&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;a l'Ecole Supérieure Polytechnique de Dakar&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;a partir de &lt;b&gt;15&lt;/b&gt; h&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&amp;nbsp;Présentation sur &lt;b&gt;REST&lt;/b&gt; suvie d'un atelier&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-3609534216703387831?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/3609534216703387831/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/11/dakar-ruby-brigade-meetup.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3609534216703387831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3609534216703387831'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/11/dakar-ruby-brigade-meetup.html' title='Dakar Ruby Brigade : Meetup'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-j48rBwZEpXI/TsI04_llvaI/AAAAAAAAAWg/PYnAX1hehes/s72-c/ruby_logo_text_bottom.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-4008339028087785673</id><published>2011-10-03T10:50:00.000Z</published><updated>2011-10-03T13:59:39.909Z</updated><title type='text'>Sinatra 1.3.0 is out ! and it streams</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kNg6dMpIfbc/TRoEtSDYrJI/AAAAAAAAAIw/4q0LDm6esv4/s1600/sinatra.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="89" src="http://1.bp.blogspot.com/-kNg6dMpIfbc/TRoEtSDYrJI/AAAAAAAAAIw/4q0LDm6esv4/s320/sinatra.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonjour tout le monde,&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour ce mois d'Octobre la communauté Ruby nous fera beaucoup de beaux cadeaux ! Et ça a déjà commencé avec l'équipe Sinatra qui fait une "double" release : en sortant deux versions de sinatra : &lt;b&gt;1.2.7&lt;/b&gt; et la &lt;b&gt;1.3.0&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Les nouveautés !&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I - Sinatra-contrib&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sinatra a un très grand nombre d'extensions ( plugins ) et certaines ( tels que sinatra-content-for et sinatra-reloader) sont très utilisées. Ce qui a poussé l'équipe Sinatra à décider de les incorporer dans le "core" de sinatra et en faire un "third party component". Et de ce fait nous avons une grande partie des &lt;b&gt;helpers&lt;/b&gt; de Rails disponibles et qui fonctionnent de la même maniére. YOUPI !!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;II - "Sinatra recipes"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #111111; font-size: 16px; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Zachary Scott a (enfin) lancé son projet&amp;nbsp;"&lt;a href="http://recipes.sinatrarb.com/" style="color: black; text-decoration: underline;"&gt;Recipes&lt;/a&gt;". C'est en effet un ensemble de techniques, d'astuces et d'applications réalisées par les amoureux de Sinatra.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;III - Streaming&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La version "vanilla" ressemble à ça :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #111111; font-family: helvetica, sans-serif; font-size: 16px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f4f5f5; background-image: initial; background-origin: initial; border-bottom-color: rgb(213, 208, 210); border-bottom-style: solid; border-bottom-width: 2px; border-left-color: rgb(213, 208, 210); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(213, 208, 210); border-right-style: solid; border-right-width: 2px; border-top-color: rgb(213, 208, 210); border-top-style: solid; border-top-width: 2px; color: #111111; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 0.85em; line-height: 1.15; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em;"&gt;&lt;code style="color: #222222; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 1em;"&gt;get '/' do&lt;br /&gt;  stream do |out|&lt;br /&gt;    out &amp;lt;&amp;lt; "Ce sera vraiment ... -\n"&lt;br /&gt;    sleep 0.5&lt;br /&gt;    out &amp;lt;&amp;lt; " (vous attendez toujours ? :)) \n"&lt;br /&gt;    sleep 1&lt;br /&gt;    out &amp;lt;&amp;lt; "- SUPER !\n"&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La chose la plus cool dans cette abstraction est que cette fonctionnalité (streaming) n'est pas spécifique à un serveur Rack particulier ! Et oui ça marche partout ! Que votre serveur soit du type "evented" ( Ebb, Rainbows, thin) ou "sequential" (Unicorn, Mogrel ou passenger).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour le moment le seul serveur à ne pas utiliser est WEBrick! Et ne me demandez pas pourquoi :)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Un truc super intéressant : si vous utilisez un serveur "evented" ( thin par exemple ) vous pourrez garder la connexion active et avoir facilement un "messaging service" et de facto votre applicatoin devient plus rapide.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #111111; font-family: helvetica, sans-serif; font-size: 16px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f4f5f5; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(213, 208, 210); border-bottom-style: solid; border-bottom-width: 2px; border-left-color: rgb(213, 208, 210); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(213, 208, 210); border-right-style: solid; border-right-width: 2px; border-top-color: rgb(213, 208, 210); border-top-style: solid; border-top-width: 2px; color: #111111; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 0.85em; line-height: 1.15; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em;"&gt;&lt;code style="color: #222222; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 1em;"&gt;set :server, :thin&lt;br /&gt;connections = []&lt;br /&gt;&lt;br /&gt;get '/' do&lt;br /&gt;  # garder la connexion active&lt;br /&gt;  stream(:keep_open) { |out| connections &amp;lt;&amp;lt; out }&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;post '/' do&lt;br /&gt;  # Envoyer un message à tous les canaux (connexions) ouverts &lt;br /&gt;  connections.each { |out| out &amp;lt;&amp;lt; params[:message] &amp;lt;&amp;lt; "\n" }&lt;br /&gt;  "message envoyé "&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;NB : Tout cela est fait sans l'utilisation des "Fibers". Ce qui permet d'éviter de saturer la stack.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Il est à noter aussi que l'ajout du PATCH HTTP permettra d'accéler certains requêtes ( mise à jour surtout). Merci à l'équipe GitHub.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #111111; font-family: helvetica, sans-serif; font-size: 16px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f4f5f5; background-image: initial; background-origin: initial; border-bottom-color: rgb(213, 208, 210); border-bottom-style: solid; border-bottom-width: 2px; border-left-color: rgb(213, 208, 210); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(213, 208, 210); border-right-style: solid; border-right-width: 2px; border-top-color: rgb(213, 208, 210); border-top-style: solid; border-top-width: 2px; color: #111111; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 0.85em; line-height: 1.15; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em;"&gt;&lt;code style="color: #222222; font-family: 'lucida console', monaco, 'andale mono', 'bitstream vera sans mono', consolas, monospace; font-size: 1em;"&gt;patch '/' do&lt;br /&gt;  # ... modifier une ressource devient facile, rapide et toujours secure&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Les tests sont toujours les mêmes :)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonne semaine !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-4008339028087785673?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/4008339028087785673/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/10/sinatra-130-is-out-and-it-streams.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4008339028087785673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4008339028087785673'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/10/sinatra-130-is-out-and-it-streams.html' title='Sinatra 1.3.0 is out ! and it streams'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-kNg6dMpIfbc/TRoEtSDYrJI/AAAAAAAAAIw/4q0LDm6esv4/s72-c/sinatra.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-9148056661576651639</id><published>2011-09-01T09:19:00.000Z</published><updated>2011-09-01T09:19:40.811Z</updated><title type='text'>Sortie de Rails 3.1</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; line-height: 21px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2 style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-size: 2.1428em; font-weight: bold; line-height: 1em; margin-bottom: 0.2333em; margin-left: 0px; margin-right: 0px; margin-top: 0.7em; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 2.1428em; font-weight: bold; line-height: 1em; margin-bottom: 0.2333em; margin-left: 0px; margin-right: 0px; margin-top: 0.7em; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;Ruby on Rails &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;3.1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt; : Les nouveautés&lt;/span&gt;&lt;/h2&gt;&lt;div style="color: #333333;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; color: #333333; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AVsmTDB0CtI/Tl9MwXPpL9I/AAAAAAAAAV4/n_J2b8MqJz0/s1600/rails3.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-AVsmTDB0CtI/Tl9MwXPpL9I/AAAAAAAAAV4/n_J2b8MqJz0/s200/rails3.png" width="156" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-size: 14px; list-style-type: disc; margin-bottom: 1.5em; margin-left: 0px; margin-right: 1.5em; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://guides.rubyonrails.org/images/check_bullet.gif); background-origin: initial; background-position: 0% 0.5em; background-repeat: no-repeat no-repeat; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 1.1428em; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0.5em; padding-left: 1.75em; padding-right: 1.75em; padding-top: 0.5em;"&gt;Streaming&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://guides.rubyonrails.org/images/check_bullet.gif); background-origin: initial; background-position: 0% 0.5em; background-repeat: no-repeat no-repeat; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 1.1428em; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0.5em; padding-left: 1.75em; padding-right: 1.75em; padding-top: 0.5em;"&gt;Reversible Migrations&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://guides.rubyonrails.org/images/check_bullet.gif); background-origin: initial; background-position: 0% 0.5em; background-repeat: no-repeat no-repeat; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 1.1428em; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0.5em; padding-left: 1.75em; padding-right: 1.75em; padding-top: 0.5em;"&gt;Assets Pipeline&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://guides.rubyonrails.org/images/check_bullet.gif); background-origin: initial; background-position: 0% 0.5em; background-repeat: no-repeat no-repeat; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 1.1428em; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0.5em; padding-left: 1.75em; padding-right: 1.75em; padding-top: 0.5em;"&gt;jQuery as the default JavaScript library&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Helvetica, Arial, sans-serif; line-height: 21px;"&gt;&lt;div&gt;&lt;b&gt;Introduction à Rails 3 :&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://rubyonrails.org/screencasts/rails3"&gt;http://rubyonrails.org/screencasts/rails3&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quelques applications Rails 3.1 :&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-weight: normal; line-height: normal;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-weight: normal; line-height: normal;"&gt;&lt;a href="https://github.com/RailsApps"&gt;https://github.com/RailsApps&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quelques screencasts pour démarrer comprendre comment ça marche :&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;a href="http://railscasts.com/?tag_id=31"&gt;http://railscasts.com/?tag_id=31&lt;/a&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-9148056661576651639?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/9148056661576651639/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/09/sortie-de-rails-31.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/9148056661576651639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/9148056661576651639'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/09/sortie-de-rails-31.html' title='Sortie de Rails 3.1'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-AVsmTDB0CtI/Tl9MwXPpL9I/AAAAAAAAAV4/n_J2b8MqJz0/s72-c/rails3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-6793298389931862549</id><published>2011-07-28T12:08:00.000Z</published><updated>2011-07-28T12:08:23.402Z</updated><title type='text'>Tester son code Ruby : Minitest</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la programmation est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;activité super intéressante&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Chacun a sa&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;métaphore&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;préférée&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui explique&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ce que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;signifie pour lui&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la programmation&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Eh bien,&lt;/span&gt;&amp;nbsp;pour moi "l&lt;i&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;a programmation est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tout au &amp;nbsp;sujet&lt;/span&gt;&amp;nbsp;&lt;/i&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;d'automatisation&lt;/i&gt;".&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Vous êtes&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;devant votre&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ordinateur pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;lui apprendre à faire automatiquement&lt;/span&gt;&amp;nbsp;un&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;travail&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que vous savez&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;faire,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mais que vous ne voulez pas&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;faire&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;encore et encore&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Quand on s'en rend compte&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;, on cherche tout de suite&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;des&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;choses&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui &amp;nbsp;peuvent&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;être automatisées.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Je n'aime pas&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;me répéter&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;encore et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;encore et encore&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;C'est&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ennuyeux et parfois énervant!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Eh bien,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;il y a une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tâche particulière&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;liée&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à la programmation et&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui se répète tout le temps&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;:&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;&lt;/span&gt;"&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vérifier que votre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;logiciel fonctionne&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;!" Donc une tâche à automatiser.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&amp;nbsp;&amp;gt; &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;MINI&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;TEST&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Heureusement pour nous,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ruby a&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des outils fantastiques&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui vous permettent de&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mettre en place&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des tests pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;votre code&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que vous pouvez exécuter&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;automatiquement.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Vous pouvez vous éviter de perdre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;temps et de l'effort&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;en laissant&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'ordinateur&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;exécuter des milliers de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tests à chaque fois&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que vous modifiez&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;votre code.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Je ne vais pas&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;disserter sur&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les vertus du&lt;/span&gt;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;«&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;Test Driven Development&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;"&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;dans cet article&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mais &lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;écrire&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les premiers tests&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;Pour commener,&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;nous allons&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;prendre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un petit peu de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;code pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;travailler,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et je vais&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous montrer comment&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le tester en utilisant&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;minitest&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="color: #888888; font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="almost_half_cell" id="gt-res-content" style="padding-right: 16px; padding-top: 9px;"&gt;&lt;div dir="ltr" style="zoom: 1;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Pour cet exercice&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;, nous allons faire&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;quelque chose de simple et nous&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;concentrer&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sur les tests&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Nous allons écrire&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une classe&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ruby&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;appelée Membre&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Il&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;va falloir&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un tas de fonctionnalités&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;, mais voici&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les deux premières méthodes&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;, nous&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;aurons besoin&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;-&amp;gt; un membre peut ajouter d'autres membres en tant qu'amis&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;-&amp;gt; un membre peut savoir combien d'amis il a&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;-&amp;gt; quand il est nouveau, le nombre de ses amis est 0&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;-&amp;gt; quand il supprimer sa liste d'amis, il revient à 0 ami.&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;Très simple non ? Pour écrire ces tests nous allons utiliser une librairie Ruby appelée minitest. Elle est native dans Ruby1.9 mais si vous utiliser 1.8 installez la en faisant :&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&amp;gt; gem install minitest&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;Ecrivons notre premier test !&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: black; line-height: 24px;"&gt;require 'minitest/autorun'&lt;br /&gt;&lt;br /&gt;class TestMembre &amp;lt; MiniTest::Unit::TestCase&lt;br /&gt;  def setup&lt;br /&gt;    @membre = Membre.new&lt;br /&gt;  end&lt;br /&gt;  def test_pas_d_amis&lt;br /&gt;    assert_equal 0, @membre.nombre_amis&lt;br /&gt;  end&lt;br /&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #888888; font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="almost_half_cell" id="gt-res-content" style="padding-right: 16px; padding-top: 9px;"&gt;&lt;div dir="ltr" style="zoom: 1;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ok!&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Il ya&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;beaucoup de choses&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ici.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Prenons&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ligne par ligne&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Sur la première ligne&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;, nous avons un&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;«&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;require&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;».&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;La partie&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;'minitest/&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;autorun'&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;comprend tout ce dont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous avez besoin&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour exécuter vos tests&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;automatiquement.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black; font-family: 'Times New Roman'; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #888888; font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="almost_half_cell" id="gt-res-content" style="color: black; font-size: medium; padding-right: 16px; padding-top: 9px;"&gt;&lt;div dir="ltr" style="zoom: 1;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Tout ce dont nous&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;avons besoin&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour faire tourner&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nos tests&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est de taper&lt;/span&gt;&amp;nbsp;"ruby membre&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.rb"&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Mais&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;regardons&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le reste&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du fichier&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;avant de faire cela&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;La prochaine chose&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que nous faisons est&lt;/span&gt;&amp;nbsp;écrire&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une classe&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui hérite de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'une des&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;classes de base&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;minitest&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Voilà comment&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fonctionne&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;minitest&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;en exécutant&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une série de&lt;/span&gt;&amp;nbsp;T&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;estCases&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;. Minitest&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;permet également les&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tests de&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;groupe et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;en plusieurs fichiers&lt;span class="Apple-style-span"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;Dans notre TestCase nous avons 2 méthodes : setup et test_pas_d_amis. La méthode setup est exécutée automatiquement et avant chaque test. Elle permet de préparer le terrain pour réaliser les tests. La deuxiéme méthode permet de vérifier qu'un nouveau membre n'a pas encore d'amis.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;Lançons notre test et voyons ce que ça donne :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&amp;gt; ruby membre.rb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: black; line-height: 24px;"&gt;Loaded suite membre&lt;br /&gt;Started&lt;br /&gt;E&lt;br /&gt;Finished in 0.000853 seconds.&lt;br /&gt;&lt;br /&gt;1) Error:&lt;br /&gt;test_pas_d_amis(TestMembre):&lt;br /&gt;NameError: uninitialized constant TestMembre::CashRegister&lt;br /&gt;membre.rb:5:in `setup'&lt;br /&gt;&lt;br /&gt;1 tests, 0 assertions, 0 failures, 1 errors, 0 skips&lt;br /&gt;&lt;br /&gt;Test run options: --seed 36463&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;Waaaaw cool ! Comme vous pouvez le voir nous avons un test et un échec. Nous savons que les classes Ruby sont des constantes et il en manque une ici. Ecrivons cette classe alors.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;class Membre&lt;br /&gt;end&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="" id="result_box" lang="fr" style="color: #333333; display: block; font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: small;"&gt;&lt;div class="g-section" id="gt-res-tools" style="display: inline-block; font-family: arial, sans-serif; margin-top: 16px; vertical-align: top; width: 587px; zoom: 1;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Relançons le test :&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;1) Error:&lt;br /&gt;test_pas_d_amis(TestMembre):&lt;br /&gt;NoMethodError: undefined method `nombre_amis' for #&amp;lt;Membre:0x00000101032a80&amp;gt;&lt;br /&gt;membre.rb:9:in `test_pas_d_amis'&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;ça avance ! et cette fois ça nous dit qu'il manque une méthode.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;class Membre&lt;br /&gt;  def nombre_amis&lt;br /&gt;  end&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Relançons le test encore une fois.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;1) Failure:&lt;br /&gt;test_pas_d_amis(TestMembre) [membre.rb:9]:&lt;br /&gt;Expected 0, not nil.&lt;/span&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Erreur claire : On s'attend à 0 pas à nil&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;def nombre_amis&lt;br /&gt;  0&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Ok cool. Le test passe mais notre total est toujours fixe (0). Vérifions que quand on ajoute des amis, le nombre d'amis change.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;def test_calculer_nombre_amis&lt;br /&gt;  @membre.ajouter 1&lt;br /&gt;  @membre.ajouter 2&lt;br /&gt;  assert_equal 3, @register.nombre_amis&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;A ce stade, la visoin doit être un peu plus claire pour vous. Lançons nos tests encore une fois&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Loaded suite membre&lt;br /&gt;Started&lt;br /&gt;.E&lt;br /&gt;Finished in 0.000921 seconds.&lt;br /&gt;&lt;br /&gt;1) Error:&lt;br /&gt;test_calculer_nombre_amis(TestMembre):&lt;br /&gt;NoMethodError: undefined method `ajouter' for #&amp;lt;Membre:0x00000101031838&amp;gt;&lt;br /&gt;membre.rb:13:in `test_calculer_nombre_amis'&lt;br /&gt;&lt;br /&gt;2 tests, 1 assertions, 0 failures, 1 errors, 0 skips&lt;br /&gt;&lt;br /&gt;Test run options: --seed 54501&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Ok! vous voyez le ".E" sur la 3iéme ligne du résultat ? Ben ça veut dire qu'on a eu 2 tests, un réussi '.' et un échoué "E". &lt;/span&gt;&lt;br /&gt;Ajouter la méthode qui manque et continuons .&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;def ajouter(ami)&lt;br /&gt;  @amis &amp;lt;&amp;lt; ami&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Oups ! le @amis n'a pas encore été défini :) Lancez le test et il vous le dira. &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;def initialize&lt;br /&gt;  @amis = []&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Avec ce constructeur, nous n'aurons plus ce genre de problèmes. &lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="zoom: 1;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Relancez le test et vous aurez une erreur : le nombre d'amis est toujours 0 alors qu'il devait passer à 3 .&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Corrigeons ce petit souci:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;def nombre_amis&lt;br /&gt;  @amis.inject(0, &amp;amp;:+)&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;C'est fait. Alors pour vérifier que vous avez bien compris le truc, écrivez le dernier test : supprimer_liste_amis.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;.....&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Alors c'est quoi l'intérêt d'écrire les tests en premier ? Ben ça vous permet d'écrire le code qu'il faut pour répondre aux spécifications que contient votre cahier de charges d'une part et de vous assurer que votre logiciel fait exactement ce pour quoi il a été écrit.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Les mises à jour du code deviennent chose simple. Et quand il a un problème on sait que c'est le nouveau code qui a cassé quelque chose surtout que le "code base" était digne de confiance.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;Dans la suite de cette série d'articles sur les tests, nous allons intégrer les tests à des applications Rails et Sinatra.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-6793298389931862549?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/6793298389931862549/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/tester-son-code-ruby-minitest.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6793298389931862549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6793298389931862549'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/tester-son-code-ruby-minitest.html' title='Tester son code Ruby : Minitest'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-7744727349241908090</id><published>2011-07-19T21:26:00.011Z</published><updated>2011-07-22T09:50:47.705Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='administrations de vos applications Rails'/><title type='text'>Rails Admin</title><content type='html'>&lt;div style="text-align: justify;"&gt;Salut !!!!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Pas la peine  de chauffer vos méninges en cherchant  des tutos pour installer &lt;a href="http://demo.railsadmin.org/admin"&gt;Rails Admin&lt;/a&gt; dans vos applications Rails.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;je l'ai fait pour vous.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Créons une petite application Rails ,et ajoutons a cette merveille une autre merveille: l'interface d'administration.&lt;br /&gt;&lt;br /&gt;Pour ce faire nous utilisons:&lt;/div&gt;&lt;br /&gt;&lt;div style="height: 60px;"&gt;&lt;ul&gt;&lt;li&gt;rails 3.0.9&lt;/li&gt;&lt;li&gt;rails_admin 0.0.1 (version actuellement présente sur github)&lt;/li&gt;&lt;li&gt;ruby 1.9.2&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;commençons par créer notre projet&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 40px;"&gt;$rails new railsAdminProject&lt;br /&gt;$cd railsAdminProject&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;éditons le fichier  &lt;span style="font-weight: bold;"&gt;Gemfile&lt;/span&gt; de notre application&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$vim Gemfile&lt;br /&gt;&lt;/div&gt; &lt;br /&gt; et ajoutons les gems nécessaires&lt;br /&gt;&lt;div style="background-color: rgb(155, 160, 157); border: 1px solid rgb(0, 0, 0); height: 45px;"&gt;&lt;span style="color:green;"&gt;gem &lt;/span&gt;&lt;span style="color: rgb(200, 62, 2);"&gt;'devise'&lt;/span&gt; &lt;br /&gt; &lt;span style="color:green;"&gt;gem&lt;/span&gt; &lt;span style="color: rgb(200, 62, 2);"&gt;'rails_admin'&lt;/span&gt;, &lt;span style="color:green;"&gt;:git =&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(200, 62, 2);"&gt;'git://github.com/sferik/rails_admin.git'&lt;/span&gt;&lt;/div&gt;&lt;br /&gt; installons les dépendances / gems de notre application :&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$bundle install&lt;/div&gt;&lt;br /&gt;Pour avoir le mode d'utilisation du générateur de rails_admin, faire un listing de tous les générateurs intégrés à notre application.&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rails generate&lt;/div&gt;&lt;br /&gt;à la fin du listing des générateurs  nous retrouvons ceux de rails admin.&lt;br /&gt;&lt;div style="background-color: rgb(155, 160, 157); border: 1px solid rgb(0, 0, 0); height: 85px;"&gt;&lt;span style="color:green;"&gt;RailsAdmin:&lt;br /&gt;          rails_admin&lt;br /&gt;          rails_admin:install_migrations&lt;br /&gt;          rails_admin:uninstall_migrations&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;exécutons le générateur de rails admin:&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rails generate rails_admin&lt;/div&gt;&lt;br /&gt; une suite d'instruction apparaît, spécifiant comment installer rails_admin:&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rake  rails_admin:install&lt;/div&gt;&lt;br /&gt; créons les tables en base de données, nécessaire a l'application rails_admin.&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rake db:migrate&lt;/div&gt;&lt;br /&gt;démarrons le serveur&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rails server&lt;/div&gt;&lt;br /&gt;Sur la  barre d'adresses sasire l'URL: &lt;span style="color: rgb(51, 102, 255);"&gt;http://localhost:3000/admin&lt;/span&gt;. Vous êtes redirigé vers la page de login.&lt;br /&gt;&lt;br /&gt; Jusqu'ici aucun utilisateur n'est enregistré pour l'administration, donc faut s'enregistrer (sign up)  en renseignant les informations demandées (email,password, confirmation de password).&lt;br /&gt;&lt;br /&gt; BINGOOOO !!!!!. vous y êtes, dans l'interface d'administration Rails_admin de votre application.&lt;br /&gt;&lt;br /&gt; &lt;span style="font-style: italic; font-weight: bold;"&gt;Tests du fonctionnement de l'interface d'administration.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En utilisant le générateur &lt;a href="http://en.wikipedia.org/wiki/Scaffold_%28programming%29"&gt;&lt;span style="font-weight: bold;"&gt;scaffold&lt;/span&gt;&lt;/a&gt;, ajoutons la gestion des produits à notre application rails&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rails generate scaffold Produit nom:string details:string&lt;/div&gt;&lt;br /&gt; générons les migrations nécessaires au modèle Produit&lt;br /&gt;&lt;div style="background-color: rgb(220, 225, 200); border: 1px solid rgb(0, 0, 0); height: 20px;"&gt;$rake  db:migrate&lt;/div&gt;&lt;br /&gt; Allons sur l'interface d'admninistration(&lt;span style="color: rgb(102, 51, 255);"&gt;http://localhost:3000/admin&lt;/span&gt;) rails_admin, nous avons une onglet pour la gestion des Produits.&lt;br /&gt;&lt;br /&gt;BANG !!!! vous pouvez administrer vos produits, et tous les modèles que vous ajoutez a votre application RoR.&lt;br /&gt;&lt;br /&gt;Bon heiiinnn !!!!. je vous laisse découvrir les fonctionnalités de Rails_admin. C'est trop cool !!!.&lt;br /&gt;&lt;br /&gt;A une prochaine fois.  Si je découvre d'autres choses sur Rails Admin je vous ferai signe.&lt;br /&gt;&lt;br /&gt;A plus !!!!!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-7744727349241908090?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/7744727349241908090/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/rails-admin.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7744727349241908090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7744727349241908090'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/rails-admin.html' title='Rails Admin'/><author><name>aristide</name><uri>http://www.blogger.com/profile/04955142758820386056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-4538039661940875569</id><published>2011-07-19T09:44:00.001Z</published><updated>2011-07-19T16:40:21.619Z</updated><title type='text'>Ecrire un DSL en Ruby</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Bonjour,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Je m'excuse de pas avoir publié cet article hier ( le lundi ) comme le veut la coutume :) J'étais dans l'embarras du choix du sujet à aborder cette semaine. Et vu que je suis en train de développer une API pour un domaine assez "spécifique" qui a son propre jargon j'ai (enfin) eu une idée : comment écrire un jargon en Ruby.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Dans le monde de l'informatique un jargon est dit DSL.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;Les DSL et Ruby&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ruby&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fournit quelques&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fantastiques&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fonctionnalités natives pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la création&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Domain Specific&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Languages&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;​​(DSL)&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Un&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Domain Specific Language&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;comme un&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;langage de programmation écrit pour un domaine déterminé&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;C'est une façon&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;d'exposer les&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fonctionnalités dans un&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;format simple et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;lisible pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les autres programmeurs&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;(ou&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous-même)&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Un des&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;DSL&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les plus couramment utilisés&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;dans le monde&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ruby est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Sinatra.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;require 'rubygems'&lt;br /&gt;require 'sinatra'&lt;br /&gt;&lt;br /&gt;get '/hello' do&lt;br /&gt;  "Hello world."&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Sinatra&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est un&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;DSL&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour créer des applications&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;web.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Sa syntaxe est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;construite&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sur la base des&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;verbes HTTP&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tels que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;GET, POST,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et PUT&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;En exposant&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les fonctionnalités&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de cette manière&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;, le code est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;beaucoup plus lisible et beaucoup plus parlant surtout quand on sait comment fonctionne le web en général.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" style="font-size: large;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;un peu de&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;Yield&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est un concept très&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;important à comprendre pour réussir&lt;/span&gt;&amp;nbsp;à créer&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;DSL&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Ruby.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;La fonctionnalité fournie&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;par yield&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;permet à un développeur&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de faire passer&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le contrôle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;temporairement&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour permettre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'éxécution d'un autre bout de code&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Si vous avez déjà&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;utilisé le&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Array#map&lt;/span&gt;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;ou Array&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;#collect&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un exemple intéressant de l'utilisation de yield&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, 'Times New Roman', Times, serif;"&gt;&lt;/div&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;[1, 2, 3].map{|i| i + 1} # =&amp;gt; [2, 3, 4]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Alors comment pourrions-nous ré-implémenter la fonctionnalité carte si ce n'était pas fait pour nous? C'est en fait assez simple en utilisant yield :&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;class Array&lt;br /&gt;  def my_map&lt;br /&gt;    resultat = []&lt;br /&gt;    self.each do |truc|&lt;br /&gt;      resultat &amp;lt;&amp;lt; yield(truc)&lt;br /&gt;    end&lt;br /&gt;    resultat&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;[1, 2, 3].my_map{|i| i + 1} # =&amp;gt; [2, 3, 4]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;arrête&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;essentiellement&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'évaluation(éxécution)&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de la méthode&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et évalue&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le bloc&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;passé&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'appelant avec&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les arguments&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fournis dans&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la déclaration&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de yield&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;lui-même.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Donc, si j'avais&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une méthode qui&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;simplement retournait&lt;/span&gt;&amp;nbsp; ce qu'on lui passe en&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;arguments&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;, ça&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ressemblerait à ça&amp;nbsp;&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;def confesser( argument )&lt;br /&gt;  yield argument&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;confesser(" Ruby c'est magnifique !") do |arg|&lt;br /&gt;  puts arg&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# Sortie : "Ruby c'es magnifique !"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;Yield&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0c343d;"&gt; et les DSLs&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Maintenant, en utilisant&lt;/span&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;yield&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nous avons les bases&lt;/span&gt;&amp;nbsp;pour&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;créer&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un &lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;DSL simple.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&amp;nbsp;Je sais pas pour vous mais moi j'ai faim ! Donc&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nous&lt;/span&gt;&amp;nbsp;allons&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;créer un&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;DSL&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour décrire&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les recettes de cuisine&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Nous voulons être&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;en mesure de créer des recettes, d'&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;ajouter des ingrédients&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ainsi que les étapes&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;, et avoir un joli affichage de tout ça&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp; Au boulot now&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;class Recette&lt;br /&gt;  attr_accessor :nom, :ingredients, :instructions&lt;br /&gt;&lt;br /&gt;  def initialize(nom)&lt;br /&gt;    self.nom = nom&lt;br /&gt;    self.ingredients = []&lt;br /&gt;    self.instructions = []&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def to_s&lt;br /&gt;    affichage = nom&lt;br /&gt;    affichage &amp;lt;&amp;lt; "\n#{'=' * nom.size}\n\n"&lt;br /&gt;    affichage &amp;lt;&amp;lt; "Ingredients: #{ingredients.join(', ')}\n\n"&lt;br /&gt;&lt;br /&gt;    instructions.each_with_index do |instruction, index|&lt;br /&gt;      affichage &amp;lt;&amp;lt; "#{index + 1}) #{instruction}\n"&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    affichage&lt;br /&gt;  end&lt;br /&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Now&amp;nbsp;ajoutons une recette :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;plat = Recette.new("Omelette")&lt;br /&gt;&lt;br /&gt;plat.ingredients &amp;lt;&amp;lt; "Oeufs"&lt;br /&gt;plat.ingredients &amp;lt;&amp;lt; "beurre"&lt;br /&gt;plat.ingredients &amp;lt;&amp;lt; "fromage"&lt;br /&gt;plat.ingredients &amp;lt;&amp;lt; "autres trucs "&lt;br /&gt;&lt;br /&gt;plat.instructions &amp;lt;&amp;lt; "Beurre dans poêle"&lt;br /&gt;plat.instructions &amp;lt;&amp;lt; "ouefs ..."&lt;br /&gt;plat.instructions &amp;lt;&amp;lt; "fromage ..."&lt;br /&gt;plat.instructions &amp;lt;&amp;lt; "la suite certainement ..."&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Now faisons un "puts plat"! ça doit donner :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;Plat&lt;br /&gt;====&lt;br /&gt;&lt;br /&gt;Ingredients: Oeufs, beurre, fromage, autres trucs&lt;br /&gt;&lt;br /&gt;1) Beurre dans poêle&lt;br /&gt;2) ouefs ...&lt;br /&gt;3) fromage ...&lt;br /&gt;4) la suite certainement ...&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Bien que cela&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fonctionne&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;, le code ne&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;semble pas être&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;élégant&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;!&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;Nous avons besoin d'&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;un moyen de faire&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ressembler à ce qu'on peut&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;voir sur une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;carte de recette&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;Rendons le code un peu plus beau&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;. Pour commencer&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;, nous allons&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;réécrire&lt;/span&gt;&amp;nbsp;le constructeur et yield&amp;nbsp;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;def initialize(nom)&lt;br /&gt;  self.nom = nom&lt;br /&gt;  self.ingredients = []&lt;br /&gt;  self.instructions = []&lt;br /&gt;&lt;br /&gt;  yield self&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Next,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nous devons ajouter&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;quelques méthodes&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ajouter des ingrédients&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et des instructions&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à la recette :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;def ingredient(nom, options = {})&lt;br /&gt;  ingredient = nom&lt;br /&gt;  ingredient &amp;lt;&amp;lt; " (#{options[:quantite]})" if options[:quantite]&lt;br /&gt;&lt;br /&gt;  ingredients &amp;lt;&amp;lt; ingredient&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def instruction(texte, options = {})&lt;br /&gt;  etape = texte&lt;br /&gt;  etape &amp;lt;&amp;lt; " (#{options[:pendant]})" if options[:pendant]&lt;br /&gt;&lt;br /&gt;  instructions &amp;lt;&amp;lt; etape&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela nous permet de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;créer une recette&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;d'une manière beaucoup&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;plus naturelle&amp;nbsp;&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;nouilles_au_fromage = Recette.new("Nouilles au fromage") do |r|&lt;br /&gt;  r.ingredient "Eau",      :quantite =&amp;gt; "2 verres"&lt;br /&gt;  r.ingredient "Nouilles", :quantite =&amp;gt; "1 verre"&lt;br /&gt;  r.ingredient "Fromage",  :quantite =&amp;gt; "3 &lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: black; font-family: arial, sans-serif; font-size: x-small; line-height: 16px; white-space: normal;"&gt;&lt;em style="font-style: normal;"&gt;cuillères&lt;/em&gt;&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;  r.step "L'eau sur le feu",      :pendant =&amp;gt; "5 minutes"&lt;br /&gt;  r.step "Ajouter les nouilles.", :pendant =&amp;gt; "6 minutes"&lt;br /&gt;  r.step "Enlever l'eau."&lt;br /&gt;  r.step "Mélanger le fromage aux nouilles."&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;"puts nouilles_au_fromage" donnera :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; clear: both; color: #111111; font-family: Consolas, 'Andale Mono', Monaco, Courier, 'Courier New', Verdana, sans-serif; font-size: 0.75em; line-height: 1.5em; margin-bottom: 2em; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0.75em; padding-left: 1em; padding-right: 1em; padding-top: 0.75em;"&gt;Nouilles au fromage&lt;br /&gt;===================&lt;br /&gt;&lt;br /&gt;Ingredients: au (2 verres), Nouilles (1 verre), Fromage (3 cuillères)&lt;br /&gt;&lt;br /&gt;1) L'eau sur le feu. (5 minutes)&lt;br /&gt;2) Ajouter les nouilles. (6 minutes)&lt;br /&gt;3) Enlever l'eau.&lt;br /&gt;4) Mélanger le fromage aux nouilles.&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Et voilà ! le petit déjeuner est servi.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Nous verrons dans la suite comment rendre ce DSL plus joli et plus proche du langages des chefs cuisiniers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #134f5c; font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;Conclusion :&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Nous avons appris à écrire un DSL en Ruby et nous n'avons utilisé qu'une seule méthode ( Yield ). Dans la suite de cet article nous utiliserons d'autres merveilles de Ruby.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonne journée&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-4538039661940875569?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/4538039661940875569/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/ecrire-un-dsl-en-ruby.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4538039661940875569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4538039661940875569'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/ecrire-un-dsl-en-ruby.html' title='Ecrire un DSL en Ruby'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-2165628649767141057</id><published>2011-07-11T23:02:00.002Z</published><updated>2011-07-11T23:11:02.499Z</updated><title type='text'>Unitialized constant Rake....</title><content type='html'>Salut tout le monde euh c'est moi....&lt;div&gt;Bon si suis la c'est juste pour donner une astuce relative à cette erreur lorsque vous essayez de faire un &lt;i&gt;rake db:migrate &lt;/i&gt;ou un &lt;i&gt;rake db:create, &lt;/i&gt;Bah il semblerait que le fait de mettre à jour rake à la version 0.9.2 pose un certain nombre de soucis....&lt;/div&gt;&lt;div&gt;Bon bon voici la solution si vous utilisez rake 0.8.7 faites un bundle rake update et passer à la version 0.9.2, ensuite allez éditer votre rakefile et ajouter ceci :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;require 'rake'&lt;/div&gt;&lt;div&gt;require 'rake/dsl_definition'&lt;/div&gt;&lt;div&gt;module ::Nom_de_votre_application&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; class Application &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;include Rake::DSL &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;end &lt;/div&gt;&lt;div&gt;end&lt;/div&gt;&lt;div&gt;Nom_de _votre_application::Application.load_tasks&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;et voila le tour est joué&lt;/div&gt;&lt;div&gt;bon ben c'etait moi....:-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-2165628649767141057?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/2165628649767141057/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/unitialized-constant-rake.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/2165628649767141057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/2165628649767141057'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/unitialized-constant-rake.html' title='Unitialized constant Rake....'/><author><name>Khalil</name><uri>http://www.blogger.com/profile/09619044779363630864</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-muRCRS9idr4/TZ37R5XhXpI/AAAAAAAAACM/7qvfcjfw_qo/s220/33781_1683923026109_1478632835_2563544_2593074_n.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-6004953978543658955</id><published>2011-07-05T12:42:00.000Z</published><updated>2011-07-05T12:42:03.540Z</updated><title type='text'>Sinatra au meetup DakarLUG ce samedi 09 juillet</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RGaTPPMaeFc/ThMGIHR7FkI/AAAAAAAAAS4/qfytz6cFsEg/s1600/affiche_dakarlug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-RGaTPPMaeFc/ThMGIHR7FkI/AAAAAAAAAS4/qfytz6cFsEg/s640/affiche_dakarlug.png" width="529" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Introduction à Sinatra au meetup DakarLUG ce samedi 09 juillet suivie d'un atelier pour écrire une première vraie application &lt;b&gt;web&lt;/b&gt; avec Sinatra munie d'une &lt;b&gt;API&lt;/b&gt; REST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-6004953978543658955?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/6004953978543658955/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/sinatra-au-meetup-dakarlug-ce-samedi-09.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6004953978543658955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6004953978543658955'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/07/sinatra-au-meetup-dakarlug-ce-samedi-09.html' title='Sinatra au meetup DakarLUG ce samedi 09 juillet'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RGaTPPMaeFc/ThMGIHR7FkI/AAAAAAAAAS4/qfytz6cFsEg/s72-c/affiche_dakarlug.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-8280222275503706993</id><published>2011-06-27T10:24:00.000Z</published><updated>2011-06-27T10:24:55.358Z</updated><title type='text'>Authentication System : part 2</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonjour,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Dans la première partie de cet article, nous avons vu comment chiffrer les informations de connexion d'un utilisateur avant de les stocker dans la base de données; et nous avions une méthode login qui nous permet de comparer des signatures de mots de passe. Donc nous avions un systéme de SignUp/SignIn assez utilisable mais qui reste indépendant de notre application. C'était le but c'est vrai.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Aujourd'hui nous allons utiliser ce système pour sécuriser notre application.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;On veut que seules les pages d'accueil et de connexion soient accéssibles aux gens pas encore connectés. Et pour celà nous allons utiliser ce qu'on appelle des filtres.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Les filtres sont des .......... voir wikipedia :)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;class&lt;/span&gt; AppController &amp;lt; ApplicationController&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&amp;nbsp; before_filter&lt;/span&gt; :logged_in, &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;:except&lt;/span&gt; =&amp;gt; [:index, :login]&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt; index&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;# ....&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp; # ... la suite du contrôleur&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Trebuchet MS', sans-serif;"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Une fois que Rails voit le &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;before_filter&lt;/span&gt; dans notre contrôleur, il effectue plusieurs choses : passer la main à la méthode appelée ( &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;logged_in&lt;/span&gt; dans notre cas ) et attend que cette méthode lui donne une réponse claire : &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;True&lt;/span&gt; ou &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;False&lt;/span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Une fois que la réponse est là, il lit le reste du bloc de code et l'exécute.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Nous remarquerons certainement que la méthode &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;logged_in&lt;/span&gt; n'a pas encore été définie. Alors où est ce qu'on doit la définir ? dans un endroit où elle sera accessible par toutes les entités de notre application : contrôleurs et vues. Nous verons pourquoi plus tard inchaallah.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Trebuchet MS', sans-serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;class&lt;/span&gt; ApplicationController &amp;lt; ActionController::Base&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #990000;"&gt;helper_method&lt;/span&gt; :connected?, :logged_in&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt; connected?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;return&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;true&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;if&lt;/span&gt; session[:&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;utilisateur&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt; logged_in&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;if&lt;/span&gt; !connected?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;redirect_to&lt;/span&gt; login_path&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; flash[:&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;message&lt;/span&gt;]= &lt;span class="Apple-style-span" style="color: #38761d;"&gt;" Désolé ! Accés refusé"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Trebuchet MS', sans-serif;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Du nouveau ! En plus de l'utilisation de méthodes privées nous avons utilisé une nouvelle méthode : &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;helper_method&lt;/span&gt; !&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Alors que fait cette méthode ?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Elle permet de rendre disponible une méthode dans le scope de vues ! C'est tout ce que nous avons besoin de dire et de savoir à ce stade.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Et maintenant dans nos vues on peut s'amuser à faire :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;lt;% &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;if&lt;/span&gt; logged_in %&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;nbsp;Bonjour&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;lt;% &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;else&lt;/span&gt; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp; &amp;lt;%= &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;link_to&lt;/span&gt; " &lt;span class="Apple-style-span" style="color: #38761d;"&gt;connexion&lt;/span&gt; ", login_path %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;lt;% &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Merci et bonne semaine.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-8280222275503706993?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/8280222275503706993/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/authentication-system-part-2.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8280222275503706993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8280222275503706993'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/authentication-system-part-2.html' title='Authentication System : part 2'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-7833979585460397229</id><published>2011-06-24T12:36:00.000Z</published><updated>2011-06-24T12:36:47.626Z</updated><title type='text'>Le rendez-vous des experts: Ruby On Rails</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-UBEmH4MJVU0/S_qOT7HEH7I/AAAAAAAAAEo/K2S_ITPIs-Y/s1600/rails_logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-UBEmH4MJVU0/S_qOT7HEH7I/AAAAAAAAAEo/K2S_ITPIs-Y/s200/rails_logo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Une introduction à Ruby On Rails !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Le framework qui continue de révolutionner le monde du web présenté par un étudiant de SUPINFO France. Il essaie de couvrir tout ce qu'il faut savoir pour démarrer .&lt;/span&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/KrQANtmmHNo" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-7833979585460397229?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/7833979585460397229/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/le-rendez-vous-des-experts-ruby-on.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7833979585460397229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7833979585460397229'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/le-rendez-vous-des-experts-ruby-on.html' title='Le rendez-vous des experts: Ruby On Rails'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-UBEmH4MJVU0/S_qOT7HEH7I/AAAAAAAAAEo/K2S_ITPIs-Y/s72-c/rails_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-8895969745978607305</id><published>2011-06-24T11:57:00.000Z</published><updated>2011-06-24T11:57:19.208Z</updated><title type='text'>Authentication system for Rails applications</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonjour,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Aujourd'hui on va parler d'un problème que nous rencontrons à chaque fois que nous devons développer une application web avec un accès contrôlé.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Je veux dire par "accès contrôlé" que nous avons besoin d'être authentifié pour pouvoir effectuer certaines opérations.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Nous avons besoin de savoir qui fait quoi ! Ce qui nous pousse à protéger certaines sections de notre application supposées être réservées aux membres.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour réaliser une telle tâche on a souvent recours aux "solutions" prêtes. Ces solutions sont souvent des &lt;b&gt;gems&lt;/b&gt;/&lt;b&gt;plugins&lt;/b&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;L'avantage de ces solutions c'est qu'elles ont été testées et améliorées par des milliers de programmeurs.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Leur plus grande faiblesse est que souvent elles ne sont pas faites pour vous spécialement. Ce qui rend la personnalisation de ces solutions un peu difficile. Car pour modifier le workflow défini par défaut il faut avoir une très bonne connaissance du langage &lt;b&gt;Ruby &lt;/b&gt;pour éviter de faire du n'importe quoi et aussi savoir comment les plugins &lt;b&gt;Rails &lt;/b&gt;sont conçus.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Nous n'allons pas entrer dans ce sujet car trop vaste et c'est un peu tôt pour nous de l'aborder.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Alors ! Et si on veut développer notre propre solution, comment faire ?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Une solution d'authentification doit être sûre, évolutive et facile à modeler. Et pour ce faire elle doit être totalement indépendante du reste de l'application.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rfViwXOfG6A/TgR7W_g95VI/AAAAAAAAASE/zIsQbJM7CHI/s1600/login.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/-rfViwXOfG6A/TgR7W_g95VI/AAAAAAAAASE/zIsQbJM7CHI/s200/login.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Je vais partager avec vous ma façon de faire. Elle est très simple. Elle consiste en l'enregistrement de la signature du mot de passe et de la clé utilisée pour chiffrer. Donc les mots de passes enregistrés dans la base de données sont indéchiffrables en cas d'attaque sur votre serveur de bases de données.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;The Model&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour utiliser ce modéle dans vos applications, vous aurez juste besoin d'avoir les attributs suivants : &lt;b&gt;login&lt;/b&gt;, &lt;b&gt;hashed_password&lt;/b&gt; et &lt;b&gt;salt &lt;/b&gt;qui représentent l'identifiant de l'utilisateur, le mot de passe crypté et la clé de cryptage.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1044624.js?file=model_utilisateur.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Et le processus de création d'un nouveau compte reste le même !&lt;/span&gt;&lt;br /&gt;&amp;nbsp;Utisateur.create(:attributs)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;The controller &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Et dans mon contrôleur j'ai mes méthodes de &lt;b&gt;login&lt;/b&gt; et de &lt;b&gt;logout.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1044630.js?file=controller.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;The view&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1044632.js?file=login.html.erb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A ce stade nous avons un systéme de login/logout et création d'un nouveau compte utilisateur avec cryptage de mots de passe. Cette solution est très simple facile à embarquer dans toutes vos applications Rails.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-8895969745978607305?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/8895969745978607305/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/authentication-system-for-rails.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8895969745978607305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8895969745978607305'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/authentication-system-for-rails.html' title='Authentication system for Rails applications'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-rfViwXOfG6A/TgR7W_g95VI/AAAAAAAAASE/zIsQbJM7CHI/s72-c/login.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-7045662599855606071</id><published>2011-06-08T14:26:00.000Z</published><updated>2011-06-08T14:26:33.897Z</updated><title type='text'>Understanding Rack 2 : les middlewares</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bonjour,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Aujourd'hui, à mon réveil, j'ai senti une envie folle de coder. Donc après avoir pris ma douche, prié et pris mon petit déjeuner ( j'aurais pu vous inviter ! je sais ), je suis entré dans mon repertoire "Projets" et je suis tombé sur "Rack applications" et là je me suis rappelé que je vous dois la suite de la série "Understanding Rack" que j'ai commencée il y a quelques semaines déjà.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://rubyusergroup.blogspot.com/2011/02/understanding-rack.html"&gt;L'épisode 1&lt;/a&gt; de cette série introduit Rack, son utilité et ses bases. Je vous conseiller de le lire avant de continuer avec cet article.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Dans cet épisode nous allons savoir ce qu'est un middleware Rack, à quoi il sert, comment en créer et surtout comment l'utiliser dans une application en production (ou en dév).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;Rack middleware ?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;un middleware rack est "juste" une application Rack qui a connaissance de l'existence d'autres applications Rack. J'explique ! Quand un middleware rack est invoqué, il peut passer la main à d'autres middlewares/applications pour des traitements spécifiques.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace;"&gt;Exemple par le code :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;module&lt;/span&gt; Rack&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;class&lt;/span&gt; MonMiddleware&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt; initialize(&lt;i&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;app&lt;/span&gt;&lt;/i&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;@app&lt;/span&gt; = &lt;i style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;app&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt; call(&lt;i&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;env&lt;/span&gt;&lt;/i&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;if&lt;/span&gt; &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;@app&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;status, headers, body = &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;@app&lt;/span&gt;.call(&lt;i&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;env&lt;/span&gt;&lt;/i&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;[&lt;/b&gt; status, header, body &lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Courier New', Courier, monospace;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Le code est assez simple et clair. Nous avons une application Rack qui "peut" passer la main à une autre application si cette dernière utilise ce middleware.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Donc, en résumé, un middleware Rack est une application utilisable par les applications Rack. Oui ! c'est tout ! ( pour le moment ).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Et pour donner un peu plus de "valeur" ou d'importance aux middlewares, nous allons parler de Rack::Restrictor.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;un peu d'histoire !&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Il y a quelques mois, pour le compte du SUP'Management Mauritanie, &amp;nbsp;j'ai dû écrire un petit middleware pour protéger certaines sections de leur SI.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Ils ont en place une application ( Rails ) appelée RubyCampus qui leur permet de gérer leurs étudiants, les enseignants, la paie, la gestion des examens et tout le tralala. Evidement ces modules ne sont pas tous développés par la communauté RubyCampus.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;Le problème !&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Après quelques mois d'utilisation ils se rendent compte qu'ils doivent restreindre l'accès à certaines parties de l'application à "leur équipe" d'informaticiens. Mais comment le faire ? Avoir deux &amp;nbsp;sous-applications : une pour les étudiants et une pour l'administration ? comment s'assurer que les étudiants ne pourront accéder qu'à "leur" application ?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;la solution adoptée !&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour régler ce problème, on a proposé que le staff devant accéder à la partie Admin soit dans un réseau et que seules les machines dans ce réseau pouvaient avoir accès à la section en question.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Mettre en place un tel réseau est chose aisée certainement ! Now la partie logicielle!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La solution a été un middleware appelé &lt;b&gt;Rack::Restrictor &lt;/b&gt;que vous pouvez télécharger &lt;a href="https://rubygems.org/gems/rack_restrictor"&gt;ici&lt;/a&gt;. Il permet de spécifier la plage d'adresses ip acceptées et il se charge du reste.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Très simple comme solution mais ça marche.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;voici le code :&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/728191.js?file=rack_restrictor.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Ok cool ! mais comment utilise-t-on un middleware Rack ?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Simple ! On va utiliser les fonctions du Rack::Builder !&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;( &lt;b&gt;VOUS&lt;/b&gt;( certainement ) :hé ho c'est quoi Rack::Builder ? ...&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;b&gt;&amp;nbsp; Moi :&lt;/b&gt; on en reparlera plus tard )&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Rack::Builder n'a que trois (3) méthodes : &lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;map&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;use&lt;/span&gt;&lt;/b&gt; et &lt;span class="Apple-style-span" style="color: #b45f06; font-weight: bold;"&gt;run&lt;/span&gt;&lt;span class="Apple-style-span"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Revenons à notre sujet. Créons une petite applicaton Rack et appelons notre middleware.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;class&lt;/span&gt;&amp;nbsp;MonApp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;def&lt;/span&gt;&amp;nbsp;call(&lt;i&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;env&lt;/span&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;status = &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;headers= { "Content-Type" =&amp;gt; "text/plain" }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;body &amp;nbsp; = &lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;"Bonjour tout le monde"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;return&lt;/span&gt; &lt;b&gt;[&lt;/b&gt; status, headers, body &lt;b&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman'; font-size: medium; line-height: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Là nous avons une application très simple qui renvoie tout simplement une chaîne de caractéres. Mais notre application a besoin d'être sécurisée et réservée à très peu de personnes :)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pour ce faire nous allons utiliser &lt;b&gt;Rack::Restrictor &lt;/b&gt;qui installable par " &lt;b&gt;&amp;gt; gem install rack_restrictor&amp;nbsp;&lt;/b&gt;".&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&amp;nbsp; &amp;nbsp;require&lt;/span&gt; 'rack_restrictor'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Helvetica, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&amp;nbsp; &amp;nbsp;use&lt;/span&gt; Rack::&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Restrictor&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;"192.168.0.1/24"&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&amp;nbsp; &amp;nbsp;run&lt;/span&gt; MonApp.&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Ce que ça fait ! On require la gem, on appelle le middleware, on lui passe la plage que nous voulons autoriser et à la fin on lance notre application.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;b&gt;PS :&lt;/b&gt; &lt;i&gt;il faut toujours appeler votre application en dernier et prétez attention à l'ordre dans lequel vous appelez vos middlewares.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Lancer votre code et testez !&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Je vais parler de Rack::Builder et comment embarquer des middlewares/applications&amp;nbsp;&lt;b&gt;Rack&lt;/b&gt; dans des applications &lt;b&gt;web&lt;/b&gt; plus sérieuses écrites en utilisant &lt;b&gt;Rails&lt;/b&gt;, &lt;b&gt;Sinatra&lt;/b&gt; ou autre.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;à plus&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-7045662599855606071?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/7045662599855606071/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/understanding-rack-2-les-middlewares.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7045662599855606071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7045662599855606071'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/understanding-rack-2-les-middlewares.html' title='Understanding Rack 2 : les middlewares'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-7039721108826976884</id><published>2011-06-06T11:17:00.008Z</published><updated>2011-06-08T15:29:22.493Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rhodes'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rhosync'/><category scheme='http://www.blogger.com/atom/ns#' term='androïd'/><title type='text'>Rhodes ...</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-VUoArraSmDw/Tey5qDBnPsI/AAAAAAAAACw/-Yyz354jENM/s1600/rhodes.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5615066967441882818" src="http://2.bp.blogspot.com/-VUoArraSmDw/Tey5qDBnPsI/AAAAAAAAACw/-Yyz354jENM/s320/rhodes.PNG" style="cursor: hand; cursor: pointer; display: block; height: 81px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Coucou ça faisait un moment pour ne pas dire une éternité...&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Entre plein de trucs à faire et pas de journées de 48h comprenez mon absence...&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Aujourd'hui je vais vous parler aussi de mobile, pas de Haml, Hassane m'a précédé mais plutôt d'une solution à une problématique majeure.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Vous travaillez dans une entreprise ( ou pas :) ) et on vous demande de développer une application pour smartphone tournant sous IOS, Androïd, et pire on peut même vous obliger à le faire sous Windows Mobile ( sans rancune... ). Que faire ? Développer la même application sur toutes ces plateformes, c'est à dire effectuer le même travail sur autant de plateformes ? se suicider ? ( c'est une option oui ) ou encore faire du web mobile ?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Bah rassurez vous il y a une autre solution et c'est un framework basé sur ruby qui  respecte de façon séduisante le principe du DRY ( Don't Repeat Yourself ), ce framework c'est Rhodes, et il permet de developper une fois son application et de Run Everywhere, il suffit juste de specifier la plateforme cible. Si si c'est bien possible!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Rhodes est un framework opensource basé sur le langage ruby qui permet de construire rapidement des applications natives en html et ruby pour la majeure partie des systémes d'exploitation des smartphones.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Rhodes integre par défaut les layout des différentes vues des smartphones et se charge d'adapter le layout au smartphone cible, la logique de rhodes est basée sur une architecture MVC tres proche de rails.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Rhodes intégre un web server, et utilise le browser control des systemes d'exploitation des smartphones afin de permettre au développeur d'ecrire du html et d'editer ses templates, toutefois l'utilisateur final n'a pas connaissance que c'est son browser qui est derriére le rendu de l'application qu'il utilise.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Aussi Rhodes n'est pas venu tout seul, il est accompagné de RhoSync qui est un sync server, un serveur séparé qui se concentre sur les web services, et permet de syncrhoniser les données avec votre application. Si vous êtes dans ce type de problématique RhoSync peut être votre solution. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Toutefois cela ne signifie pas que vous êtes dans l'obligation d'utiliser RhoSync pour synchroniser vos web services avec les données de votre application....vous pouvez en effet développer votre propre serveur et votre propre client pour la synchronisation de vos web services&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Et voila comment éviter un suicide collectif .... :) &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pour en savoir plus =&amp;gt; &lt;a href="http://rhomobile.com/"&gt;&lt;span class="Apple-style-span"&gt;http://rhomobile.com&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://rhomobile.com/"&gt;&lt;/a&gt;ou encore&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://confreaks.net/videos/68-mwrc2009-rhodes-the-open-source-ruby-framework-for-building-mobile-applications"&gt;&lt;span class="Apple-style-span"&gt;http://confreaks.net/videos/68-mwrc2009-rhodes-the-open-source-ruby-framework-for-building-mobile-applications&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-7039721108826976884?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/7039721108826976884/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/coucou-ca-faisait-un-moment-pour-ne-pas.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7039721108826976884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/7039721108826976884'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/coucou-ca-faisait-un-moment-pour-ne-pas.html' title='Rhodes ...'/><author><name>Khalil</name><uri>http://www.blogger.com/profile/09619044779363630864</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-muRCRS9idr4/TZ37R5XhXpI/AAAAAAAAACM/7qvfcjfw_qo/s220/33781_1683923026109_1478632835_2563544_2593074_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-VUoArraSmDw/Tey5qDBnPsI/AAAAAAAAACw/-Yyz354jENM/s72-c/rhodes.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-5953712352263867725</id><published>2011-06-06T10:14:00.001Z</published><updated>2011-06-06T10:30:27.375Z</updated><title type='text'>Introduction à Haml</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace; font-size: x-large;"&gt;Introduction à &lt;b&gt;Haml&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Bonjour Rubyistes,&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;ça faisait un moment que je vous ai pas écrit et je vous demande pardon. Ce n'est pas évident de travailler toute la semaine, organiser des événements les weekend, préparer des talks et pouvoir se mettre devant mon clavier et partager avec vous :)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Et pour la reprise, nous allons faire de belles choses. Nous allons voir ensemble comment écrire des applications WEB Mobiles en utilisant &amp;nbsp;&lt;b&gt;&lt;i&gt;Haml&lt;/i&gt;&lt;/b&gt;,&amp;nbsp;&lt;b&gt;&lt;i&gt;jQTouch&lt;/i&gt;&lt;/b&gt; et &lt;b&gt;&lt;i&gt;Sinatra&lt;/i&gt;&lt;/b&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Le but de cette série d'articles est de nous permettre d'écrire des applications WEB Mobiles pour rendre "nos" applications WEB plus à la portée de nos visiteurs, clients et collaborateurs.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;L'avantage des applications WEB mobiles par rapport aux applications WEB "simples" est qu'elles ont un look d'applications natives. De ce fait, le visiteur se sent déjà "chez lui".&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;D'où me vient l'idée de cet article ?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Je travaille pour une entreprise en tant que développeur d'applications WEB (mobile et standard). Et sur la demande de nos collaborateurs, nous devrions avoir une application mobile pour chaque plateforme ( Android, Iphone, BlackBerry, Windows Mobile, Symbian et Palm Os ). Oui c'est beaucoup d'applications qui sont toutes identiques ! La solution que nous avons finalement adoptée c'est avoir une seule et unique application utilisable sur toutes ces plateformes : une application WEB mobile.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Et après une comparaison des différents outils permettant le développement d'applications WEB mobiles, mon choix ( justifié ) s'est porté sur &lt;b&gt;jQTouch&lt;/b&gt; (jQuery mobile ). L'application a été développée en Python ( Django ).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Après avoir découvert certaines belles choses, j'ai pensé à vous :)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; font-family: 'Times New Roman';"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/3/3b/Haml_1-5_logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://upload.wikimedia.org/wikipedia/commons/3/3b/Haml_1-5_logo.png" style="cursor: move;" width="192" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Now vous savez pourquoi j'ai écrit cet article. Mais vous savez toujours pas pourquoi j'ai choisi HAML ???&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;HAML est un langage de templating ( pour créer ou générer des pages HTML ) tout comme le ERB, Slim et autres langages de templating. Son avantage par rapport aux autres c'est le DRY ! ( Don't Repeat Yourself ), la structation qu'il vous impose et sa Rubyesque syntaxe.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: Georgia, 'Times New Roman', serif; font-size: large;"&gt;Installation de HAML&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: Georgia, 'Times New Roman', serif; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Haml est une GEM qui s'installe comme toutes les autres !&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #990000; font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; gem install haml&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #990000; font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Courier New', Courier, monospace; font-size: x-large;"&gt;haml : &lt;b&gt;Basics&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Courier New', Courier, monospace; font-size: x-large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Haml vous permet de gérer les contenus statique et dynamique de vos pages HTML en mettant à votre disposition des "méthodes" d'accès aux éléments du document HTML.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Ldr7zpsGmd0/TeycxvAT8II/AAAAAAAAARs/uHCCFGfL5ag/s1600/haml.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://1.bp.blogspot.com/-Ldr7zpsGmd0/TeycxvAT8II/AAAAAAAAARs/uHCCFGfL5ag/s400/haml.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Sur cette image on a les différentes "méthodes" d'accès et d'utilisation des tag et blocks du document HTML.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Toutes les balises &lt;b&gt;HTML&lt;/b&gt;&amp;nbsp;sont précédées d'un &lt;b style="color: #38761d;"&gt;%&lt;/b&gt;, les class CSS par un "&lt;b&gt;.&lt;/b&gt;" et les ID par un "&lt;b&gt;#&lt;/b&gt;". C'est toutce qu'il faut savoir sur les parties statiques de votre HTML.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Courier New', Courier, monospace; font-size: x-large;"&gt;haml :&amp;nbsp;&lt;b&gt;Syntaxe&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06; font-family: 'Courier New', Courier, monospace; font-size: x-large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Exemple : &lt;/b&gt;&lt;i&gt;index.haml&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;!!! Strict&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;%html&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %head&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %body&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; %h1&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Bonjour tout le monde&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;On "compile" tout ça :&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; haml index.haml&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Et le résultat est :&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp; &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Bonjour tout le monde&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;très simple et super cool ! Pour ceux qui aiment avoir des widgets sur leurs pages web, &lt;b&gt;Haml &lt;/b&gt;est vraiment le truc qu'il faut.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Et maintenant ajoutons un peu de contenu dynamique !&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;- @text = "Ruby is awesome"&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;!!! Strict&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;%html&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %head&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %body&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; %h1&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Bonjour tout le monde !&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #990000;"&gt;- if 1 &amp;lt; 2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;=@text&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Et le résultat est :&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #4c1130;"&gt;&amp;nbsp; &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Bonjour tout le monde !&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Ruby is awesome&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Un essai avec les div !&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;- @maclasse = "rouge rounded"&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;- @text = "c'est super ça "&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;!!! Strict&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;%html&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %head&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; %body&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; %h1&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Bonjour tout le monde !&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%div{ :class =&amp;gt; @maclasse }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;=@text&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;à vous de me dire à quoi ressemblera le résultat HTML.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Haml est très simple, intuitif et amusant. Dans le prochain article, nous allons utiliser Haml dans une application Sinatra. D'ici là amusez vous bien avec Haml et n'hésitez pas à poser vos questions et/ou faire part de vos critiques/suggestions.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;b&gt;PS :&lt;/b&gt; &lt;i&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Haml vient avec son propre moteur de CSS appelé SASS ! Mais vous pouvez l'utiliser avec le CSS standard. On fera un tour sur le SASS. Promis :)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;à Lundi prochain inchaallah.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-5953712352263867725?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/5953712352263867725/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/introduction-haml.html#comment-form' title='9 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/5953712352263867725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/5953712352263867725'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/introduction-haml.html' title='Introduction à Haml'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Ldr7zpsGmd0/TeycxvAT8II/AAAAAAAAARs/uHCCFGfL5ag/s72-c/haml.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-2545171195981250824</id><published>2011-06-03T10:26:00.000Z</published><updated>2011-06-03T10:26:10.581Z</updated><title type='text'>Présentation du langage Ruby à la FST !</title><content type='html'>&lt;div id="__ss_8195805" style="width: 500px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;object height="355" id="__sse8195805" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ruby-110603052210-phpapp01&amp;stripped_title=ruby-langage-davenir&amp;userName=hkairi" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse8195805" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ruby-110603052210-phpapp01&amp;stripped_title=ruby-langage-davenir&amp;userName=hkairi" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/hkairi"&gt;hkairi&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-2545171195981250824?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/2545171195981250824/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/presentation-du-langage-ruby-la-fst.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/2545171195981250824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/2545171195981250824'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/06/presentation-du-langage-ruby-la-fst.html' title='Présentation du langage Ruby à la FST !'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-9095387882916471498</id><published>2011-05-18T12:48:00.000Z</published><updated>2011-05-18T12:48:43.450Z</updated><title type='text'>Connascence Of X</title><content type='html'>&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Helvetica, Tahoma, Arial, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="header"&gt;&lt;span class="Apple-style-span" style="font-size: 17px; line-height: 25px; text-transform: capitalize;"&gt;Voici quelques petites choses qui vous seront très utiles !&lt;/span&gt;&lt;/div&gt;&lt;h3 id="coupling" style="font-size: 13px; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; text-transform: capitalize;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;PS : &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;si certains termes (ou expréssions) vous parraient "etranges", wikipedia vous aidera !&lt;/span&gt;&lt;/h3&gt;&lt;h3 id="coupling" style="font-size: 13px; font-weight: bold; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; text-transform: capitalize;"&gt;Coupling&lt;/h3&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Coupling_%28computer_science%29"&gt;&lt;em style="font-style: italic;"&gt;Coupling&lt;/em&gt;&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;em style="font-style: italic;"&gt;dependency&lt;/em&gt;&amp;nbsp;is the degree to which each program module relies on each one of the other modules&lt;/div&gt;&lt;ul style="font-size: 12px; margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Types&lt;/div&gt;&lt;dl style="margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;dt&gt;No&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;Modules do not communicate with each other&lt;/dd&gt;&lt;dt&gt;Message&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;Modules are not dependent instead they use a public interface to exchange parameter-less messages or events&lt;/dd&gt;&lt;dt&gt;Data&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;TODO: simple data/internal&lt;/dd&gt;&lt;dt&gt;Stamp&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;a modules share composite data structure but requires only part of it(through say field name structured data/internal&lt;/dd&gt;&lt;dt&gt;Control&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;a module controls logic of antother by passing it information on what to do(what-to-do flag)&lt;/dd&gt;&lt;dt&gt;External&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;modules share externally imposed data format( ie using mysql api instead wrapping it in db api) simple data/external&lt;/dd&gt;&lt;dt&gt;Common&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;modules share common data(ie global variable) structured data/external&lt;/dd&gt;&lt;dt&gt;Content&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;module relies/depends on implementation details of another module&lt;/dd&gt;&lt;/dl&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;h3 id="cohesion" style="font-size: 13px; font-weight: bold; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; text-transform: capitalize;"&gt;Cohesion&lt;/h3&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29"&gt;&lt;em style="font-style: italic;"&gt;Cohesion&lt;/em&gt;&lt;/a&gt;&amp;nbsp;is a measure of how strongly-related or focused the responsibilities of a single module are&lt;/div&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;Types&lt;/div&gt;&lt;dl style="font-size: 12px; margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;dt&gt;Coincidental cohesion (worst)&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;grouped arbitrarily.. (e.g. a module of frequently used functions).&lt;/dd&gt;&lt;dt&gt;Logical cohesion&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;logically categorised to do the same thing, even if they are different by nature (e.g. grouping all I/O handling routines).&lt;/dd&gt;&lt;dt&gt;Temporal cohesion&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;during run-time (e.g. a function which is called after catching an exception which closes open files, creates an error log, and notifies the user).&lt;/dd&gt;&lt;dt&gt;Procedural cohesion&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;always follow a certain sequence of execution&lt;/dd&gt;&lt;dt&gt;Communicational cohesion&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;operate on the same data&lt;/dd&gt;&lt;dt&gt;Sequential cohesion&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;output from one part is the input to another part&lt;/dd&gt;&lt;dt&gt;Functional cohesion (best)&lt;/dt&gt;&lt;dd style="margin-left: 1em;"&gt;contribute to a single well-defined task of the module&lt;/dd&gt;&lt;/dl&gt;&lt;h3 id="connascence" style="font-size: 13px; font-weight: bold; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; text-transform: capitalize;"&gt;Connascence&lt;/h3&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;Two pieces of software share&amp;nbsp;&lt;em style="font-style: italic;"&gt;connascence&lt;/em&gt;&amp;nbsp;(or&amp;nbsp;&lt;em style="font-style: italic;"&gt;relation&lt;/em&gt;) when a change in one requires a correspoiding change in the other Like coupling but in operational way instead just levels&lt;/div&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;Types&lt;/div&gt;&lt;ul style="font-size: 12px; margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Static&lt;/div&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Name&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Type&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Meaning&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Algorithm&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Position&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Dynamic&lt;/div&gt;&lt;ul style="margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Execution&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Timing&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Value&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Of Identity&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Contranascence&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;Rules&lt;/div&gt;&lt;ul style="font-size: 12px; margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Locality: higher connascence for smaller scope&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Degree: convert high degrees of connascence into weaker forms of connascence&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="corelation_to_other_principles" style="font-size: 13px; font-weight: bold; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; text-transform: capitalize;"&gt;Corelation To Other Principles&lt;/h3&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;TODO:&lt;/div&gt;&lt;div style="font-size: 12px; margin-bottom: 1em;"&gt;Like:&lt;/div&gt;&lt;ul style="font-size: 12px; margin-bottom: 1em; margin-left: 2em; margin-right: 1em; margin-top: 1em;"&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;DRY: CoA&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Law of demeter: CoT&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;KISS:&lt;/div&gt;&lt;/li&gt;&lt;li style="list-style-image: initial; list-style-position: outside; list-style-type: disc;"&gt;&lt;div style="margin-bottom: 1em;"&gt;Single responsibility&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Helvetica, Tahoma, Arial, sans-serif; font-size: 17px; font-weight: bold; line-height: 25px; text-transform: capitalize;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Helvetica, Tahoma, Arial, sans-serif; font-size: 17px; font-weight: bold; line-height: 25px; text-transform: capitalize;"&gt;Modularity Ry Jim Weirich&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Helvetica, Tahoma, Arial, sans-serif; font-size: 17px; font-weight: bold; line-height: 25px; text-transform: capitalize;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;embed allowfullscreen="true" allowscriptaccess="always" flashvars="&amp;amp;file=http%3A%2F%2Fconfreaks.net%2Fsystem%2Fassets%2Fdatas%2F1017%2Foriginal%2F04-apr-2009-19-40-the-building-blocks-of-modularity-jim-weirich-small.mp4&amp;amp;image=http%3A%2F%2Fconfreaks.net%2Fsystem%2Fvideos%2Fimages%2F257%2Fpreview%2F04-apr-2009-19-40-the-building-blocks-of-modularity-jim-weirich-preview.png%3F1298524287&amp;amp;plugins=viral-2&amp;amp;viral.allowmenu=true" height="360" src="http://confreaks.net/media/player.swf" width="540"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-9095387882916471498?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/9095387882916471498/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/05/connascence-of-x.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/9095387882916471498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/9095387882916471498'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/05/connascence-of-x.html' title='Connascence Of X'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-6873328065774683531</id><published>2011-05-18T12:07:00.000Z</published><updated>2011-05-18T12:07:02.960Z</updated><title type='text'>Quelques pistes pour commencer</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;Pendant le meetup que nous avons organisé à l'Ecole Supérieure Polytechnique ce samedi 14 mai 2011,&lt;br /&gt;nous avons promis de partager avec vous certaines ressources :)&lt;br /&gt;&lt;br /&gt;Alors voici quelques pistes pour commencer votre belle aventure avec Ruby :&lt;br /&gt;&lt;br /&gt;un livre très intéressant pour démarrer :&amp;nbsp;&lt;a href="http://www.ruby-doc.org/docs/ApprendreProgrammer/Apprendre_a_Programmer.pdf"&gt;Apprendre à programmer en Ruby&lt;/a&gt;&lt;br /&gt;un interpréteur Ruby en ligne http://tryruby.org&lt;br /&gt;*&lt;br /&gt;http://rubyinside.com&lt;br /&gt;http://ruby-toolbox.com&lt;br /&gt;http://rubygems.org&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-6873328065774683531?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/6873328065774683531/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/05/quelques-pistes-pour-commencer.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6873328065774683531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/6873328065774683531'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/05/quelques-pistes-pour-commencer.html' title='Quelques pistes pour commencer'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-310973286917929574</id><published>2011-04-07T15:56:00.005Z</published><updated>2011-04-07T17:22:27.228Z</updated><title type='text'>les websockets ? solutions aux limites du protocole HTTP ?</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-k71Hor7mh2Q/TZ3vXi28pQI/AAAAAAAAACA/f1rYizxzEBE/s1600/html5-websockets-le-successeur-du-protocole-http-1.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 226px;" src="http://2.bp.blogspot.com/-k71Hor7mh2Q/TZ3vXi28pQI/AAAAAAAAACA/f1rYizxzEBE/s320/html5-websockets-le-successeur-du-protocole-http-1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5592889500037326082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  &gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;Hi mon premier post sur ce blog....&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Découvrons le ensemble&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Quelques mois auparavant Hassane Moustapha vous a parlé de &lt;a href="http://rubyusergroup.blogspot.com/2010/12/comment-jai-explique-rest-ma-femme.html"&gt;&lt;span class="Apple-style-span" &gt;REST&lt;/span&gt;&lt;/a&gt; et notamment du protocole &lt;a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol"&gt;&lt;span class="Apple-style-span" &gt;HTTP&lt;/span&gt;&lt;/a&gt; . Je ne reviendrais donc pas dessus, je m'en vais juste soulever une limite majeure du protocole &lt;a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol"&gt;&lt;span class="Apple-style-span" &gt;HTTP&lt;/span&gt;&lt;/a&gt; , limite qui a en partie vu le jour avec l'évolution du Web ( notamment le &lt;a href="http://fr.wikipedia.org/wiki/Web_2.0"&gt;&lt;span class="Apple-style-span" &gt;Web .2.0&lt;/span&gt;&lt;/a&gt; ). &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Je m'explique, l'utilisation du protocole HTTP implique que le client ( disons notre navigateur web ) doit ouvrir une connexion avec le serveur, effectuer sa requête, attendre la réponse du serveur, avant de la fermer. Aussi à chaque nouvelle connexion c'est ce même processus qui se répéte. Nous notons deux points essentiels &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;le serveur doit attendre une requête du client pour pouvoir lui envoyer les données qui lui sont destinées&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;la bande passante en souffre :)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;Ce temps de latence implique dans le cas de systèmes à temps réel ( prenons le cas des bourses ) des pertes possibles d'argent&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;J'espere que vous me suivez toujours car on va bientôt entrer dans le vif du sujet. En effet le souci principal pour nous développeurs avec ce protocole c'est le besoin d'avoir une connexion constamment ouverte entre le client et le serveur permettant un échange de données en full duplex.Certains me diront qu'il existe des alternatives telles que &lt;a href="http://fr.wikipedia.org/wiki/Comet_(informatique)"&gt;&lt;span class="Apple-style-span" &gt;Comet&lt;/span&gt;&lt;/a&gt; ( Hassane nous fera surement la grâce d'un article dessus).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Nous parlerons donc des Websockets qui via le HTML 5 est supporté par les applications web actuelles.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   &gt;Le Protocole WebSocket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Ce protocole permet d'ouvrir une connexion permanente directionnelle entre le client et le serveur. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Comment ça se passe ?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Bah tres simplement, considérons que votre application charge un script javascript qui nécessite une connexion permanente avec le serveur. Une requête de type "upgrade" est faite afin de proceder à une mise à jour de la connexion de type TCP/HTTP vers le mode webSocket. Ca ressemble à peu prés à ça :&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;  GET /text HTTP/1.1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;  Upgrade: WebSocket&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Connection: Upgrade&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Host: www.example.com&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Origin: http://example.com&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  WebSocket-Protocol: sample&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Sec-WebSocket-Version: 6&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt; qui donne&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;   HTTP/1.1 101 Websocket Protocol Handshake&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Upgrade: WebSocket&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  Connection: Upgrade&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  WebSocket-Origin: http://example.com&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  WebSocket-Location: ws://example.com/demo&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;  WebSocket-Protocol: sample&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Et voila cet échange initial est appelé "handshake" ( poignée de mains pour les francophones :) ) et devinez quoi ? la connexion entre le serveur et le client est établie.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Le client et le serveur peuvent alors échanger librement des informations l'un l'autre via&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;ce protocole. Le serveur vient &lt;i&gt;push &lt;/i&gt;(pousser ) des données vers le client et n'est plus obligé d'attendre qu'il en fasse la demande d'abord.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   &gt;L'API WEBSOCKET&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="font-size: large; white-space: pre; "&gt; &lt;/span&gt;&lt;span class="Apple-style-span" &gt;Elle se veut tres simple. Aussi pour créer une instance de web socket il suffit de fournir l'url du serveur . Elle commence par ws:// ou wss:// ( pour une connexion sécurisée ). Ensuite l'interface fournit un certain nombre d'attributs permettant de gérer les évenements associés :&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;i&gt;onopen :&lt;/i&gt; &lt;i&gt;ouverture d'un websocket&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;i&gt;onmessage : reception d'un message&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;onerror : en cas d'erreurs&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;&lt;i&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;onclose : fermeture de websocket&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;L&lt;/span&gt;es  données envoyés par le serveur sont notifiés par l'événement &lt;i&gt;onmessage. &lt;/i&gt;Aussi les webSocket fournissent deux méthodes :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;send(data_string)  pour envoyer un message au serveur&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;close() pour fermer la webSocket&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Hummm je commence à être long la. Aussi je vais terminer par son implementation côté&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;serveur.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"   &gt;&lt;a href="http://jwebsocket.org/"&gt;Kaazing&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;&lt;a href="http://jwebsocket.org/"&gt;&lt;span class="Apple-style-span" &gt;Jwebsocket&lt;/span&gt;&lt;/a&gt; ( java)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"   &gt;&lt;a href="https://github.com/gimite/web-socket-ruby"&gt;Web socket ruby&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Je ne vais pas finir sans préciser ceci, les websocket representent une évolution importante&lt;/div&gt;&lt;div&gt;dans la communication client-serveur, toutefois d'importantes failles de sécurité ont été notées dont le &lt;a href="http://fr.wikipedia.org/wiki/Empoisonnement_du_cache_DNS"&gt;&lt;span class="Apple-style-span" &gt;cache poisonning&lt;/span&gt;&lt;/a&gt;. Ce qui fait que les websocket restent encore à l'état de brouillon, mais son évolution est ineluctable so &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Wait and see...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;quelques liens &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;a href="http://www.blog-nouvelles-technologies.fr/archives/3237/html5-websockets-le-successeur-du-protocole-http/"&gt;&lt;span class="Apple-style-span" &gt;http://www.blog-nouvelles-technologies.fr/archives/3237/html5-websockets-le-successeur-du-protocole-http/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;div class="line number7 index6 alt2" style="color: black !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-weight: normal !important; font-style: normal !important; direction: ltr !important; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2" style="font-family: monospace; color: black !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-weight: normal !important; font-style: normal !important; direction: ltr !important; white-space: pre !important; font-size: 1em !important; "&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(77, 77, 77); " &gt;&lt;code class="bash plain" style="font-weight: normal !important; color: black !important; background-color: initial !important; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; "&gt;&lt;/code&gt;&lt;code class="bash plain" style="font-size: 1em !important; font-weight: normal !important; color: black !important; background-color: initial !important; white-space: pre; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; "&gt;    &lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="line-height: 13px; "&gt;&lt;div class="line number7 index6 alt2" style="border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-weight: normal !important; font-style: normal !important; direction: ltr !important; white-space: pre !important; "&gt;&lt;code class="bash plain" style="font-weight: normal !important; background-color: initial !important; white-space: pre; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; "&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;div class="line number7 index6 alt2" style="color: black !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-weight: normal !important; font-style: normal !important; font-size: 1em !important; direction: ltr !important; white-space: pre !important; "&gt;&lt;code class="bash plain" style="font-size: 1em !important; font-weight: normal !important; color: black !important; background-color: initial !important; white-space: pre; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; "&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2" style="color: black !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-weight: normal !important; font-style: normal !important; direction: ltr !important; white-space: pre !important; "&gt;&lt;code class="bash plain" style="font-weight: normal !important; color: black !important; background-color: initial !important; white-space: pre; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; "&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-tab-span" style="font-size: 1em !important; white-space: pre; "&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2" style="color: black !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: white !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; padding-top: 0px !important; padding-right: 1em !important; padding-bottom: 0px !important; padding-left: 1em !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-weight: normal !important; font-style: normal !important; font-size: 1em !important; direction: ltr !important; white-space: pre !important; "&gt;&lt;code class="bash plain" style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; font-weight: normal !important; color: black !important; background-color: initial !important; white-space: pre; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; outline-width: 0px !important; outline-style: initial !important; outline-color: initial !important; overflow-x: visible !important; overflow-y: visible !important; position: static !important; right: auto !important; text-align: left !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-style: normal !important; direction: ltr !important; display: inline !important; background-position: initial initial !important; background-repeat: initial initial !important; "&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-310973286917929574?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/310973286917929574/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/04/les-websockets-solutions-aux-limites-du.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/310973286917929574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/310973286917929574'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/04/les-websockets-solutions-aux-limites-du.html' title='les websockets ? solutions aux limites du protocole HTTP ?'/><author><name>Khalil</name><uri>http://www.blogger.com/profile/09619044779363630864</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://4.bp.blogspot.com/-muRCRS9idr4/TZ37R5XhXpI/AAAAAAAAACM/7qvfcjfw_qo/s220/33781_1683923026109_1478632835_2563544_2593074_n.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-k71Hor7mh2Q/TZ3vXi28pQI/AAAAAAAAACA/f1rYizxzEBE/s72-c/html5-websockets-le-successeur-du-protocole-http-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-5616692386079353348</id><published>2011-04-04T13:58:00.000Z</published><updated>2011-04-04T13:58:57.571Z</updated><title type='text'>Ruby : quelques ressources !</title><content type='html'>Bonjour,&lt;br /&gt;&lt;br /&gt;Pendant ma présentation du langage Ruby (&lt;a href="http://www.slideshare.net/hkairi/ruby-un-langage-davenir"&gt;lien&lt;/a&gt;) au CodeCamp le samedi 02 Avril 2011, j'avais promis de partager avec vous mes sources! Voici quelques liens qui vous seront très utiles :&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;a href="http://www.ruby-lang.org/fr"&gt;http://www.ruby-lang.org/fr&lt;/a&gt;&lt;br /&gt;- http://rubyflow.com&lt;br /&gt;- http://rubyinside.com&lt;br /&gt;- http://tryruby.org&lt;br /&gt;-&amp;nbsp;&lt;a href="http://screencasts.org/"&gt;http://screencasts.org/&lt;/a&gt;&lt;br /&gt;- http://rubyusergroup.blogspot.com &amp;nbsp;&lt;br /&gt;- http://railscasts.com&lt;br /&gt;-&amp;nbsp;&lt;a href="http://confreaks.net/events"&gt;http://confreaks.net/events&lt;/a&gt;&lt;br /&gt;-&amp;nbsp;&lt;a href="http://teachmetocode.com/"&gt;http://teachmetocode.com/&lt;/a&gt;&lt;br /&gt;-&amp;nbsp;&lt;a href="http://rubycorner.com/blogs/lang/fr"&gt;http://rubycorner.com/blogs/lang/fr&lt;/a&gt;&amp;nbsp;&amp;nbsp; (liste des blogs francophones )&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', Times, serif; font-size: 16px; line-height: 24px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3 style="color: #111111; font-size: 1.25em; font-weight: normal; line-height: 1.2em; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Blogs personnels&amp;nbsp;&lt;/h3&gt;&lt;ol style="margin-bottom: 1.5em; margin-left: 1.5em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Aaron Quint –&amp;nbsp;&lt;a href="http://www.quirkey.com/blog/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;QuirkeyBlog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Adam Keys –&amp;nbsp;&lt;a href="http://therealadam.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Real Adam&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Adam Wiggins –&amp;nbsp;&lt;a href="http://adam.blog.heroku.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;A Tornado of RazorBlades&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Amanda &amp;amp; Michael Morin –&amp;nbsp;&lt;a href="http://ruby.about.com/b/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Amanda and Michael’s Ruby Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Amy Hoy –&amp;nbsp;&lt;a href="http://www.slash7.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Slash7&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Antonio Cangiano –&amp;nbsp;&lt;a href="http://antoniocangiano.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Zen and the Art of Programming&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Brian Dainto –&amp;nbsp;&lt;a href="http://buddingrubyist.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Budding Rubyist&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Brian Eng &amp;amp; Jeff Cohen –&amp;nbsp;&lt;a href="http://www.softiesonrails.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Softies on Rails&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Brian Marick –&amp;nbsp;&lt;a href="http://www.exampler.com/blog/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Exploration Through Example&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Bruce Williams –&amp;nbsp;&lt;a href="http://codefluency.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Codefluency&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chad Fowler –&amp;nbsp;&lt;a href="http://chadfowler.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Chad Fowler&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Charles Nutter –&amp;nbsp;&lt;a href="http://blog.headius.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Headius&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chris O’Sullivan –&amp;nbsp;&lt;a href="http://www.thechrisoshow.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Chris O Show&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Dave Thomas –&amp;nbsp;&lt;a href="http://pragdave.pragprog.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;PragDave&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;David Heinemeier Hansson –&amp;nbsp;&lt;a href="http://www.loudthinking.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Loud Thinking&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Derek Neighbors –&amp;nbsp;&lt;a href="http://derekneighbors.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Derek Neighbors&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Dr Nic Williams –&amp;nbsp;&lt;a href="http://drnicwilliams.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Dr Nic&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Eric Hodel –&amp;nbsp;&lt;a href="http://blog.segment7.net/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Segment7&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Evan Phoenix –&amp;nbsp;&lt;a href="http://blog.fallingsnow.net/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;evan.musing&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ezra Zygmuntowicz –&amp;nbsp;&lt;a href="http://brainspl.at/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Brainspl.at&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Eldon Alameda –&amp;nbsp;&lt;a href="http://simplifi.es/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Simplifies&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Eric Falcao –&amp;nbsp;&lt;a href="http://austinentrepreneur.wordpress.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;austin entrepreneur&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Fabio Akita –&amp;nbsp;&lt;a href="http://www.akitaonrails.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;AkitaOnRails.com (Portuguese)&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Geoffrey Grosenbach –&amp;nbsp;&lt;a href="http://nubyonrails.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Nuby on Rails&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Giles Bowkett –&amp;nbsp;&lt;a href="http://gilesbowkett.blogspot.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Giles Bowkett&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Graeme Mathieson –&amp;nbsp;&lt;a href="http://woss.name/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Rubaidh&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Gregg Pollack &amp;amp; Jason Seifer –&amp;nbsp;&lt;a href="http://www.railsenvy.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Rails Envy&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ilya Grigorik –&amp;nbsp;&lt;a href="http://www.igvita.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;igvita.com&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jade Meskill –&amp;nbsp;&lt;a href="http://iamruinous.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;iamruinous&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;James Golick –&amp;nbsp;&lt;a href="http://jamesgolick.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;James on Software&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jamie van Dyke –&amp;nbsp;&lt;a href="http://www.fearoffish.co.uk/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;FearOfFish&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jamis Buck –&amp;nbsp;&lt;a href="http://weblog.jamisbuck.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;the { buckblogs :here }&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jay Fields –&amp;nbsp;&lt;a href="http://blog.jayfields.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Jay Fields’ Thoughts&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jay Phillips –&amp;nbsp;&lt;a href="http://jicksta.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Adhearsion Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jesse Newland –&amp;nbsp;&lt;a href="http://soylentfoo.jnewland.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;SoylentFoo&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Jim Weirich –&amp;nbsp;&lt;a href="http://onestepback.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;{ |one, step, back| }&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Joe O’Brien –&amp;nbsp;&lt;a href="http://objo.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;my not-so-barbaric yawlp&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;John Lam –&amp;nbsp;&lt;a href="http://www.iunknown.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;John Lam on Software&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;John Nunemaker –&amp;nbsp;&lt;a href="http://railstips.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RailsTips&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Josh Susser –&amp;nbsp;&lt;a href="http://blog.hasmanythrough.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;has_many :through&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Lindsay Holmwood –&amp;nbsp;&lt;a href="http://holmwood.id.au/~lindsay/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;auxesis’ musings&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Lyle Johnson –&amp;nbsp;&lt;a href="http://lylejohnson.name/blog/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Lovable Lyle&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Manik Juneja –&amp;nbsp;&lt;a href="http://www.fromdelhi.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;{ :from =&amp;gt; Delhi, :about =&amp;gt; everything }&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Marc-Andre Cournoyer –&amp;nbsp;&lt;a href="http://macournoyer.com/blog/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;macournoyer’s blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Matt Aimonetti –&amp;nbsp;&lt;a href="http://merbist.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Merbist&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Matt Todd –&amp;nbsp;&lt;a href="http://maraby.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Paragon Adrift&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Michael Bleigh –&amp;nbsp;&lt;a href="http://mbleigh.com/blog.html" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Mister Bleigh&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Michael Ivey –&amp;nbsp;&lt;a href="http://gweezlebur.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Michael Ivey&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Michael Koziarski –&amp;nbsp;&lt;a href="http://www.therailsway.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Rails Way&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mike Gunderloy –&amp;nbsp;&lt;a href="http://afreshcup.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;A Fresh Cup&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mike Perham –&amp;nbsp;&lt;a href="http://www.mikeperham.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Mike Perham&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mislav Marohnic –&amp;nbsp;&lt;a href="http://mislav.uniqpath.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;No strings attached&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Nick Plante –&amp;nbsp;&lt;a href="http://blog.zerosum.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;zerosum dirt(nap)&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Nick Quaranto –&amp;nbsp;&lt;a href="http://litanyagainstfear.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Litany Against Fear&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Obie Fernandez –&amp;nbsp;&lt;a href="http://blog.obiefernandez.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Obie Fernandez&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Pat Eyler –&amp;nbsp;&lt;a href="http://on-ruby.blogspot.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;On Ruby&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Peat Bakke –&amp;nbsp;&lt;a href="http://peat.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Peat Dot Org&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Peter Cooper –&amp;nbsp;&lt;a href="http://peterc.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Peter Cooper’s Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Peter Szinek –&amp;nbsp;&lt;a href="http://www.rubyrailways.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Ruby, Rails, Web2.0&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Pratik Naik –&amp;nbsp;&lt;a href="http://m.onkey.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;has_many :bugs, :through =&amp;gt; :rails&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;PJ Hyett &amp;amp; Chris Wanstrath –&amp;nbsp;&lt;a href="http://errtheblog.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Err The Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Rick Olson –&amp;nbsp;&lt;a href="http://techno-weenie.net/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;techno weenie&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Richard Roberts –&amp;nbsp;&lt;a href="http://www.ricroberts.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RichText&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ryan Bates –&amp;nbsp;&lt;a href="http://railscasts.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RailsCasts&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ryan Daigle –&amp;nbsp;&lt;a href="http://ryandaigle.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Ryan’s Scraps&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ryan Tomayko –&amp;nbsp;&lt;a href="http://tomayko.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Ryan Tomayko&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Sau Sheong Chang –&amp;nbsp;&lt;a href="http://blog.saush.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;saush.com&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Steve Sanderson –&amp;nbsp;&lt;a href="http://stevesanderson.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Steve Sanderson&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Sur –&amp;nbsp;&lt;a href="http://expressica.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Expressica::Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Tim Kadom –&amp;nbsp;&lt;a href="http://blog.skiptree.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Skiptree&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Tom Preston-Werner –&amp;nbsp;&lt;a href="http://tom.preston-werner.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Tom Preston-Werner&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Tobias Lutke –&amp;nbsp;&lt;a href="http://blog.leetsoft.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Too-biased&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Yehuda Katz –&amp;nbsp;&lt;a href="http://yehudakatz.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Katz Got Your Tongue?&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Yukihiro Matsumoto (Matz) –&amp;nbsp;&lt;a href="http://www.rubyist.net/~matz/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Matz’s Blog (Japanese)&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Zed Shaw –&amp;nbsp;&lt;a href="http://www.zedshaw.com/blog/index.html" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Zed’s Technical Blog&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style="color: #111111; font-size: 1.25em; font-weight: normal; line-height: 1.2em; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Blogs gérés par des entreprises&lt;/h3&gt;&lt;ol style="margin-bottom: 1.5em; margin-left: 1.5em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Altoros –&amp;nbsp;&lt;a href="http://blog.altoros.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Blog on the Business of Software Product Development&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Dynamic50 –&amp;nbsp;&lt;a href="http://blog.dynamic50.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Blog of the Fifty Group&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;ELC Technologies –&amp;nbsp;&lt;a href="http://www.elctech.com/core" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;ELC Technologies&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Engine Yard –&amp;nbsp;&lt;a href="http://blog.engineyard.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Union Station&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;FiveRuns –&amp;nbsp;&lt;a href="http://blog.fiveruns.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;FiveRuns Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Heroku –&amp;nbsp;&lt;a href="http://blog.heroku.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Heroku| Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Highgroove Studios –&amp;nbsp;&lt;a href="http://napkin.highgroove.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;The Napkin&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;MorphLabs –&amp;nbsp;&lt;a href="http://blog.mor.ph/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Morph Labs Staff Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;New Bamboo –&amp;nbsp;&lt;a href="http://blog.new-bamboo.co.uk/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Bamboo Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Relevance Inc. –&amp;nbsp;&lt;a href="http://blog.thinkrelevance.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Relevance Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;RubyLearning –&amp;nbsp;&lt;a href="http://rubylearning.com/blog/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RubyLearning Blog&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Taazza –&amp;nbsp;&lt;a href="http://blog.taazza.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Taazza newsroom&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;TheWebFellas –&amp;nbsp;&lt;a href="http://thewebfellas.com/blog" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;TheWebFellas&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Thoughtbot –&amp;nbsp;&lt;a href="http://giantrobots.thoughtbot.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Giant Robots&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Unspace –&amp;nbsp;&lt;a href="http://rethink.unspace.ca/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Rethink&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 style="color: #111111; font-size: 1.25em; font-weight: normal; line-height: 1.2em; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 1.8em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Autres&lt;/h3&gt;&lt;ol style="margin-bottom: 1.5em; margin-left: 1.5em; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;DB2 on Rails –&amp;nbsp;&lt;a href="http://db2onrails.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;DB2 on Rails&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Odd Thesis –&amp;nbsp;&lt;a href="http://oddthesis.org/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Odd Thesis&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Rails on the Run –&amp;nbsp;&lt;a href="http://railsontherun.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Rails on the Run&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;RailsOnWave.com –&amp;nbsp;&lt;a href="http://www.railsonwave.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RailsOnWave.com&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ruby Best Practices –&amp;nbsp;&lt;a href="http://blog.rubybestpractices.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;Ruby Best Practices&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;RubyInside –&amp;nbsp;&lt;a href="http://www.rubyinside.com/" style="color: #cc0000; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;"&gt;RubyInside&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-5616692386079353348?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/5616692386079353348/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/04/ruby-quelques-ressources.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/5616692386079353348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/5616692386079353348'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/04/ruby-quelques-ressources.html' title='Ruby : quelques ressources !'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-8927952089325135439</id><published>2011-02-15T19:15:00.006Z</published><updated>2011-02-15T19:38:30.117Z</updated><title type='text'>Understanding Rack</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-J0p9HXrjCxA/TVqxTVcu05I/AAAAAAAAAKE/kO_KkBsf3W0/s1600/rack_thumb.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-J0p9HXrjCxA/TVqxTVcu05I/AAAAAAAAAKE/kO_KkBsf3W0/s1600/rack_thumb.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;"&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Rails 3 est compatible Rack &lt;/span&gt;"&lt;br /&gt;&amp;nbsp;"&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sinatra est un framework web basé&amp;nbsp;sur Rack&amp;nbsp;&lt;/span&gt;"&lt;br /&gt;&amp;nbsp;"&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Padrino est un citoyen Rack&amp;nbsp;&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Ces expressions, nous les rencontrons très souvent sur le net et surtout sur les blogs qui parlent de Ruby et du web. Qu'est ce qu'elles peuvent bien vouloir dire ?&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour ceux qui savent pas ce que c'est &lt;i&gt;&lt;u&gt;Rack&lt;/u&gt;&lt;/i&gt;, ces expressions n'ont aucun sens. Malheureusement.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Expliquer Rack, dire à quoi ça peut servir et comment l'utiliser ou en faire n'ont pas été les motivations pour me placer devant "Blogger" ( parce que je suis tout le temps , ou presque, devant mon ordi ) et écrire cet article.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La vraie raison est une question que j'ai "croisée" sur Twitter. Et cette question c'était :&amp;nbsp;&lt;/span&gt;"&amp;nbsp;why rack should matter to .net developers &amp;nbsp;?". &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Tout le "monde" commence à faire du 'Rack'. Google a un framework basé sur Django et sur WSGI (la version Rack pour python). La communauté Microsoft en a quelques uns (frameworks je veux dire) que sont &lt;a href="https://github.com/thecodejunkie/Nancy"&gt;Nancy&lt;/a&gt;&amp;nbsp;et &lt;a href="http://jondot.github.com/nina/"&gt;Nina&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Ces frameworks sont basés sur une approche plus intelligente et plus simple que d'autres mais restent quand même moins classes que Sinatra ou Padrino.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Ok ! Cool ! Mais c'est quoi Rack ? On aimerait bien savoir.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;So What is Rack ?&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;"Rack&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;couche&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;d'abstraction&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;qui&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;se trouve&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;entre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les serveurs&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les frameworks&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;. Cela&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;apporte&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une plus grande interopérabilité&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;entre les&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;implémentations de serveurs&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;HTTP&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;frameworks web&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Euuhhh ! C'est pas encore très clair. Revenons un peu dans le temps et revoyons comment communiquent un client HTTP et un serveur HTTP.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-R_3nrEzhR9w/TVq--EKSbDI/AAAAAAAAAKQ/jfw8OQHOWSg/s1600/client_serveur.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-R_3nrEzhR9w/TVq--EKSbDI/AAAAAAAAAKQ/jfw8OQHOWSg/s400/client_serveur.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-size: medium; margin-bottom: 0.5em; margin-left: auto; margin-right: auto; padding-bottom: 6px; padding-left: 6px; padding-right: 6px; padding-top: 6px; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 13px; padding-top: 4px; text-align: center;"&gt;schéma 1 : communication HTTP entre un client et un serveur&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sur ce schéma, nous avons un scénario classique de communication entre un client et un serveur.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Le client envoie une requête HTTP. Elle arrive sur le serveur et passe souvent par toutes les couches de l'application. Après traitement de la requête, l'application répond et le serveur renvoie la réponse au client et tout le monde est content. Sûr ? non. Puisque le serveur a des limites logicielles et matérielles.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour ce qui est des limites logicielles, on fera comme si on n'était pas au courant et on se concentre (dans cet article) sur les limites matérielles.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;i&gt;PS : les 'limites' techniques ou logicielles sont surtout la nécessité d'avoir un adaptateur pour chaque serveur web et pour un chaque framework. Ce qui explique que souvent vous soyez obligés de chercher des hébergeurs pour une certaine technologie.Revenons à notre sujet.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La montée en charge ! vous en avez certainement entendue parler ? Comment éviter ce problème ? Est ce que c'est possible si vous n'avez aucun contrôle sur le serveur ? Ben oui. Par le biais des bonnes pratiques et de la bonne modélisation. Passons.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;On arrive très facilement à ses limites quand on fait des efforts inutiles. Mais comment savoir qu'un effort peut être inutile ? Comment décider des actions à effectuer avant même de passer la main à l'application concernée (ça peut être un contrôleur aussi quand on fait du MVC) par la requête ?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Simple il faudra rajouter une couche supplémentaire dans "l'architecture" du serveur applicatif. Cette couche devra décider des opérations à effectuer et aussi à les traiter s'il le faut. Et dans ce cas notre application aura moins de boulot à faire et se "fatiguera" alors beaucoup moins vite.&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wEUOYp-dgds/TVrCyjXEiCI/AAAAAAAAAKU/RhF4Ia7hWC4/s1600/middleware.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="123" src="http://3.bp.blogspot.com/-wEUOYp-dgds/TVrCyjXEiCI/AAAAAAAAAKU/RhF4Ia7hWC4/s400/middleware.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;schéma 2 : middleware installé sur le serveur&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Expliquons le schéma 2. Nous avons installé sur notre serveur un &lt;u&gt;&lt;i&gt;middleware&lt;/i&gt;&lt;/u&gt; qui nous aidera à filtrer les requêtes et n'exécuter que celles que nous jugeons importantes ou nécessaires.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Le fait de monter plusieurs middlewares (au besoin) nous donne l'impression que notre serveur est en quelque sorte un tiroir. D'où l'appellation RACK qui veut, littéralement, dire tiroir.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour ce qui est des problèmes matériels et logiciels, nous savons à peu prés comment Rack peut aider.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Passons à la partie code!&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Dans le monde Rack, nous avons deux types d'applications. Certaines sont appelées &lt;i&gt;rack applications &lt;/i&gt;et d'autres&lt;i&gt; rack middlewares.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La seule différence entre une application et un middleware rack réside dans le fait que le middleware est une application qui a connaissance des autres applications qui sont autour de lui. Il peut communiquer avec elles.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Tout objet ruby peut être transformé en une application rack valide. Il suffira que ce dernier puisse répondre à la méthode &lt;b style="font-style: italic; text-decoration: underline;"&gt;each&lt;/b&gt;. Un middleware rack doit avoir au moins deux méthodes &lt;i&gt;initialize&lt;/i&gt; et &lt;i&gt;call&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Installation de Rack :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; gem install rack&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Première application Rack =&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Exemple : &lt;i&gt;app.rb&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;class&lt;/span&gt; MonApplication&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #783f04;"&gt;def&lt;/span&gt; call(env)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[ &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;200&lt;/span&gt;, {&lt;span class="Apple-style-span" style="color: #38761d;"&gt;"Content-Type" =&amp;gt; "text/html"&lt;/span&gt;}, &lt;span class="Apple-style-span" style="color: #38761d;"&gt;"Hi from Rack"&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #783f04;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Pour faire tourner cette application rack on utilisera la commande : rackup mise à notre disposition par la gem rack.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;La commande rackup exige un fichier nommé config.ru (ru pour dire Rack Up).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Créons notre config.ru :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #783f04;"&gt;require &lt;/span&gt;'app'&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;run MonApplication&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;et puis :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;rackup config.ru&lt;span class="Apple-style-span" style="color: #783f04;"&gt; &lt;/span&gt;-&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;p&lt;span class="Apple-style-span" style="color: #783f04;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-family: 'Courier New', Courier, monospace;"&gt;3000&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;# =&amp;gt; http://localhost:3000&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Dans le prochain article, on va écrire un middleware l'utiliser dans notre application. Et dans un troisième article sur Rack, nous allons écrire notre propre version de Sinatra :).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-8927952089325135439?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/8927952089325135439/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/02/understanding-rack.html#comment-form' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8927952089325135439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/8927952089325135439'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/02/understanding-rack.html' title='Understanding Rack'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-J0p9HXrjCxA/TVqxTVcu05I/AAAAAAAAAKE/kO_KkBsf3W0/s72-c/rack_thumb.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-3062807316464354430</id><published>2011-01-29T09:29:00.001Z</published><updated>2011-01-29T15:24:13.634Z</updated><title type='text'>BlogCast : Première plateforme de Blogging en Ruby</title><content type='html'>Bonjour,&lt;br /&gt;&lt;br /&gt;Ceci est juste une annonce de la mise à votre disposition d'une plateforme de Blogging écrite entièrement en Ruby. Cette plateforme se nomme "BlogCast". Elle est gratuite, open source et encore en évolution.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;BlogCast : 'Blogger autrement'.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Pour le moment, les principales fonctionnalités sont :&lt;br /&gt;&lt;br /&gt;-&amp;gt; Gestion des membres ou rédacteurs&lt;br /&gt;-&amp;gt;&amp;nbsp;Gestion des articles et des commentaires&lt;br /&gt;-&amp;gt;&amp;nbsp;Gestion des SPAMS ( grâce à Rakismet )&lt;br /&gt;-&amp;gt;&amp;nbsp;Aperçu Temps réel (pendant que vous rédigez votre article vous savez déjà à quoi il ressemblera.)&lt;br /&gt;-&amp;gt;&amp;nbsp;Adopté au programmeurs et permet d'introduire du code dans le corps de votre article et tient compte de la coloration syntaxique.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;What next ?&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Tian (un pote et propriétaire de l'idée) et moi sommes en train de travailler sur certaines idées. Parmi lesquelles on a :&lt;br /&gt;&lt;br /&gt;-&amp;gt; la création de Gem BlogCast pour faciliter son utilisation dans d'autres frameworks web Ruby.&lt;br /&gt;-&amp;gt; la création d'un Rails 3 engine pour utiliser BlogCast comme un plugin Rails 3.&lt;br /&gt;-&amp;gt; la création d'un middleware Rack pour faciliter l'intégration de BlogCast aux applications AppEngine.&lt;br /&gt;-&amp;gt; Une documentation complète en français et en anglais.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;Vous voulez contribuer ?&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Très facile! Forkez le repo sur github rajoutez vos features, listez les dans un fichier "new_feature.txt" et faites une pull request.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;How to get a copy of BlogCast ?&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Vous aurez besoin de :&lt;br /&gt;&lt;br /&gt;Git, Rails 3, Bundler et sqlite3&lt;br /&gt;&lt;br /&gt;1-) &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git clone&amp;nbsp;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;git://github.com/hkairi/BlogCast.git&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;2-) &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd &lt;span class="Apple-style-span" style="color: #274e13;"&gt;BlogCast&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;3-) &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;bundle install&lt;/span&gt;&lt;br /&gt;4-) &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;rails server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;BlogCast sera disponible sur &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://localhost:3000/"&gt;http://localhost:3000&lt;/a&gt;/&lt;/span&gt; . La partie administration est accessible depuis&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://localhost:3000/admin"&gt;http://localhost:3000/admin&lt;/a&gt;&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;u&gt;&lt;b&gt;username :&lt;/b&gt;&lt;/u&gt;&lt;/span&gt; &lt;i&gt;admin&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;u&gt;&lt;b&gt;password :&lt;/b&gt;&lt;/u&gt;&lt;/span&gt; &lt;i&gt;admin&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: large;"&gt;Have fun.&lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-3062807316464354430?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/3062807316464354430/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/01/blogcast-premiere-plateforme-de.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3062807316464354430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/3062807316464354430'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/01/blogcast-premiere-plateforme-de.html' title='BlogCast : Première plateforme de Blogging en Ruby'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-4294715904882678038</id><published>2011-01-04T18:04:00.001Z</published><updated>2011-01-29T13:11:36.571Z</updated><title type='text'>Discovering Sinatra : Episode 2 =&gt; Skeleton generator</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;Application skeleton for Sinatra&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_jiP14eu5Avc/TRoEtSDYrJI/AAAAAAAAAIw/0WM3t8xqo6c/s1600/sinatra.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="111" src="http://3.bp.blogspot.com/_jiP14eu5Avc/TRoEtSDYrJI/AAAAAAAAAIw/0WM3t8xqo6c/s400/sinatra.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Dans cet article on va pas aborder des techniques ou fonctionnalités propres à Sinatra mais plutôt de la création d'applications Sinatra.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Sinatra nous permet de créer des applications WEB de façon très simple, rapide et claire mais ne nous donne pas des outils pour nous faciliter la création de certains composants souvent statiques tels que le &lt;i&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;&lt;b&gt;Gemfile, config.ru&lt;/b&gt;&lt;/span&gt;&lt;/i&gt; et les répertoires tels que &lt;i&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;&lt;b&gt;views, public, lib&lt;/b&gt;&lt;/span&gt;&lt;/i&gt; etc que nous utilisons souvent dans nos applications comme le font &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt; et &lt;a href="http://merbist.com/"&gt;Merb&lt;/a&gt;. Les créer manuellement pour chaque nouvelle application n'est pas très intelligent c'est pour ça que j'ai écrit ce petit script SHELL qui permet de générer le squelette d'une application Sinatra.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;# Le contenu du script &lt;i&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;/usr/bin/sinatra-app-gen.sh&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #660000; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;if &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[ &lt;span class="Apple-style-span" style="color: #38761d;"&gt;"$1"&lt;/span&gt; == &lt;span class="Apple-style-span" style="color: #38761d;"&gt;""&lt;/span&gt; ];&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt; then&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;" Utilisation: "&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"'sinatra-gen nom_application' pour créer l'architecture d'une nouvelle application Sinatra"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;if &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;[ &lt;span class="Apple-style-span" style="color: #660000;"&gt;!&lt;/span&gt; -d &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt; ];&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt; then&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/views;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/lib;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/public;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/public/css;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/public/images;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mkdir&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;$1&lt;/span&gt;/public/js;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"require 'sinatra' "&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &amp;gt; $1/app.rb &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"source 'http://rubygems.org' gem 'sinatra' "&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; $1/Gemfile&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"require 'app.rb'"&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &amp;gt; $1/config.ru&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"&amp;lt;!DOCTYPE html&amp;gt;\n&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;$1&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;%= yield %&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;" &amp;gt; $1/views/layout.erb&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo "Application Sinatra [ $1 ]créée avec succès."&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cd $1; ls ;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: 'Courier New', Courier, monospace;"&gt;"Erreur lors de la création de l'application : $1 existe déjà."&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fi;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #660000; font-family: 'Courier New', Courier, monospace;"&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Après avoir lu le code source vous imaginez déjà ce qu'il fait : que des choses simples :). Now apprenons à l'utiliser.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;i&gt;Installation du script :&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;créer un fichier, le nommer comme suit : sinatra-app-gen, y mettre le code SHELL précédent et le mettre dans le /usr/bin et le render exécutable (chmod +x).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;&lt;i&gt;Utilisation :&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;$ &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;b&gt;sinatra-app-gen&lt;/b&gt;&lt;/span&gt; &lt;i&gt;mon_application_sinatra&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's all.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2807958853352636280-4294715904882678038?l=rubyusergroup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyusergroup.blogspot.com/feeds/4294715904882678038/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://rubyusergroup.blogspot.com/2011/01/discovering-sinatra-episode-2-skeleton.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4294715904882678038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2807958853352636280/posts/default/4294715904882678038'/><link rel='alternate' type='text/html' href='http://rubyusergroup.blogspot.com/2011/01/discovering-sinatra-episode-2-skeleton.html' title='Discovering Sinatra : Episode 2 =&gt; Skeleton generator'/><author><name>Hassane Moustapha</name><uri>http://www.blogger.com/profile/15740946666794754805</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_jiP14eu5Avc/S4VyJbKo16I/AAAAAAAAAAk/2LvqgQHLY-I/S220/hassane.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jiP14eu5Avc/TRoEtSDYrJI/AAAAAAAAAIw/0WM3t8xqo6c/s72-c/sinatra.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2807958853352636280.post-4831918030617758356</id><published>2011-01-03T11:20:00.002Z</published><updated>2011-01-03T11:22:38.596Z</updated><title type='text'>Rails 3: Episode 2 =&gt; ActiveRelation</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;L'une des plus grandes et importantes nouveautés de Rails 3 c'est bien ActiveRecord 3.0 qui a été complètement revu (ou ré-écrit). Actuellement ActiveRecord 3.0 est composé de ActiveModel et ActiveRelation ou Arel pour faire court.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;L'épisode de cette semaine portera sur ActiveRelation qui est la nouvelle gamme de "Finder" et aussi une implémentation (ruby) de l'algèbre relationnelle.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: large;"&gt;&lt;b&gt;Le modèle relationnel&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Commençons par&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une introduction en douceur&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;C'&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;quoi&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;modèle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relationnel&amp;nbsp;&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Eh bien&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous avez&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;probablement&lt;/span&gt;&amp;nbsp;plus&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une idée&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;générale&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de ce&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que c'est&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;SQL&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est une implémentation&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du modèle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relationnel&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Je&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vais pas entrer dans le détails dans&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;cet article&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Le modèle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relationnel&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;se compose de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;deux&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;grands&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;concepts&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les relations&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les opérateurs&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;. Pour faire court et simple disons que&lt;/span&gt;&amp;nbsp;l&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;es &lt;b&gt;relations&lt;/b&gt; sont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;similaires&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;aux tables&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;SQL&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des vues&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des résultats&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de requête&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Les &lt;b&gt;opérateurs&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les différents éléments&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;langage SQL&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tels que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;SELECT&lt;/i&gt;&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;WHERE&lt;/i&gt;&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;&lt;b&gt;JOIN&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;propriétés les plus importantes&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du modèle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relationnel&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est la&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;propriété&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de "&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;fermeture&lt;/i&gt;"&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela signifie que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pouvez prendre n'importe quel&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;rapport&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;effectuer toute&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;opération&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;et&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;vous en obtiendrez&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une autre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relation&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela signifie que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;toute&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;requête&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;peut être utilisée comme&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;entrée&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;d'une autre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;requête&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;(qui&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est juste&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;notion de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;sous-requêtes&lt;/i&gt;&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;dans&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;SQL&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_jiP14eu5Avc/TSGwq0BemZI/AAAAAAAAAJY/Z_nnVdhdM-8/s1600/arel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://4.bp.blogspot.com/_jiP14eu5Avc/TSGwq0BemZI/AAAAAAAAAJY/Z_nnVdhdM-8/s400/arel.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: inherit; font-size: 17px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: large;"&gt;&lt;b&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 22px;"&gt;ActiveRecord 3.0&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 22px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Alors que&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ActiveRecord&lt;/span&gt;&amp;nbsp;était&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un outil&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour exécuter des requêtes&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;SQL&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;il&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est devenu un outil&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;construire des relations&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;La différence&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est peut être subtile&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mais reste&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;importante&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;L'u&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tilisation&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;modèle relationnel&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;l'&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;abstraction&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;correcte&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;comme&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nous le verrons&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;tout au long&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;du&lt;/span&gt;&amp;nbsp;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;reste de cet&amp;nbsp;&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;article&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Tout d'abord,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;permettez-moi de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;souligner&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;quelques changements&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;importants&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: 14px; line-height: 22px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: 14px; line-height: 22px;"&gt;&lt;span class="iv" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #807aae; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;@articles&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; = &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;Article&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.order(&lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;span class="k" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;created_at DESC&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Dans l'exemple&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;précédent&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #45818e;"&gt;@articles&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est une instance&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;classe&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Relation&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela diffère&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;des versions précédentes de&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;&lt;b&gt;ActiveRecord&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;où&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #134f5c;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;articles&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;aurait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;été&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un tableau&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;d'instances&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de la classe Article.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;En outre,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;il&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est important&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;noter&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les relations&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;doivent&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;être&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;considérées comme immuables.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Une relation&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'algèbre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relationnelle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;comme&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un certain nombre&lt;/span&gt;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;(&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;comme&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;2)&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;l'algèbre&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;élémentaire&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Il&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;serait&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un monde&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fou&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;si&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;2 pourrait&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;être&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;muté&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;représenter&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;un nombre différent&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" style="font-family: inherit; font-size: large;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;Le Chaînage&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;L'apport le&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;plus&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;évident&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;nouvelle&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;API&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les opérations&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;peuvent être&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;enchaînées&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela est dû&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;à&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la propriété&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de'&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;i&gt;fermeture&lt;/i&gt;'&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;j'ai mentionnée&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;plus haut&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Par exemple&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;les&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;deux&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;extraits&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de code&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;suivants sont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;équivalents&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="" style="font-size: 14px; line-height: 22px;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="color: #232323; font-family: inherit;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; line-height: 22px; white-space: normal;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Article&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:author&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"moi&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;, &lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:category&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"inutile&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;et&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 22px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 22px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;Article&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:author&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"moi&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #85a641;"&gt;"&lt;/span&gt;).where(&lt;/span&gt;&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:category&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"inutile&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Ce n'est pas seulement l'opérateur WHERE qui peut être enchaîné mais tous les autres opérateurs.&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: 14px; line-height: 22px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: 14px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;Article&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:author&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"moi&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;).order(&lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;span class="k" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;created_at desc&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&lt;span class="Apple-style-span"&gt;&lt;span class="hps atn" title="Cliquer ici pour voir d'autres traductions"&gt;L'&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;objet Relation&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pourrait&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;même&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;être&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;enregistré dans&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;une&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;variable et&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;utilisé plusieurs fois pour&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;définir des&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sous-requêtes&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;Q&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;uelque chose&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;comme&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;span class="" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; line-height: 22px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;mes_articles = &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;Article&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:author&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"moi&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&lt;br /&gt;articles_inutiles =&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;mes_articles&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:category&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"inutile&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;) &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;b&gt;&lt;i&gt;# vide :)&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;articles_utiles =&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;mes_articles&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:category&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"utile&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;) &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, 'Times New Roman', serif; font-size: large; white-space: normal;"&gt;&lt;b&gt;&amp;nbsp;Laziness&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, 'Times New Roman', serif; font-size: large; white-space: normal;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, 'Times New Roman', serif; font-size: large; white-space: normal;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', serif; line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Les relations sont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;matérialisées&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;paresseusement&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela signifie&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;que&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;requête&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;n'est pas&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;déclenchée&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;avant que les résultats&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sont&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;réellement utilisés.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Cela rend&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la création de&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relations&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;quasi-gratuite&lt;/span&gt;&lt;span title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Le cas d'utilisation&lt;/span&gt;&amp;nbsp;le plus&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;évident&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;la mise en cache&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;de fragment.&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Les&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;relations&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pourrait être&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;construites&lt;/span&gt;&amp;nbsp;que la&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mise en cache soit complète ou partielle.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 17px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-size: 16px; line-height: normal;"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 17px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-size: 16px; line-height: normal;"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 17px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-size: 16px; line-height: normal;"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 17px; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-size: 16px; line-height: normal;"&gt;&lt;span class="hps" style="font-family: inherit;" title="Cliquer ici pour voir d'autres traductions"&gt;# controller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;def&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; &lt;/span&gt;&lt;span class="fu" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #ca8f3b; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;index&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;&lt;/span&gt;&lt;span class="iv" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #807aae; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@articles&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; = &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #29547d;"&gt;Article&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;.where(&lt;/span&gt;&lt;span class="sy" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #6c9cbd; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;:author&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="s" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #85a641; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"hkairi&lt;/span&gt;&lt;span class="dl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #232323;"&gt;&lt;/span&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;# la vue&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span"&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;%&lt;/span&gt; cache &lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;do&lt;/span&gt; &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;nbsp;&amp;nbsp; &amp;lt;%&lt;/span&gt; &lt;span class="iv" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #807aae; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;@articles&lt;/span&gt;.each &lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;do&lt;/span&gt; |a| &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="ta" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #e7be69; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;%=&lt;/span&gt; a.titre &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="ta" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #e7be69; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;%=&lt;/span&gt; a.autre_methode &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;end&lt;/span&gt; &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="r" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;end&lt;/span&gt; &lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; font-family: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="il" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="idl" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', serif; line-height: normal; white-space: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', serif; line-height: normal; white-space: normal;"&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Si&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;fragment&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;est&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mis en cache&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;alors&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;@articles.each&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;ne sera jamais&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;appelé&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;sauf au&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;moment&lt;/span&gt;&amp;nbsp;où&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;&amp;nbsp;la&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;requête&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;devient&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;effectivement utile.&lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;Auparavant&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;contrôleur&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;aurait &lt;/span&gt;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;enveloppé&lt;/span&gt;&amp;nbsp;le bloc (@articles.each)&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;dans&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;une condition&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;pour vérifier&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;si oui ou&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;non&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;le fragment&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;a été&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;déjà&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Cliquer ici pour voir d'autres traductions"&gt;mis en cache&lt;/span&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Georgia, 'Times New Roman', serif; line-height: normal; white-space: normal;"&gt;&lt;span class="" title="Cliquer ici pour voir d'autres traductions"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, 'Times New Roman', serif; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #cb7832; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px
