scratch/output/Scratch/fr/blog/Yesod-excellent-ideas/index.html

316 lines
16 KiB
HTML
Raw Normal View History

2011-10-04 12:15:05 +00:00
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
2011-10-26 08:49:00 +00:00
<meta name="keywords" content="yesod, framework, web, haskell, ideas">
2011-10-04 12:15:05 +00:00
<link rel="shortcut icon" type="image/x-icon" href="/Scratch/img/favicon.ico" />
<link rel="stylesheet" type="text/css" href="/Scratch/assets/css/main.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/twilight.css" />
<link rel="stylesheet" type="text/css" href="/Scratch/css/idc.css" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://feeds.feedburner.com/yannespositocomfr"/>
2011-10-18 22:30:00 +00:00
<link rel="alternate" lang="fr" xml:lang="fr" title="Les idées de yesod" type="text/html" hreflang="fr" href="/Scratch/fr/blog/Yesod-excellent-ideas/" />
2011-10-04 12:15:05 +00:00
<link rel="alternate" lang="en" xml:lang="en" title="Yesod excellent ideas" type="text/html" hreflang="en" href="/Scratch/en/blog/Yesod-excellent-ideas/" />
<script type="text/javascript" src="/Scratch/js/jquery-1.3.1.min.js"></script>
<script type="text/javascript" src="/Scratch/js/jquery.cookie.js"></script>
<script type="text/javascript" src="/Scratch/js/index.js"></script>
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->
2011-10-18 22:30:00 +00:00
<title>Les idées de yesod</title>
2011-10-04 12:15:05 +00:00
</head>
2011-10-18 22:30:00 +00:00
<body lang="fr" class="article">
2011-10-04 12:15:05 +00:00
<script type="text/javascript">// <![CDATA[
document.write('<div id="blackpage"><img src="/Scratch/img/loading.gif" alt="Chargement en cours..."/></div>');
// ]]>
</script>
<div id="content">
<div id="choix">
<div class="return"><a href="#entete">&darr; Menu &darr;</a></div>
<div id="choixlang">
<a href="/Scratch/en/blog/Yesod-excellent-ideas/" onclick="setLanguage('en')">in English</a>
</div>
<div class="flush"></div>
</div>
<div id="titre">
<h1>
2011-10-18 22:30:00 +00:00
Les idées de yesod
2011-10-04 12:15:05 +00:00
</h1>
</div>
<div class="flush"></div>
<div class="flush"></div>
<div id="afterheader">
<div class="corps">
<p><img alt="Title image" src="/Scratch/img/blog/Yesod-excellent-ideas/main.png" /></p>
<div class="intro">
<p><span class="sc"><abbr title="Trop long à lire">tlàl</abbr>&nbsp;: </span></p>
2011-10-18 22:30:00 +00:00
<p>Cela fait un moment que je suis la progression du <a href="http://www.yesodweb.com">framework yesod</a>.
2011-12-07 16:37:23 +00:00
À mon humble avis on peut commencer à l&rsquo;utiliser pour des applications sérieuses (comprendre en prod).
Avant de vous dire pourquoi vous devriez aussi le considérer, je préfère vous parler de bonnes idées (parmi d&rsquo;autres) introduites par yesod que je n&rsquo;avais jamais vu ailleurs.</p>
2011-10-04 12:15:05 +00:00
</div>
2011-10-18 22:30:00 +00:00
<h2 id="types-saufs">Types saufs</h2>
2011-12-07 16:37:23 +00:00
<p>Commençons par une BD d&rsquo;<a href="http://xkcd.com">xkcd</a>&nbsp;:</p>
2011-10-04 12:15:05 +00:00
2011-10-04 15:32:23 +00:00
<p><img src="http://imgs.xkcd.com/comics/exploits_of_a_mom.png" alt="SQL injection by a mom" /></p>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Lorsque vous créez une application web, beaucoup de temps est passé à s&rsquo;occuper de chaînes de caractères.
Des chaînes de caractère pour les URL, le HTML, le Javascript, les CSS, les requêtes SQL, etc&hellip;
2011-10-18 22:30:00 +00:00
Pour éviter des utilisation malicieuses vous devez protéger chaque chaîne de caractère entre chaque étape.
Par exemple supposons que vous entriez comme nom&nbsp;:</p>
<pre class="twilight">
Newton<span class="Keyword">&lt;</span>script<span class="Keyword">&gt;</span><span class="SupportFunction">alert</span>(<span class="String"><span class="String">&quot;</span>An apple fall<span class="String">&quot;</span></span>)<span class="Keyword">&lt;</span>/script<span class="Keyword">&gt;</span>
</pre>
2011-12-07 16:37:23 +00:00
<p>Sans une protection correcte, le message &ldquo;An apple fall&rdquo; sera affiché à chaque fois que quelqu&rsquo;un essayera d&rsquo;accéder au nom de cet utilisateur.
Les &ldquo;types saufs&rdquo; sont le <a href="https://www.youtube.com/watch?v=1IWF3IsEPBE">tonyglandil du web</a>.
A chaque chaine de caractère, on lui associe un &ldquo;type&rdquo;.
A quoi sert cette chaîne de caractère&nbsp;? Est-ce une URL&nbsp;? Du javascript&nbsp;? De l&rsquo;HTML&nbsp;?
Entre chaque passage d&rsquo;une représentation à une autre, un transformation is faite par défaut.</p>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Yesod fait de son mieux pour typer les objets manipulés et ainsi il fera ce qu&rsquo;il faut pour ne pas mettre du script dans une URL par exemple.</p>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<pre class="twilight"><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">a</span> <span class="MetaTagInline">href</span>=@[<span class="MetaTagInline">AnotherPageR</span>]<span class="MetaTagInline">&gt;</span></span>Go to the other page
</pre>
2011-10-04 12:15:05 +00:00
2011-10-21 14:48:31 +00:00
<p>Comme <code>AnotherPageR</code> est une URL elle ne pourra contiendra pas (par défaut) de caractère dangereux comme par exemple&nbsp;:</p>
2011-10-18 22:30:00 +00:00
<pre class="twilight">
falselink&quot;&gt;<span class="EmbeddedSource"><span class="EmbeddedSource">&lt;</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span> bad_code<span class="EmbeddedSource">(</span><span class="EmbeddedSource">)</span><span class="EmbeddedSource">;</span> <span class="EmbeddedSource">&lt;/</span><span class="MetaTagInline">script</span><span class="EmbeddedSource">&gt;</span></span><span class="MetaTagInline"><span class="MetaTagInline">&lt;</span><span class="MetaTagInline">a</span> <span class="MetaTagInline">href</span>=<span class="String"><span class="String">&quot;</span>pipo</span></span>
</pre>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<h2 id="les-widgets">Les widgets</h2>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<p>Les widgets de yesod sont différents des widgets Javascripts (ou java).
2011-12-07 16:37:23 +00:00
Pour yesod un widget est un ensemble de morceaux d&rsquo;appli web.
Et si dans une page on veut utiliser plusieurs widgets, alors yesod s&rsquo;occupe de tout.
2011-10-18 22:30:00 +00:00
Des exemples de widgets (au sens yesod) sont&nbsp;:</p>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<ul>
2011-12-07 16:37:23 +00:00
<li>Le «footer» d&rsquo;une page web,</li>
<li>Le «header» d&rsquo;une page web,</li>
<li>un bouton qui apparaît lorsque l&rsquo;on «scrolle» vers le bas,</li>
<li>etc&hellip;</li>
2011-10-18 22:30:00 +00:00
</ul>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Pour chacun de ces widgets vous pourriez avoir besoin d&rsquo;</p>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<ul>
2011-12-07 16:37:23 +00:00
<li>un peu d&rsquo;HTML,</li>
2011-10-18 22:30:00 +00:00
<li>un peu de CSS et</li>
2011-10-21 14:48:31 +00:00
<li>un peu de javascript.</li>
2011-10-18 22:30:00 +00:00
</ul>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Certain morceau doivent être placés dans le «header» de la page et d&rsquo;autre dans le «body».</p>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Vous pouvez déclarer un widget comme suit (je n&rsquo;utilise pas la vrai syntaxe)&nbsp;:</p>
2011-10-18 22:30:00 +00:00
<pre><code>htmlheader = ...
2011-10-04 15:32:23 +00:00
cssheader = ...
javascriptheader = ...
htmlbody = ...
</code></pre>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<p>La vraie syntaxe est&nbsp;:</p>
<pre class="twilight">
toWidgetHeader cassiusFile <span class="String"><span class="String">&quot;</span>button.cassius<span class="String">&quot;</span></span>
toWidgetHeader juliusFile <span class="String"><span class="String">&quot;</span>button.julius<span class="String">&quot;</span></span>
toWidget hamletFile <span class="String"><span class="String">&quot;</span>buttonTemplate.hamlet<span class="String">&quot;</span></span>
</pre>
<p>Veuillez aussi noté la convention Shakespearienne des noms.
2011-12-07 16:37:23 +00:00
Encore une bonne raison d&rsquo;utiliser yesod.</p>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<ul>
2011-10-21 14:48:31 +00:00
<li>Cassius <em class="pala">&amp;</em> Lucius pour le CSS (très similaire à SASS et SCSS)</li>
2011-12-07 16:37:23 +00:00
<li>Julius pour le javascript (notons qu&rsquo;il existe aussi un CoffeeScript qui traîne dans les sources de yesod)</li>
<li>Hamlet pour l&rsquo;HTML (similaire à haml)</li>
2011-10-18 22:30:00 +00:00
</ul>
<p>Lorsque vous générez votre page, yesod se débrouille pour que tout fonctionne ensemble:</p>
<pre class="twilight">
2011-10-04 12:15:05 +00:00
myBigWidget = menuWidget &gt;&gt; contentWidget &gt;&gt; footerWidget
2011-10-18 22:30:00 +00:00
</pre>
<p>De plus, si vous utilisez 10 widgets avec un peu de CSS, yesod fabriquera un unique fichier CSS pour vous. Bien entendu si vous préférez avoir une dizaine de fichier CSS vous pouvez aussi le faire.</p>
2011-12-07 16:37:23 +00:00
<p>C&rsquo;est juste génial&nbsp;!</p>
2011-10-18 22:30:00 +00:00
<h2 id="routage-optimis">Routage optimisé</h2>
<p>Dans un système de routage standard (à la ruby on rails par exemple) vous avez pour chaque entrée un couple: regexp → handler</p>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>La seule façon de découvrir la bonne règle est d&rsquo;essayer de matcher l&rsquo;url demandée à chaque expression régulière.</p>
2011-10-18 22:30:00 +00:00
2011-12-07 16:37:23 +00:00
<p>Au lieu d&rsquo;essayer chaque expression régulière, yesod regroupe et compile les routes pour les optimiser.
2011-10-18 22:30:00 +00:00
Bien entendu pour pouvoir profiter de cet avantage au mieux, il ne faut pas que deux routes interfèrent entres elles.</p>
<pre class="twilight">
2011-10-04 12:15:05 +00:00
/blog/2003 Date2003R
/blog/$DATE DateR
2011-10-18 22:30:00 +00:00
</pre>
<p>Cette définition de route est invalide par défaut dans yesod.
Si vous voulez vraiment vous pouvez le faire foncionner quand même, mais il me semble que ça doit être quasiment toujours une mauvaise idée.</p>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<p>Il vaut mieux faire&nbsp;:</p>
<pre class="twilight">
2011-10-04 12:15:05 +00:00
/blog/$DATE DateR
2011-10-18 22:30:00 +00:00
</pre>
2011-12-07 16:37:23 +00:00
<p>et faire le test &ldquo;est-ce que date = 2003&nbsp;?&rdquo; dans le «handler».</p>
2011-10-18 22:30:00 +00:00
<h2 id="pourquoi-yesod">Pourquoi yesod?</h2>
2011-10-04 12:15:05 +00:00
2011-10-18 22:30:00 +00:00
<ol>
2011-12-07 16:37:23 +00:00
<li><em>La vitesse</em>. Simplement incroyable, je ne pense pas qu&rsquo;il existe quelque chose de plus rapide aujourd&rsquo;hui. Regardez d&rsquo;abord cet <a href="http://snapframework.com/blog/2010/11/17/snap-0.3-benchmarks">article</a> puis <a href="http://www.yesodweb.com/blog/2011/02/warp-speed-ahead">celui-ci</a>.</li>
<li><em>Haskell</em>. C&rsquo;est certainement le langage de programmation le plus difficile à apprendre que j&rsquo;ai jamais rencontré. Mais aussi l&rsquo;un des plus incroyables. Si vous voulez rencontrer tout un tas de notions que vous n&rsquo;avez jamais croisées avant et faire exploser votre cerveau avec de nouvelles idées, alors apprenez Haskell.</li>
<li><em>Bonnes idées et communauté excellente</em>. Cela fait quelques mois que je suis la progression de yesod. Et la vitesse à laquelle tout s&rsquo;est déroulé est simplement incroyable. De plus les développeurs sont intelligents et super sympa.</li>
2011-10-18 22:30:00 +00:00
</ol>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Si vous êtes un &ldquo;haskeller&rdquo;, je pense que vous ne devriez pas avoir peur de la syntaxe particulière imposée par la façon standard de faire les choses avec yesod.
2011-10-18 22:30:00 +00:00
Il faut essayer un peu plus loin que les premiers tutoriaux du livre.</p>
2011-10-04 12:15:05 +00:00
2011-12-07 16:37:23 +00:00
<p>Je pense que yesod va dans la bonne direction d&rsquo;un web plus sûr et plus rapide. Même si je pense que l&rsquo;avenir sera que les serveurs devront être limités à faire serveur d&rsquo;API (JSON ou XML ou n&rsquo;importe quel autre mode de représentation d&rsquo;objets).</p>
2011-10-18 22:30:00 +00:00
2011-12-07 16:37:23 +00:00
<p>Yesod est juste incroyable. Dépassez les difficultés liées à l&rsquo;apprentissage d&rsquo;haskell et essayez le&nbsp;!</p>
2011-10-04 12:15:05 +00:00
</div>
<div id="choixrss">
<a id="rss" href="http://feeds.feedburner.com/yannespositocomfr">
s'abonner
</a>
</div>
<script type="text/javascript">
$(document).ready(function(){
$('#comment').hide();
$('#clickcomment').click(showComments);
});
function showComments() {
$('#comment').show();
$('#clickcomment').fadeOut();
}
document.write('<div id="clickcomment">Commentaires</div>');
</script>
<div class="flush"></div>
<div class="corps" id="comment">
<h2 class="first">commentaires</h2>
<noscript>
Vous devez activer javascript pour commenter.
</noscript>
<script type="text/javascript">
var idcomments_acct = 'a307f0044511ff1b5cfca573fc0a52e7';
var idcomments_post_id = '/Scratch/fr/blog/Yesod-excellent-ideas/';
var idcomments_post_url = 'http://yannesposito.com/Scratch/fr/blog/Yesod-excellent-ideas/';
</script>
<span id="IDCommentsPostTitle" style="display:none"></span>
<script type='text/javascript' src='/Scratch/js/genericCommentWrapperV2.js'></script>
</div>
<div id="entete" class="corps_spaced">
<div id="liens">
<ul><li><a href="/Scratch/fr/">Bienvenue</a></li>
<li><a href="/Scratch/fr/blog/">Blog</a></li>
<li><a href="/Scratch/fr/softwares/">Softwares</a></li>
<li><a href="/Scratch/fr/about/">À propos</a></li></ul>
</div>
<div class="flush"></div>
<hr/>
<div id="next_before_articles">
<div id="previous_articles">
articles précédents
<div class="previous_article">
2011-10-18 22:30:00 +00:00
<a href="/Scratch/fr/blog/Higher-order-function-in-zsh/"><span class="nicer">«</span>&nbsp;Fonctions d'ordre supérieur en zsh</a>
2011-10-04 12:15:05 +00:00
</div>
<div class="previous_article">
2011-10-18 22:30:00 +00:00
<a href="/Scratch/fr/blog/programming-language-experience/"><span class="nicer">«</span>&nbsp;Mon expérience avec les languages de programmation</a>
2011-10-04 12:15:05 +00:00
</div>
<div class="previous_article">
2011-10-18 22:30:00 +00:00
<a href="/Scratch/fr/blog/Learn-Vim-Progressively/"><span class="nicer">«</span>&nbsp;Apprenez Vim Progressivement</a>
2011-10-04 12:15:05 +00:00
</div>
2011-10-04 12:15:05 +00:00
</div>
<div id="next_articles">
articles suivants
2011-10-21 14:48:31 +00:00
<div class="next_article">
2011-11-16 12:30:46 +00:00
<a href="/Scratch/fr/blog/SVG-and-m4-fractals/">Accroître le pouvoir des languages déficients.&nbsp;<span class="nicer">»</span></a>
2011-10-21 14:48:31 +00:00
</div>
2011-10-04 12:15:05 +00:00
2011-12-29 16:05:05 +00:00
<div class="next_article">
2012-01-11 20:40:22 +00:00
<a href="/Scratch/fr/blog/Yesod-tutorial-for-newbies/">Site en Haskell&nbsp;<span class="nicer">»</span></a>
2011-12-29 16:05:05 +00:00
</div>
2011-10-04 12:15:05 +00:00
</div>
<div class="flush"></div>
</div>
</div>
<div id="bottom">
<div>
<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.fr">Droits de reproduction ©, Yann Esposito</a>
</div>
<div id="lastmod">
Écrit le : 04/10/2011
2011-11-16 12:14:39 +00:00
modifié le : 26/10/2011
2011-10-04 12:15:05 +00:00
</div>
<div>
Site entièrement réalisé avec
<a href="http://www.vim.org">Vim</a>
et
<a href="http://nanoc.stoneship.org">nanoc</a>
</div>
<div>
<a href="/Scratch/fr/validation/">Validation</a>
<a href="http://validator.w3.org/check?uri=referer"> [xhtml] </a>
.
<a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3"> [css] </a>
.
<a href="http://validator.w3.org/feed/check.cgi?url=http%3A//yannesposito.com/Scratch/fr/blog/feed/feed.xml">[rss]</a>
</div>
</div>
<div class="clear"></div>
</div>
</body>
</html>