<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
  <title>Phollow.me</title>
  <link href="http://phollow.fr/" />
  
  <updated>2013-04-12T01:39:15+02:00</updated>
  <id>http://phollow.fr/</id>
  <author>
    <name>Jérôme Mahuet</name>
    <email>rydgel@phollow.fr</email>
  </author>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/phollow/iuEO" /><feedburner:info uri="phollow/iueo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>phollow/iuEO</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
    <id>http://phollow.fr/2012/11/building-installing-testing-golang</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/xBMvMoLofNY/building-installing-testing-golang" />
    <title>Building and installing Go code</title>
    <published>2012-11-05T01:00:00+01:00</published>
    <updated>2012-11-05T01:00:00+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;So you just &lt;a href="http://golang.org/doc/install"&gt;installed&lt;/a&gt; Go in your system, now you’ll have to create a workspace to work with packages provided by third-parties or making your own ones. A workspace is simply a directory which contains your code, binaries and package objects compiled from it.&lt;/p&gt;

&lt;h3&gt;Creating the workspace&lt;/h3&gt;

&lt;p&gt;The workspace can be created anywhere on your system, let’s create it on a directory called &lt;code&gt;golang&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir ~/golang
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/golang
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We have to set up the &lt;code&gt;GOPATH&lt;/code&gt; environment variable to tell golang tools this is where we want our workspace to be.&lt;/p&gt;

&lt;h3&gt;Writing our first program&lt;/h3&gt;

&lt;p&gt;Go code resides in the &lt;code&gt;src&lt;/code&gt; directory of your workspace. Inside of it we will create our first namespace. Its name should be unique to avoid conflicts with other packages. Let’s create all this and make our first and &lt;em&gt;awesome&lt;/em&gt; “Hello World” program.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/golang
&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir -p src/phollow.fr
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We want our program to be called &lt;code&gt;hello&lt;/code&gt;, so let’s create a &lt;code&gt;hello&lt;/code&gt; directory inside our namespace, and then the Go code itself.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;src/phollow.fr
&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir hello
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello
&lt;span class="nv"&gt;$ &lt;/span&gt;vim hello.go
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;fmt&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, world!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;FYI:&lt;/strong&gt; there is no real &lt;em&gt;main&lt;/em&gt; package, it’s just a convention telling Go you want this code to generate an executable binary.&lt;/p&gt;

&lt;p&gt;Now you just have to type &lt;code&gt;go install&lt;/code&gt; to let the Go tools compile and install our binary. Every binary is installed inside the &lt;code&gt;bin&lt;/code&gt; directory of your workspace.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ls ~/golang/bin
hello
&lt;span class="nv"&gt;$ &lt;/span&gt;~/golang/bin/hello
Hello, world!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Yeah, it’s working. It may be a good idea to put this bin directory on our system PATH: &lt;code&gt;export PATH=$HOME/golang/bin:$PATH&lt;/code&gt;. This way we just have to type &lt;code&gt;hello&lt;/code&gt; to run our program.&lt;/p&gt;

&lt;h3&gt;Creating a package&lt;/h3&gt;

&lt;p&gt;Now let’s create a &lt;strong&gt;package&lt;/strong&gt;. They can be imported in other Go programs and use a different package name, ie. not “main”. We want to make a little function that will double our strings. So we will create a string directory in our namespace and write the code.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/golang/src/phollow.fr
&lt;span class="nv"&gt;$ &lt;/span&gt;mkdir string
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;string
&lt;span class="nv"&gt;$ &lt;/span&gt;vim string.go
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="c1"&gt;// Pretty useless I know, it’s just for the sake&lt;/span&gt;
&lt;span class="c1"&gt;// of this example ;)&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;FYI:&lt;/strong&gt; you can see that my function begins with an &lt;strong&gt;uppercase&lt;/strong&gt;. This is a convention, telling that this function can be used outside the package itself (you know, like public/private stuff…).&lt;/p&gt;

&lt;p&gt;You can check if this function is working by typing &lt;code&gt;go build&lt;/code&gt;. No output = no problem. Let’s make this package available to other programs:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go install
&lt;span class="nv"&gt;$ &lt;/span&gt;ls ~/golang/pkg/darwin_amd64/phollow.fr
string.a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Great! There it is. As you can see you will find them all in the &lt;code&gt;pkg&lt;/code&gt; directory.&lt;/p&gt;

&lt;h3&gt;Using our new package&lt;/h3&gt;

&lt;p&gt;Let’s go back editing our &lt;strong&gt;hello.go&lt;/strong&gt; program:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;fmt&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;phollow.fr/string&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, world!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go install
&lt;span class="nv"&gt;$ &lt;/span&gt;hello
Hello, world!Hello, world!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So basically the Go tools found our package &lt;code&gt;phollow.fr/string&lt;/code&gt; and use the &lt;em&gt;string.a&lt;/em&gt; and linked it to our hello code. Not really hard.&lt;/p&gt;

&lt;h3&gt;Bonus: Testing Go code&lt;/h3&gt;

&lt;p&gt;You can never be sure your code is 100% working without testing it. And good news, there is a build-in tool to do so in Go. What we want to test here is our &lt;code&gt;string.Double()&lt;/code&gt; function. A test file resides besides the code and should be named &lt;code&gt;packagename_test.go&lt;/code&gt;. So we will go with &lt;code&gt;string_test.go&lt;/code&gt; inside the &lt;strong&gt;string&lt;/strong&gt; directory in our namespace.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;testing&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;want&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;}{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;HelloHello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Good Bye!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Good Bye!Good Bye!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;日本&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;日本日本&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="nx"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;got&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;got&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;want&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Double(%s) == %s, want %s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go &lt;span class="nb"&gt;test&lt;/span&gt;
PASS
ok      phollow.fr/string   0.010s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And now you are ready to build cool stuff with Go!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/xBMvMoLofNY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/11/building-installing-testing-golang</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/10/serveur-fichiers-statiques-golang</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/n7q5FavhvaE/serveur-fichiers-statiques-golang" />
    <title>Un simple serveur de fichiers statiques sous Golang</title>
    <published>2012-10-27T16:55:00+02:00</published>
    <updated>2012-10-27T16:55:00+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Depuis quelques semaines, je me suis mis à l’apprentissage de Go. Et pour accélérer cet apprentissage je me suis mis en tête de refaire mon serveur de fichiers statiques (celui qui sert les pages de ce blog). Il était fait en Ruby avec Sinatra, j’en parlais &lt;a href="http://phollow.fr/2012/05/jekyll-heroku-et-mon-blog/"&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Première version&lt;/h3&gt;

&lt;p&gt;Go possède déjà pas mal de bibliothèques pour tout ce qui est &lt;em&gt;networking&lt;/em&gt; et &lt;em&gt;serveurs&lt;/em&gt;. Le module &lt;code&gt;http&lt;/code&gt; possède une méthode &lt;code&gt;FileServer&lt;/code&gt; qui peut-être utilisée en tant que serveur de fichiers statiques.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;net/http&amp;quot;&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FileServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_site&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:8000&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Seconde version&lt;/h3&gt;

&lt;p&gt;La première version, aussi simple soit-elle, ne me suffisait pas. Le problème étant lié aux pages 404, Go servant la sienne. Je voulais pouvoir mettre une page customisée. La solution consiste à créer ses propres types et à les &lt;em&gt;wrapper&lt;/em&gt; autour des natifs. (Ce n’est pas de l’héritage, Go n’étant pas un langage orienté objet. Ce qui est &lt;strong&gt;bien&lt;/strong&gt;.)&lt;/p&gt;

&lt;p&gt;Mon type &lt;code&gt;errorHandle&lt;/code&gt; contient juste le type habituel, mais grâce à lui je peux faire ma propre méthode &lt;code&gt;ServeHTTP&lt;/code&gt; qui elle utilisera mon type &lt;code&gt;errorWriter&lt;/code&gt;. Il contient le type de base &lt;code&gt;ResponseWriter&lt;/code&gt; avec en plus un boolean. Je set ce boolean à &lt;code&gt;true&lt;/code&gt; quand je détecte un header 404 et je sers ma page customisée à la place.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="go"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;os&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;net/http&amp;quot;&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;html/template&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;errorWriter&lt;/span&gt; &lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;
    &lt;span class="nx"&gt;ignore&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;errorHandle&lt;/span&gt; &lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handler&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;errorHandle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ServeHTTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;errorWriter&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;errorWriter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;errorWriter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ignore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;errorWriter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ignore&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ParseFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_site/404.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FileServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;_site&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;errorHandle&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PORT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ce bout de code est capable de tourner sous Heroku (et peut-être App Engine). J’ai 2, 3 autres articles sous le feu sur ce langage qui me plaît bien.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/n7q5FavhvaE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/10/serveur-fichiers-statiques-golang</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/10/generer-html-flask-jinja2</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/YeqoFhIqfVw/generer-html-flask-jinja2" />
    <title>Générer son HTML sous Flask avec Jinja2</title>
    <published>2012-10-23T20:40:00+02:00</published>
    <updated>2012-10-23T20:40:00+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Suite du &lt;a href="http://phollow.fr/2012/08/demarrer-la-creation-site-python-flask/"&gt;précédent article&lt;/a&gt; sur le développement web avec Python &amp;amp; Flask, nous allons voir comment afficher nos différentes pages. Assembler du HTML tend à être fait avec un moteur de templates. Il en existe plusieurs sous Python, mais nous allons nous intéresser uniquement à &lt;strong&gt;Jinja2&lt;/strong&gt; étant donné qu’il est fourni de base avec Flask. &lt;em&gt;Bien sûr Flask ne vous force pas non plus à l’utiliser et rien ne vous empêche d’en prendre un autre.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Logique du code dans les templates&lt;/h3&gt;

&lt;p&gt;Si vous avez déjà utilisé des templates dans d’autres langages, vous
savez qu’il faut limiter la complexité du code à l’intérieur de ceux-ci.
Les templates proposent des opérateurs de base pour gérer des boucles ou
des conditions, et des modules pour transformer l’affichage de
certaines variables. Quand vous devez faire quelque chose de complexe,
la bonne pratique est de lire déjà la documentation pour voir s’il
n’existe pas déjà une fonction pour ça. Ensuite il est toujours possible
d’augmenter les capacités de Jinja2 avec un module fait maison. Plus
d’infos sur ça plus tard dans l’article.&lt;/p&gt;

&lt;p&gt;Toujours est-il que les templates doivent rester &lt;strong&gt;simple&lt;/strong&gt;, de telle
manière à ce qu’un designer puisse intégrer vos pages sans trop se poser de
questions (no troll).&lt;/p&gt;

&lt;h3&gt;Usage bas niveau&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="python"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;jinja2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;umad {{ name }}?&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Jérôme&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;u&amp;#39;umad Jérôme?&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Voilà en gros le principe. Dans l'utilisation courante on utilisera pas ces méthodes, car on chargera plutôt un fichier .html. Mais c’est ce qui se passe, &lt;em&gt;à peu près&lt;/em&gt;, en arrière-plan.&lt;/p&gt;

&lt;h3&gt;Exemple concret avec Flask&lt;/h3&gt;

&lt;p&gt;Il faut créer un dossier &lt;code&gt;templates/&lt;/code&gt; à la racine du projet, c’est ici que Jinja2 ira chercher par défaut vos fichiers.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="html+jinja"&gt;&lt;span class="c"&gt;{# projet/templates/layout.html: #}&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fr&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt; &lt;span class="cp"&gt;%}{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;content&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
            &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;footer&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;footer&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Copyright 2012 etc.
        &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="html+jinja"&gt;&lt;span class="c"&gt;{# projet/templates/index.html: #}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;layout.html&amp;quot;&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;

&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;Le titre de ma page&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;

&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;content&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;user&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;users&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;user&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endfor&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Et maintenant côté Python:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="python"&gt;&lt;span class="c"&gt;# projet/app.py:&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;render_template&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;Jérôme&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;u&amp;quot;Rick Astley&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;u&amp;quot;Tony Stark&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;render_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Commençons par la fin. On a une route qui pointe sur la racine du site, on crée une liste appelée &lt;code&gt;users&lt;/code&gt; contenant le nom de 3 personnes. On demande ensuite à Flask de nous retourner le template index.html en lui passant le contexte (notre liste). Le template index &lt;a href="http://jinja.pocoo.org/docs/templates/#template-inheritance"&gt;hérite&lt;/a&gt; du template layout. L’objet users étant une liste, on peut utiliser une boucle &lt;code&gt;{% for %}{% endfor %}&lt;/code&gt; pour itérer. La liste des opérateurs (boucles, conditions…) peut se trouver &lt;a href="http://jinja.pocoo.org/docs/templates/#list-of-control-structures"&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Les variables sont par défaut échappées dans Flask. (XSS, tout ça).&lt;/p&gt;

&lt;h3&gt;Les filtres&lt;/h3&gt;

&lt;p&gt;Un filtre permet de transformer une variable en la passant dans une fonction. Par exemple couper un texte au bout de X caractères, désactiver l’échappement pour cette variable en particulier, etc.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="jinja"&gt;&lt;span class="c"&gt;{# Par exemple mon_titre=&amp;quot;mon super titre&amp;quot; #}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;mon_titre&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;  -&amp;gt; &amp;quot;Mon Super Titre&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Liste des filtres disponibles de base dans Jinja2, &lt;a href="http://jinja.pocoo.org/docs/templates/#builtin-filters"&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Création d’un filtre custom pour Jinja2&lt;/h3&gt;

&lt;p&gt;C’est plutôt facile d’augmenter les capacités de Jinja2. Par exemple:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="python"&gt;&lt;span class="nd"&gt;@app.template_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;cut&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Enlève certains caractères d’une chaîne de caractères&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;




&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="jinja"&gt;&lt;span class="c"&gt;{# name=&amp;quot;foobar&amp;quot; dans cet exemple #}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;cut&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;  -&amp;gt; &amp;quot;bar&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;cut&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;f&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;span class="x"&gt;  -&amp;gt; &amp;quot;oobar&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Plus d’infos sur &lt;a href="http://jinja.pocoo.org/docs/api/#custom-filters"&gt;cette page&lt;/a&gt; et &lt;a href="http://flask.pocoo.org/docs/templating/#registering-filters"&gt;celle-ci&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Documentation&lt;/h3&gt;

&lt;p&gt;Sur cette &lt;a href="http://flask.pocoo.org/docs/templating/"&gt;page&lt;/a&gt; on explique comment Jinja2 est intégré à Flask, avec les variables présentes par défaut et certains filtres ajoutés pour l’occasion. Et voici la &lt;a href="http://jinja.pocoo.org/docs/"&gt;documentation officielle&lt;/a&gt; du moteur de templates lui-même. Et avec ça, vous devriez pouvoir tout faire :)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/YeqoFhIqfVw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/10/generer-html-flask-jinja2</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/08/demarrer-la-creation-site-python-flask</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/y6jo987K2qU/demarrer-la-creation-site-python-flask" />
    <title>Démarrer la création d’un site avec Python et Flask</title>
    <published>2012-08-15T01:00:00+02:00</published>
    <updated>2012-08-15T01:00:00+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;&lt;figure&gt;
&lt;img src="http://static.phollow.fr/2012/08/flask.png" alt="Flask"&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;J’avais envie depuis quelques jours de faire une série d’articles sur &lt;strong&gt;Python&lt;/strong&gt; et le développement d’applications web. D’une part pour montrer que ce n’est pas plus compliqué qu’un projet PHP et d’un autre côté pour montrer qu’on perd moins de temps pour faire quelque chose de propre (pas besoin de palier aux &lt;a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/"&gt;bizarreries&lt;/a&gt; du langage).&lt;/p&gt;

&lt;p&gt;Si vous n’avez jamais rien testé d’autre que PHP comme &lt;em&gt;langage de programmation&lt;/em&gt; (back-end), faites-vous une faveur et sortez de votre zone de comfort. Il n’en sortira que du bon, c’est promis.&lt;/p&gt;

&lt;p&gt;On va débuter, dans cet article, par mettre en place son projet de la meilleure façon qui soit. Et d’autres articles viendront par la suite pour montrer certains aspects du web-dev (base de données, sessions, templates, tests unitaires, &lt;abbr&gt;AJAX&lt;/abbr&gt;, cache et optimisations, déploiement…). Le tout surement sur le thème d’une petite application. &lt;em&gt;Je n’ai pas encore trouvé le sujet.&lt;/em&gt;&lt;/p&gt;

&lt;p style="text-align:center;"&gt;
&lt;img src="http://imgs.xkcd.com/comics/python.png" alt="Python" style="display:inline"&gt;
&lt;/p&gt;


&lt;h3&gt;Python&lt;/h3&gt;

&lt;p&gt;Python existe en ce moment sous 2 versions majeures : 2.X et 3.X. Je vous conseille de dévélopper avec la branche 2.X sauf si vous avez une bonne raison de faire le contraire. La version 3 est en plein développement et beaucoup de bibliothèques Python n’ont pas fait encore le grand saut. La dernière version à l’heure où j’écris ces lignes est la &lt;strong&gt;2.7.3&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Installer Python&lt;/h3&gt;

&lt;p&gt;Python est pré-installé sur Ubuntu, et OS X. Même si ces versions sont suffisantes pour faire tourner les examples de codes que je vais donner, il est préférable d’utiliser une version à jour pour un développement plus sérieux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.python-guide.org/en/latest/starting/install/osx/"&gt;Installation sous OS X&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.python-guide.org/en/latest/starting/install/linux/"&gt;Installation sous GNU/Linux, *BSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.python-guide.org/en/latest/starting/install/win/"&gt;Installation sous Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Virtualenv&lt;/h3&gt;

&lt;p&gt;Python possède une quantité incroyable d’extensions/bibliothèques que vous pouvez installer et utiliser dans vos projets. Mais quand on travaille sur plusieurs projets à la fois (et pas forcément que sur du web), on peut arriver à des problèmes de dépendances. &lt;em&gt;Mon projet A nécessite truc en version 1, mon projet B truc en version 2…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Une bonne pratique consiste à créer un environnement virtuel pour nos packages, avec un outil comme &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt;, de cette manière cet environnement sera complétement indépendant du reste du système.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;easy_install virtualenv
virtualenv mon_projet
&lt;span class="nb"&gt;cd &lt;/span&gt;mon_projet
&lt;span class="nb"&gt;source &lt;/span&gt;bin/activate &lt;span class="c"&gt;# pour l&amp;#39;activer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le répertoire &lt;strong&gt;mon_projet&lt;/strong&gt; sera crée avec tout le nécessaire. Si votre prompt change légèrement, c’est que la manipulation a fonctionné. Virtualenv est très puissant, vous pouvez même lui passer la version de Python en paramètre.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;virtualenv -p /usr/local/bin/python3.3 mon_projet
virtualenv -p /usr/local/bin/pypy mon_projet
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;C’est équivalent à ce que l‘on peut trouver chez Ruby avec Bundler. Pour désactiver un virtualenv il suffit de lancer la commande &lt;code&gt;deactivate&lt;/code&gt; dans le terminal.&lt;/p&gt;

&lt;h3&gt;Flask&lt;/h3&gt;

&lt;p&gt;Flask est un micro-framework et je pense qu’il est du coup beaucoup plus approprié dans l’apprentissage du langage Python. Contrairement à Django qui fait beaucoup de choses tout seul (ORM, validations formulaires, back-end admin…), Flask reste simple et c’est à vous de lui coder/rajouter ces composants à la main (BYOB). On en sort avec un framework flexible où je ne ressens, &lt;em&gt;personnellement&lt;/em&gt;, pas de contrainte à travailler avec.&lt;/p&gt;

&lt;p&gt;Parmis les avantages de Flask, on retrouve :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base code minimale, environ 800 lignes.&lt;/li&gt;
&lt;li&gt;Très bien testé, environ 1 500 lignes.&lt;/li&gt;
&lt;li&gt;Très bonne documentation (plus de 200 pages).&lt;/li&gt;
&lt;li&gt;Possède un système de template (Jinja2).&lt;/li&gt;
&lt;li&gt;Pousse à coder son application sous forme de services, ce qui est une bonne chose.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Installons Flask avec &lt;strong&gt;pip&lt;/strong&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pip install Flask
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Une fois installé, on va écrire notre premier script. Pour cela on va créer un dossier &lt;code&gt;mon_projet/app&lt;/code&gt; et à la racine de ce dossier un fichier &lt;code&gt;mon_projet/app/app.py&lt;/code&gt;, comme par exemple :&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="python"&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="c"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pour tester ce code, il suffit juste de lancer la commande suivante. Et d’ouvrir le navigateur sur l’URL qui sera affichée dans la console.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python app.py
 * Running on http://127.0.0.1:5000/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;GIT&lt;/h3&gt;

&lt;p&gt;Et pour faire les choses bien, on va se créer un dépôt GIT et &lt;em&gt;commiter&lt;/em&gt; tout ça. Mais avant on rajoute le &lt;code&gt;.gitgnore&lt;/code&gt; qui va bien.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;venv
*.pyc
.env
.DS_Store
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On crée le dépôt, on rajoute les fichiers et on commit avec un message &lt;em&gt;explicite&lt;/em&gt;. On peut même rajouter des supers emojis sur &lt;a href="http://www.emoji-cheat-sheet.com/"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m ":sparkles: First commit :sparkles:"
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Next step&lt;/h3&gt;

&lt;p&gt;La documentation de Flask est vraiment bien foutue, à partir de là, si vous êtes intéressé, &lt;a href="http://flask.pocoo.org/docs/quickstart/"&gt;le quickstart&lt;/a&gt; peut vous permettre de débuter rapidement avec le framework. En attendant je réfléchis à la suite de cet article.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/y6jo987K2qU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/08/demarrer-la-creation-site-python-flask</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/06/sur-levolution-du-css-et-pourquoi-ne-pas-attendre</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/geHyfU3w9dE/sur-levolution-du-css-et-pourquoi-ne-pas-attendre" />
    <title>Sur l’évolution du CSS et pourquoi ne pas attendre</title>
    <published>2012-06-17T00:36:00+02:00</published>
    <updated>2012-06-17T00:36:00+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Les variables CSS sont apparues il y a quelques jours dans le dépôt &lt;a href="http://trac.webkit.org/changeset/120154"&gt;Webkit&lt;/a&gt; et devraient être utilisables dans les dernières &lt;em&gt;nightlies&lt;/em&gt; de Safari. La norme CSS continue de se doter de fonctionnalités permettant d’avoir un code plus facilement maintenable.&lt;/p&gt;

&lt;h3&gt;Don’t repeat yourself they said&lt;/h3&gt;

&lt;p&gt;À l’heure actuelle, sans variables, la duplication de code est inévitable sur des projets de taille moyenne ou plus. Imaginons une palette de 5 couleurs sur un site, si on vous demande d’en changer une sur les 5, vous devez faire un rechercher/remplacer sur les fichiers .css. Alors qu’avec les variables vous n’avez qu’une ligne à éditer.&lt;/p&gt;

&lt;h3&gt;Syntaxe de la spécification&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;-webkit-var-foreground: red;
-webkit-var-background: rgb(255, 255, 255);
-webkit-var-fontsize: 1.5em;

color: -webkit-var(foreground);
background-color: -webkit-var(background);
font-size: -webkit-var(fontsize);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La syntaxe est encore trop verbeuse à mon goût—et les préfixes webkit n’aidant pas non plus—on est loin de ce que propose un pré-processeur type &lt;strong&gt;Sass&lt;/strong&gt; :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$foreground: red;
$background: rgb(255,255,255);
$fontsize: 1.5em;

color: $foreground;
background-color: $background;
font-size: $fontsize;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;D’autres améliorations sur les sélecteurs&lt;/h3&gt;

&lt;p&gt;Les sélecteurs CSS v4 sont en cours de &lt;a href="http://www.w3.org/TR/selectors4/"&gt;draft&lt;/a&gt; et devraient permettre eux aussi des choses assez sympathiques. Notamment pouvoir &lt;a href="http://www.w3.org/TR/selectors4/#subject"&gt;styler le parent&lt;/a&gt; d’un sélecteur bien précis.&lt;/p&gt;

&lt;h3&gt;Ne pas attendre&lt;/h3&gt;

&lt;p&gt;Le problème c’est qu’il va falloir attendre plusieurs années afin de pouvoir utiliser les spécifications natives sur nos navigateurs courants. Personnellement j’en ai un peu marre de coder du CSS &lt;em&gt;comme dans les années 2000&lt;/em&gt;, et si je peux profiter d’ores et déjà d’une aide non négligeable, alors pourquoi pas ?&lt;/p&gt;

&lt;p&gt;Je parle bien-sûr des pré-processeurs du type &lt;a href="http://sass-lang.com"&gt;Sass&lt;/a&gt;, &lt;a href="http://lesscss.org"&gt;Less&lt;/a&gt; ou &lt;a href="http://learnboost.github.com/stylus/"&gt;Stylus&lt;/a&gt; parmi d’autres. Je ne vais pas faire un billet sur leur fonctionnement, j’en ai déjà fait un &lt;a href="http://phollow.fr/2012/03/sass-css-on-fire-that-sucks-less"&gt;ici&lt;/a&gt;, mais plutôt vous faire part de ce que j’en pense, après avoir utilisé Sass &amp;amp; Compass sur un &lt;a href="http://fakeimg.pl"&gt;projet perso&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;With great power comes great responsibility&lt;/h3&gt;

&lt;p&gt;Le reproche que l’on fait souvent à ce type d’outils est la qualité du code produit. Les pré-processeurs ne sont seulement &lt;strong&gt;que&lt;/strong&gt; des outils et ne produisent que ce qu’on leur demande de produire. Si vous lui demandez effectivement de produire de la merde, c’est ce qu’il fera. Il y a deux choses importantes à retenir :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Je ne conseille pas ces outils à des débutants ou à de mauvais intégrateurs. Ou aux psycho-rigides.&lt;/li&gt;
&lt;li&gt;Il faut avoir une idée de ce que telle fonction est susceptible de produire, pour ça il suffit de lire la documentation. &lt;strong&gt;RTFM&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Si vous êtes plutôt mauvais côté intégration, ces outils ne vous aideront pas, au contraire. Par contre je pense que ça peut rendre quelqu’un beaucoup plus efficace, s’il l’est déjà.&lt;/p&gt;

&lt;h3&gt;Fausses idées et ignorance&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“ J’ai pas envie de rajouter du JS pour interpréter LESS sur mes pages et les alourdir. Hurr durr derp. ”&lt;/em&gt; ← Aucun script .js n’est nécessaire en prod, tu compiles un .css et tu utilises le .css, point barre. Le .js est utile (dans le cas de Less) lors du développement pour ne pas avoir à compiler à la main à chaque changements. Et uniquement en développement.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“ J’ai parfois envie de modifier le code .css en live en production ”&lt;/em&gt; ← Sérieusement ?&lt;/li&gt;
&lt;li&gt;&lt;em&gt;“ En équipe les autres doivent être aussi formés ”&lt;/em&gt; ← Je suis d’accord. Il n’y a pas grand chose à apprendre non plus, il suffit de jouer une petite après-midi avec.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Il faut savoir que la plupart de ces fausses idées proviennent de personnes qui n’ont jamais testé l’outil. Un &lt;a href="http://blog.kaelig.fr/post/24877648508/preprocesseurs-css-renoncer-par-choix-ou-par"&gt;billet&lt;/a&gt; intéressant sur ça justement.&lt;/p&gt;

&lt;h3&gt;Retour sur mon utilisation&lt;/h3&gt;

&lt;p&gt;J’ai décidé d’intégrer &lt;a href="http://fakeimg.pl"&gt;Fake Images Please?&lt;/a&gt; en utilisant justement Sass+Compass pour me faire une opinion dessus.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;J’ai changé plusieurs fois de palettes de couleurs, de largeur de colonnes pour la grille, de familles de polices… Les variables sont vraiment un gain de temps.&lt;/li&gt;
&lt;li&gt;Échelle typographique avec Compass super simple. On définit une taille de base en pixel, avec le line-height associé. Tout est recalculé en ems (taille relative des headings, margin, padding, etc.). Ça c’est ce que je faisais à la main en CSS.&lt;/li&gt;
&lt;li&gt;Utilisation d’une grille CSS simplifiée aussi. Dans le sens où au lieu de prendre un framework CSS existant où le nombre et la largeur des colonnes sont souvent pré-définies, ici j’ai utilisé &lt;a href="http://susy.oddbird.net/tutorial/"&gt;Susy&lt;/a&gt;. Tu définis le nombre de colonnes, la taille et cette grid s’adapte à ton DOM (et pas l’inverse qui t’oblige à utiliser leurs classes).&lt;/li&gt;
&lt;li&gt;Compilation automatique à chaque changement dans le fichier, donc pas de perte de temps à ce niveau là. Mon fichier .html lui link uniquement le fichier .css compilé final.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;TL;DR&lt;/h3&gt;

&lt;p&gt;Je dirais juste à essayer (essayer concrètement) avant de dire que l’on aime pas. Ces fonctionnalités arriveront tôt ou tard dans la norme CSS. Et il y a beaucoup de temps à gagner si on sait utiliser les pré-processeurs.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/geHyfU3w9dE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/06/sur-levolution-du-css-et-pourquoi-ne-pas-attendre</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/05/jekyll-heroku-et-mon-blog</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/QHMy6Ie_LKM/jekyll-heroku-et-mon-blog" />
    <title>Jekyll, Heroku et mon blog</title>
    <published>2012-05-20T01:30:22+02:00</published>
    <updated>2012-05-20T01:30:22+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;La migration du blog vers Jekyll était une première étape nécessaire pour une migration complète vers une solution gratuite – &lt;em&gt;ou presque&lt;/em&gt;. Quand le site web n’est plus qu’une collection de fichiers statiques, l’hébergement devient vraiment simple.&lt;/p&gt;

&lt;h3&gt;Heroku&lt;/h3&gt;

&lt;p&gt;Heroku est une plate-forme &lt;em&gt;cloud&lt;/em&gt; qui peut faire tourner des applications Python, Ruby, Scala etc. Le déploiement d’une app n’est pas plus compliqué qu’un &lt;code&gt;git push heroku master&lt;/code&gt;. J’utilise la solution gratuite qui est amplement suffisante pour ce blog. Et si un jour ce blog devient extraordinairement populaire, je pourrai &lt;em&gt;scaler&lt;/em&gt; simplement avec &lt;code&gt;ps:scale web=x&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Amazon S3&lt;/h3&gt;

&lt;p&gt;J’en avais déjà parlé sur l’article précédent, les images et les uploads divers des articles sont tous stockés sur Amazon S3. C’était pour préparer la migration sur Heroku, car on est limité à 100Mo pour une application donné. Une application dont le code source fait 100Mo, c’est déjà énorme je trouve. Et généralement personne ne stocke les uploads d’une app. web dans un sous-dossier de l’application elle-même.&lt;/p&gt;

&lt;p&gt;Du coup ça peut me permettre de stocker des trucs vraiment énormes sans avoir de limite (sauf les limites de mon porte-monnaie évidemment). D’un point de vue argent justement, S3 est la seule chose que je paie pour héberger ce blog, et pour info j’en suis à $0.03 depuis le début du mois.&lt;/p&gt;

&lt;h3&gt;Sinatra&lt;/h3&gt;

&lt;p&gt;Heroku ne permet pas de déployer juste un tas de fichiers statiques, par contre rien ne nous empêche de développer une application proxy, ici Sinatra, servant seulement à servir ces fichiers. Le code de l’application est simple&amp;thinsp;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="c1"&gt;# encoding: utf-8&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sinatra&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:public_folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;_site&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;# Last modification time for browser cache&lt;/span&gt;
  &lt;span class="vi"&gt;@last_mod_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;IE=Edge,chrome=1&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;expires&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:must_revalidate&lt;/span&gt;
  &lt;span class="n"&gt;last_modified&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@last_mod_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;send_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_site/index.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/*&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;_site/&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:splat&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/index.html&amp;#39;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;FileTest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exist?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;send_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;halt&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;not_found&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;send_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_site/404.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Le code de l’application a été mise à jour sur le &lt;a href="https://github.com/Rydgel/phollow"&gt;dépôt Github du blog&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Autres solutions&lt;/h3&gt;

&lt;p&gt;Heroku n’est pas la seule manière d’héberger votre blog à moindre coût. On peut utiliser entre autre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les pages Github &lt;a href="http://pages.github.com/"&gt;http://pages.github.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mettre le site en entier dans Amazon S3&lt;/li&gt;
&lt;li&gt;Dropbox&lt;/li&gt;
&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/QHMy6Ie_LKM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/05/jekyll-heroku-et-mon-blog</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/05/css3-et-polices-opentype</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/E83WxPxFulU/css3-et-polices-opentype" />
    <title>CSS3 et polices OpenType</title>
    <published>2012-05-15T00:00:32+02:00</published>
    <updated>2012-05-15T00:00:32+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Les polices au format OpenType ont pour avantage de prendre en charge un jeu de caractères étendus et offrent plus d’options au niveau de la présentation. Par exemple on peut gérer les &lt;em&gt;ligatures discrètes&lt;/em&gt;, les &lt;em&gt;fractions&lt;/em&gt;, les &lt;em&gt;petites capitales&lt;/em&gt;… Les graphistes ont longtemps été seuls à pouvoir jouer avec ces fonctionnalités, mais savez-vous que vous pouvez faire la même chose avec un peu de CSS3 ?&lt;/p&gt;

&lt;h3&gt;Exemple des ligatures&lt;/h3&gt;

&lt;p&gt;Prenons par exemple les ligatures. C’est une des choses que je voulais depuis longtemps et qui est maintenant possible sur une page web. Le but d’une ligature est de rendre le texte plus lisible et plus beau aussi, comme en évitant une transition grossière entre un &lt;em&gt;f&lt;/em&gt; et un &lt;em&gt;i&lt;/em&gt;. Les ligatures fusionnent deux caractères et le résultat est vraiment considéré comme un seul.&lt;/p&gt;

&lt;p class="fullsizestuff" style='font-size: 112px; text-rendering: optimizelegibility; -moz-font-feature-settings:"liga=1, dlig=1"; -ms-font-feature-settings:"liga", "dlig"; -o-font-feature-settings:"liga", "dlig"; -webkit-font-feature-settings:"liga", "dlig"; font-feature-settings:"liga", "dlig";margin-bottom: 30px;'&gt;
fleurs, fille, off.
&lt;/p&gt;


&lt;p&gt;Vous devriez voir trois ligatures ci-dessus si votre navigateur supporte ces réglages, sinon vous pouvez toujours allez voir sur cette &lt;a href="http://static.phollow.fr/2012/05/ligatures.png" title="ligatures-phollow"&gt;image&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;font-feature-settings&lt;/h3&gt;

&lt;p&gt;Alors, comment en profiter à l’aide du CSS3 ? Il y a une nouvelle propriété utilisée pour ça qui s’appelle &lt;code&gt;font-feature-settings&lt;/code&gt;. Voici le code utilisé pour l’exemple de ce billet.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;p {
    -moz-font-feature-settings:"liga=1, dlig=1"; 
    -ms-font-feature-settings:"liga", "dlig"; 
    -o-font-feature-settings:"liga", "dlig"; 
    -webkit-font-feature-settings:"liga", "dlig"; 
    font-feature-settings:"liga", "dlig";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vous avez sûrement remarqué les mots-clefs &lt;code&gt;liga&lt;/code&gt; et &lt;code&gt;dlig&lt;/code&gt;. Chacun possède une signification propre et active une spécificité OpenType, voici la liste complète :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;liga&lt;/code&gt; ligatures communes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dlig&lt;/code&gt; ligatures discrètes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smcp&lt;/code&gt; small-caps, petites capitales&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lnum&lt;/code&gt; lining-numeral, c’est ce que j’appelle les &lt;em&gt;chiffres minuscules&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onum&lt;/code&gt; old-style numeral, les chiffres en mode &lt;em&gt;old-school&lt;/em&gt;, par exemple le &lt;em&gt;1&lt;/em&gt; ressemble un peu à un I.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swsh n&lt;/code&gt; les swashs, &lt;em&gt;n&lt;/em&gt; étant le numéro de l’index voulu, certaines polices en ayant plusieurs. Ce sont des décorations pour certaines lettres, généralement sur des polices de type &lt;em&gt;script&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ss01–20&lt;/code&gt; styleset (01—20)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Plus d’infos : &lt;a href="https://developer.mozilla.org/en/CSS/-moz-font-feature-settings" title="font-feature-settings"&gt;font-feature-settings sur MDN&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Support navigateurs&lt;/h3&gt;

&lt;p&gt;Le support des navigateurs n’est pas encore parfait, néanmoins rien ne vous empêche de l’utiliser à présent. Rien ne changera pour les navigateurs ne supportant pas cette norme, ils verront le texte… comme d’habitude. Les navigateurs supportant cette règle CSS3 sont Chrome, Safari et Firefox sur Mac. Sur Windows, il y a seulement Chrome et Safari d’après mes tests rapides. J’ai pu voir que cela marchait aussi sur Chrome Linux, je n’ai pas testé les autres. Je parle bien-sûr des &lt;strong&gt;dernières&lt;/strong&gt; versions en date de chaque navigateur.&lt;/p&gt;

&lt;h3&gt;Où trouver des webfonts compatibles ?&lt;/h3&gt;

&lt;p&gt;C'est là que le bât blesse. Après quelques recherches je me suis rendu compte que le service que j’utilise, &lt;a href="http://typekit.com" title="typekit"&gt;Typekit&lt;/a&gt; ne prend pas encore en compte cette fonctionnalité. &lt;em&gt;Du moins sur les polices que j’ai essayé.&lt;/em&gt; Par contre FontDeck commence à répertorier ce genre de police sous le label &lt;a href="http://fontdeck.com/typefaces/all/tags/opentype" title="FontDeck OpenType"&gt;Opentype&lt;/a&gt;. En allant sur le détail d‘une police, on peut voir les options OpenType gérées. Certaine comme &lt;a href="http://fontdeck.com/typeface/magneta" title="Magenta"&gt;Magenta&lt;/a&gt; en possède pas mal !&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/E83WxPxFulU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/05/css3-et-polices-opentype</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/05/de-wordpress-a-jekyll</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/n9ak9kH3878/de-wordpress-a-jekyll" />
    <title>De Wordpress à Jekyll</title>
    <published>2012-05-06T23:00:00+02:00</published>
    <updated>2012-05-06T23:00:00+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p class="lettrine"&gt;Cela fait plusieurs mois que j’en avait envie, je l’ai finalement fait ce week-end : une migration &lt;em&gt;complète&lt;/em&gt; de mon blog Wordpress vers Jekyll. Vous ne devriez pas voir énormément de différences… Non, la différence est surtout pour moi, l’écriture et la gestion du site.&lt;/p&gt;


&lt;p&gt;Je n’étais pas vraiment malheureux avec Wordpress, non. Seulement embêté par certaines &lt;em&gt;fonctionnalités&lt;/em&gt;. Par exemple l’édition d’articles est juste infâme, je finissais souvent par utiliser l’éditeur HTML en fait. La performance de Wordpress est minable sans plugin externe (cache), car il fait les mêmes requêtes SQL à chaque pages vues. &lt;em&gt;On ne sait jamais, peut-être que l’article change toutes les 5 minutes ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bref, je m’égare en trollant, parlons un peu de cette migration.&lt;/p&gt;

&lt;h3&gt;Jekyll&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; est un “générateur de sites statiques”, écrit en Ruby. Il y en a d’autres comme &lt;a href="http://ringce.com/hyde"&gt;Hyde&lt;/a&gt; ou Blatter en Python. J’ai essayé Jekyll et Hyde, j’ai trouvé le premier plus flexible, notamment au niveau de la gestion des filtres Liquid customisé et des permalinks.&lt;/p&gt;

&lt;h3&gt;Pourquoi avoir migré sur un système statique ?&lt;/h3&gt;

&lt;p&gt;Plusieurs raisons à cela mon bon monsieur.&lt;/p&gt;

&lt;h4&gt;Gain de mémoire et performances&lt;/h4&gt;

&lt;p&gt;Ce blog est hébergé sur un petit serveur virtuel. PHP et MySQL étant assez gourmand au niveau mémoire, me passer d’eux est non négligeable avec mes 512mb de RAM.&lt;/p&gt;

&lt;p&gt;N’ayant pas énormément de visites, on ne peut pas dire que mes instances PHP travaillaient beaucoup. Mais on ne peut pas battre la performance de pages .html directement servies par Nginx.&lt;/p&gt;

&lt;h4&gt;Plus simple pour écrire&lt;/h4&gt;

&lt;p&gt;Sur Wordpress quand tu veux écrire un article, tu dois t’identifier dans l’interface d’administration, chercher le lien pour ajouter un article dans &lt;strong&gt;le bordel ambiant&lt;/strong&gt;, cliquer dessus, et là tu peux commencer à t’amuser. Ah et tu dois être connecté aussi.&lt;/p&gt;

&lt;p&gt;Avec Jekyll, mes articles sont de simples fichiers textes en Markdown ou HTML. Je peux écrire et tester le rendu de l’article localement sans avoir besoin d’être connecté aux internets.&lt;/p&gt;

&lt;h4&gt;Backup&lt;/h4&gt;

&lt;p&gt;Le site n’est qu’un ensemble de fichiers, donc &lt;strong&gt;Git&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Utilisation&lt;/h3&gt;

&lt;p&gt;Généralement un site basique sous Jekyll ressemble à ça :&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="sh"&gt;.
|-- _config.yml
|-- _includes
|-- _layouts
|   |-- default.html
|   &lt;span class="sb"&gt;`&lt;/span&gt;-- post.html
|-- _posts
|   |-- 2007-10-29-why-every-programmer-should-play-nethack.textile
|   &lt;span class="sb"&gt;`&lt;/span&gt;-- 2009-04-26-barcamp-boston-4-roundup.textile
|-- _site
&lt;span class="sb"&gt;`&lt;/span&gt;-- index.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;_config.yml&lt;/h4&gt;

&lt;p&gt;Diverses variables utilisées pour la configuration, comme les permalinks, le moteur de rendu Markdown et d’autres choses.&lt;/p&gt;

&lt;h4&gt;_includes&lt;/h4&gt;

&lt;p&gt;Généralement des &lt;em&gt;partials&lt;/em&gt; que vous pouvez utiliser dans vos templates. Si vous avez plusieurs bouts de HTML qui se répète un peu partout dans vos pages, c’est bon de les factoriser ici.&lt;/p&gt;

&lt;h4&gt;_layouts&lt;/h4&gt;

&lt;p&gt;Les templates de vos pages web.&lt;/p&gt;

&lt;h4&gt;_posts&lt;/h4&gt;

&lt;p&gt;Vos articles écrits en .html, .markdown ou .textile. Jekyll se basera sur l’extension lors de la compilation.&lt;/p&gt;

&lt;h4&gt;_site&lt;/h4&gt;

&lt;p&gt;Après compilation, toutes les pages iront dans ce dossier. C’est sur ce dossier que vous devez faire pointer votre serveur web.&lt;/p&gt;

&lt;h4&gt;Lancer Jekyll en local&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;jekyll --server&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;Migrations&lt;/h3&gt;

&lt;p&gt;J’avais vraiment envie de garder l’existant, et donc il a fallut trouver des astuces pour la migration. Rentrons dans le vif du sujet.&lt;/p&gt;

&lt;h4&gt;Bouger le contenu&lt;/h4&gt;

&lt;p&gt;Pour rapatrier les articles, j’ai utilisé un utilitaire appelé &lt;a href="https://github.com/thomasf/exitwp"&gt;exitwp&lt;/a&gt;. Je n’ai pas converti les anciens articles en Markdown pour garder au maximum le rendu qu’avaient les anciens articles (oui parce que Wordpress te rajoute plein de merdes en HTML, qui aurait été viré avec la conversion). Heureusement rien ne m’empêche d’écrire les nouveaux billets autrement.&lt;/p&gt;

&lt;p&gt;Wordpress met généralement tout ce que tu uploads dans un dossier. J’ai voulu les mettre sur Amazon pour gagner de l’espace disque. J’ai utilisé cette commande :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;s3cmd put --acl-public --recursive --guess-mime-type * s3://phollow&lt;/code&gt;&lt;/pre&gt;


&lt;h4&gt;Note sur les commentaires&lt;/h4&gt;

&lt;p&gt;Avec un site statique tu ne peux plus utiliser un système de commentaires &lt;em&gt;server-side&lt;/em&gt;. Du coup on peut se rabattre sur un système comme Disqus ou Livefyre. &lt;strong&gt;Important&lt;/strong&gt; : pour importer les anciens commentaires, il suffit d’installer un de ces systèmes sur Wordpress &lt;strong&gt;avant&lt;/strong&gt; la migration.&lt;/p&gt;

&lt;h3&gt;Code source&lt;/h3&gt;

&lt;p&gt;Je mets à disposition le code source de la nouvelle version du site sur Github à cette &lt;a href="https://github.com/Rydgel/phollow"&gt;adresse&lt;/a&gt;. Il y a quelques trucs sympas, dont un Rakefile qui permet le déploiement des articles au travers de rsync.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake deploy&lt;/code&gt;&lt;/pre&gt;

&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/n9ak9kH3878" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/05/de-wordpress-a-jekyll</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/03/sass-css-on-fire-that-sucks-less</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/PsmTFxpGR_4/sass-css-on-fire-that-sucks-less" />
    <title>Sass – CSS on fire that sucks less</title>
    <published>2012-03-04T21:30:32+01:00</published>
    <updated>2012-03-04T21:30:32+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">Le &lt;abbr&gt;css&lt;/abbr&gt; permet de définir des styles au travers d’un langage déclaratif, de sélecteurs, propriétés et valeurs. Le tout saupoudrée d’une notion d’héritage basique. Ce qui peut amener certains problèmes sur le long terme : répétition de code et complexification du fichier CSS où les relations entres nos éléments du &lt;abbr&gt;DOM&lt;/abbr&gt; ne sont pas forcément claires.&lt;/p&gt;
&lt;p&gt;&lt;abbr&gt;&lt;b&gt;Sass&lt;/b&gt;&lt;/abbr&gt; étend les capacités du &lt;abbr&gt;css&lt;/abbr&gt; en rajoutant la possibilité d’utiliser des variables, des fonctions, l’héritage de sélection… Tout un tas de choses qui permet non seulement de simplifier le code mais aussi, selon moi, de rendre plus &lt;em&gt;logique&lt;/em&gt; les feuilles de styles. La structure du &lt;abbr&gt;dom&lt;/abbr&gt; saute facilement aux yeux.&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;On installe &lt;abbr&gt;sass&lt;/abbr&gt; comme n’importe quelle autre gem Ruby.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install sass
sass --watch default.scss
&gt;&gt;&gt; Sass is watching for changes. Press Ctrl-C to stop.
  overwrite default.css
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous l’avez compris, le fichier est &lt;em&gt;automagiquement&lt;/em&gt; compilé en &lt;abbr&gt;css&lt;/abbr&gt; à la volée grâce à l’attribut &lt;strong&gt;watch&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Les 2 types de syntaxes&lt;/h3&gt;
&lt;p&gt;Il y a deux syntaxes différentes qui n’influent pas sur les fonctionnalités. On va dire que c’est une question de goût. Il y a une version &lt;em&gt;Python-like&lt;/em&gt; (&lt;abbr&gt;sass&lt;/abbr&gt;) qui, historiquement, était la première. La seconde (&lt;abbr&gt;scss&lt;/abbr&gt; – Sassy &lt;abbr&gt;CSS&lt;/abbr&gt;) reprend la syntaxe du &lt;abbr&gt;css&lt;/abbr&gt;. L’avantage de celle-ci étant qu’un fichier &lt;abbr&gt;.css&lt;/abbr&gt; est aussi un fichier &lt;abbr&gt;.scss&lt;/abbr&gt;.&lt;br&gt;La différence se fait par le compilateur sur l’extension.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SASS */&lt;/span&gt;
&lt;span class="nt"&gt;section&lt;/span&gt;
  &lt;span class="nt"&gt;margin-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1em&lt;/span&gt;
  &lt;span class="nc"&gt;.entry&lt;/span&gt;
    &lt;span class="nt"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;red&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;margin-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Imbrication&lt;/h3&gt;
&lt;h4&gt;Principe&lt;/h4&gt;
&lt;p&gt;Le meilleur moyen d’éviter la répétition est d’imbriquer les sélecteurs entre eux. Dans la suite de l’article je montrerai le code &lt;abbr&gt;scss&lt;/abbr&gt; et l’équivalent compilé en &lt;abbr&gt;css&lt;/abbr&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="nc"&gt;.hl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;section&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="k"&gt;margin-top&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="nc"&gt;.hl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2em&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="nc"&gt;.hl&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="nc"&gt;.ln&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;article&lt;/span&gt; &lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;margin-top&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Le sélecteur parent&lt;/h4&gt;
&lt;p&gt;Pense juste à &lt;span class="code"&gt;self&lt;/span&gt; ou &lt;span class="code"&gt;this&lt;/span&gt; comme dans les langages objets, copain. Dans &lt;abbr&gt;sass&lt;/abbr&gt; on utilise le symbole &lt;span class="code"&gt;&amp;&lt;/span&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#324567&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;:&lt;/span&gt;&lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;red&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;inline-block&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="nc"&gt;.6em&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#324567&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;inline&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;line-height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;red&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Media queries&lt;/h4&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="nf"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2.5em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;max-width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;460px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1.5em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nf"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2.5em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="nt"&gt;screen&lt;/span&gt; &lt;span class="nt"&gt;and&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;max-width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;460px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;#content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1.5em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Les variables&lt;/h3&gt;
&lt;p&gt;J’ai déjà eu la nécessité de changer une ou plusieurs couleurs dans le thème d’un site. C’est donc X lignes que tu dois modifier. Avec les variables on a pas ce problèmes là, il suffit de définir les couleurs une fois seulement. Les variables dans &lt;abbr&gt;sass&lt;/abbr&gt; peuvent aussi stocker des tailles, des chaînes de caractères…&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;link-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;blue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;link-hover&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;red&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;3px&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;:&lt;/span&gt;&lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;pad&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;@extend&lt;/h3&gt;
&lt;p&gt;Cet attribut permet de spécifier qu’une classe hérite des propriétés d’une autre. Imaginons que vous ayez une classe &lt;span class="code"&gt;.button&lt;/span&gt; contenant le style de base d’un bouton sur votre site et une classe &lt;span class="code"&gt;.button-submit&lt;/span&gt; qui lui aura juste une couleur différente. L’attribut &lt;span class="code"&gt;@extend&lt;/span&gt; vous évite à mettre dans le &lt;abbr&gt;dom&lt;/abbr&gt; les 2 classes sur ce bouton mais uniquement la dernière.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0.2em&lt;/span&gt; &lt;span class="m"&gt;0.8em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0.4em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.button-submit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.button-submit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0.2em&lt;/span&gt; &lt;span class="m"&gt;0.8em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0.4em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.button-submit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Mixins&lt;/h3&gt;
&lt;p&gt;Les mixins ce sont des bouts de codes que tu peux rappeler ensuite ailleurs dans tes classes. Utiles pour éviter la duplication de codes encore une fois. Des valeurs peuvent être envoyés en paramètres, et celles-ci sont nommées et peuvent avoir une valeur par défaut.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* SCSS */&lt;/span&gt;
&lt;span class="k"&gt;@mixin&lt;/span&gt; &lt;span class="nt"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;10px&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;-webkit-border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nt"&gt;-moz-border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.msg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.msg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;border&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Autres fonctionnalités&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vous pouvez diviser votre code en plusieurs fichiers et les importer avec &lt;span class="code"&gt;@import&lt;/span&gt;, ils seront combinés avec la compilation&lt;/li&gt;
&lt;li&gt;Des méthodes de calculs sont supportées, vous pouvez additionner, diviser et jouer avec les tailles, couleurs et autres valeurs.&lt;/li&gt;
&lt;li&gt;Des opérateurs &lt;span class="code"&gt;@if&lt;/span&gt;, &lt;span class="code"&gt;@else&lt;/span&gt;, &lt;span class="code"&gt;@else if&lt;/span&gt;, des opérateurs de logique &lt;span class="code"&gt;and&lt;/span&gt;, &lt;span class="code"&gt;or&lt;/span&gt;, &lt;span class="code"&gt;=&lt;/span&gt;, ainsi que des boucles &lt;span class="code"&gt;@for&lt;/span&gt;, &lt;span class="code"&gt;@while&lt;/span&gt; et &lt;span class="code"&gt;@each&lt;/span&gt; sont supportés. Mais je suis moins fan de ce genre de pratiques dans un fichier de style.&lt;/li&gt;
&lt;li&gt;Des méthodes pour jouer sur les couleurs : plus foncé, plus clair…&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;abbr&gt;Sass&lt;/abbr&gt; peut rendre l’utilisation du &lt;abbr&gt;css&lt;/abbr&gt; plus sympathique. Si vous voulez en savoir plus je vous conseille de vous rendre sur la &lt;a href="http://sass-lang.com/" title="Sass" target="_blank"&gt;page officielle&lt;/a&gt; de l’application. Vous y trouverez des exemples et de la documentation sur d’autres fonctionnalités non évoquées ici.&lt;/p&gt;
&lt;p&gt;Si Ruby vous rebute, il y a une autre application qui s’appelle &lt;a href="http://lesscss.org/" title="LESS CSS" target="_blank"&gt;LESS&lt;/a&gt; et qui fait en gros la même chose, la syntaxe étant un peu différente.&lt;/p&gt;
&lt;p&gt;En tout cas une chose est sûre, je vais l’utiliser sur mon prochain projet. &lt;em&gt;Reste à trouver le projet.&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/PsmTFxpGR_4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/03/sass-css-on-fire-that-sucks-less</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2012/02/enlarge-your-police</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/klOuOaMIhCM/enlarge-your-police" />
    <title>Enlarge your police</title>
    <published>2012-02-04T22:42:16+01:00</published>
    <updated>2012-02-04T22:42:16+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p class="lettrine"&gt;Rien à voir avec les spams de Viagra. Non. Sous ce titre un peu malicieux, je tenais à vous parler d’une chose que je ne supporte plus : les tailles de texte minuscules dans les pages &lt;abbr&gt;html&lt;/abbr&gt;. Cette impression d’avoir sous les yeux le dictionnaire Édition Larousse en &lt;em&gt;lisant&lt;/em&gt; un article de blog.&lt;/p&gt;
&lt;p&gt;Pourtant je ne pense pas qu’il soit plus difficile de lire sur un écran que de lire un livre. Il suffit de &lt;em&gt;copier&lt;/em&gt; la façon dont les livres mettent en page le texte.&lt;/p&gt;
&lt;p&gt;Pour être un peu plus précis, le problème se situe souvent sur le nombre de caractères que contient une ligne de texte. La taille de la police sera donc à priori proportionnelle à la largeur de son conteneur.&lt;/p&gt;
&lt;h3&gt;Être lu comme on lit un livre&lt;/h3&gt;
&lt;p&gt;Partons d’un constat simple : je suppose que pour vous aussi il est plus facile de lire un bouquin que de lire pendant pas mal de temps sur votre écran d’ordinateur. Le premier argument pour ça est de dire que c’est l’écran qui fatigue les yeux. Pour moi la vraie raison est la taille minuscule des typos sur le net.&lt;/p&gt;
&lt;p&gt;Depuis plusieurs jours j’ai une &lt;em&gt;obsession&lt;/em&gt;. Je compare les articles de blog à des livres de ma bibliothèque. Et souvent je vois la même chose : on est largement &lt;strong&gt;en dessous des 16px&lt;/strong&gt; par défaut des navigateurs. À croire que les designers cherchent à mettre le plus d’informations possible dans le moins d’espace possible. Ça peut marcher pour quelques applications web mais pas pour une longue lecture.&lt;/p&gt;
&lt;h3&gt;Le nombre optimal de caractères par lignes&lt;/h3&gt;
&lt;p&gt;Tout est une histoire de rythme. Si une ligne est trop longue, le lecteur aura du mal à bien voir où une ligne commence et termine. Ça sera plus difficile de trouver la prochaine ligne sur de long bloc de texte. Pas top pour se concentrer dessus.&lt;/p&gt;
&lt;p&gt;Inversement, des lignes trop courtes cassent le rythme de lecture. Elle se retrouve artificiellement accélérée et le lecteur sautera parfois des mots (pouvant être important à la compréhension).&lt;/p&gt;

&lt;blockquote style="margin-bottom:0"&gt;Anything from 45 to 75 characters is widely regarded as a satisfactory length of line for a single-column page set in a serifed text face in a text size. The 66-character line (counting both letters and spaces) is widely regarded as ideal. For multiple column work, a better average is 40 to 50 characters.&lt;/blockquote&gt;
&lt;cite style="color:#99968A; display: block;"&gt;— The Elements &lt;em&gt;of&lt;/em&gt; Typographic Style Applied &lt;em&gt;to the&lt;/em&gt; Web &lt;sup style="height: 0;line-height: 1;vertical-align: baseline;position: relative;bottom:1ex;"&gt;*&lt;/sup&gt;&lt;/cite&gt;
&lt;br&gt;
&lt;p&gt;La bonne pratique est donc d’avoir environ &lt;strong&gt;66 caractères par lignes&lt;/strong&gt;, en comptant les espaces aussi. Le &lt;abbr&gt;css&lt;/abbr&gt; avec les media-queries deviennent indispensables sur une page fluide, la largeur des colonnes de texte pouvant changer selon la résolution.&lt;br&gt;&lt;em&gt;Je dois d’ailleurs améliorer pas mal ça sur mon blog.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Autres considérations&lt;/h3&gt;
&lt;p&gt;Ne pas hésiter à utiliser des interlignes amples dans vos textes. En utilisant la propriété &lt;abbr&gt;css&lt;/abbr&gt; &lt;span class="code"&gt;line-height&lt;/span&gt; avec un coefficient sans unité. Par exemple 1.5 est une bonne base, à ajuster suivant la police.&lt;/p&gt;
&lt;p&gt;Les nouveaux paragraphes doivent être bien marqués. On peut utiliser des lettrines, de l’indentation, un pied-de-mouche (❡) ou simplement un saut de ligne.&lt;/p&gt;
&lt;p&gt;Éviter la justification sur des colonnes de textes minces. Mais généralement la justification sur le web ne &lt;em&gt;fonctionne pas&lt;/em&gt;. À cause du support des &lt;a href="http://phollow.fr/2011/10/les-cesures-dans-le-web/" title="césures"&gt;césures&lt;/a&gt; encore aléatoire, du manque de crénage (kerning) automatique et des ligatures (on y vient avec Firefox &lt;sup style="height: 0;line-height: 1;vertical-align: baseline;position: relative;bottom:0.5ex;"&gt;†&lt;/sup&gt;).&lt;/p&gt;
&lt;p&gt;Enfin les polices &lt;strong&gt;serifs&lt;/strong&gt; facilitent la lecture. Boudées pendant un temps à cause des résolutions assez basses de nos écrans, elles sont parfaitement &lt;a href="http://phollow.fr/2011/10/mes-polices-web-preferees-serifs/" title="serifs"&gt;utilisables&lt;/a&gt; de nos jours.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Voilà pourquoi j’ai augmenté la taille du texte ici. Si votre navigateur à une taille de police de 16px par défaut, alors ce texte devrait faire 20px. Et si vous avez lu mon article jusque ici, j’aurai gagné une partie de mon pari.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Et promis j’arrête de vous faire chier avec la typographie avant un bout de temps.&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align:center;font-size: 2em;"&gt;❧&lt;/p&gt;
&lt;ul class="footnotes" style="color:#99968A;font-size:0.8em;"&gt;
&lt;li&gt;&lt;sup style="height: 0;line-height: 1;vertical-align: baseline;position: relative;bottom:1ex;"&gt;*&lt;/sup&gt; Une lecture que je conseille fortement, plein de conseils et de bonnes pratiques sur la typographie adaptée à l’usage du web – &lt;a href="http://webtypography.net/Rhythm_and_Proportion/Horizontal_Motion/2.1.2/" title="Choose a comfortable measure" target="_blank"&gt;source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;sup style="height: 0;line-height: 1;vertical-align: baseline;position: relative;bottom:1ex;"&gt;†&lt;/sup&gt; Using OpenType font features with CSS 3: Part 1 – &lt;a href="http://blog.fontdeck.com/post/15777165734/opentype-1" target="_blank"&gt;source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/klOuOaMIhCM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2012/02/enlarge-your-police</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/11/mes-polices-web-preferees-sans-serif</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/9IkMMYtxkgk/mes-polices-web-preferees-sans-serif" />
    <title>Mes polices web préférées [sans-serif]</title>
    <published>2011-11-30T13:35:38+01:00</published>
    <updated>2011-11-30T13:35:38+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Après un &lt;a title="Mes polices web preferees serifs" href="http://phollow.fr/2011/10/mes-polices-web-preferees-serifs/"&gt;premier article&lt;/a&gt; sur les polices de types &lt;strong&gt;serif&lt;/strong&gt;, je continue sur ma lancée avec cette fois-ci les &lt;strong&gt;sans-serifs&lt;/strong&gt;. Ce type de police n’a pas d’empattements, &lt;em&gt;d’où leur nom&lt;/em&gt;. En français on les appellent aussi polices &lt;strong&gt;linéales&lt;/strong&gt;. Elles ont été longuement privilégiées pour le corps de texte sur les écrans, car à l’époque les écrans analogiques et la basse résolution ne rendaient pas l’affichage d‘une serif optimale. La nature simple des polices linéales fait qu’elles sont mieux lisibles sur ce type d’écran. De nos jours avec nos écrans LCD, l’antialiasing etc., ce n'est plus vrai je trouve.&lt;/p&gt;

&lt;p&gt;Aujourd’hui je vais donc vous montrer quelques polices sans empattements que je trouve plutôt cool. Donc si vous en avez un peu marre &lt;em&gt;d’Helvetica&lt;/em&gt; ou &lt;em&gt;d’Arial&lt;/em&gt;, n’hésitez pas à les tester. Ces fonts ont été trouvés, à l’image de l’article précédent, sur &lt;a title="Typekit" href="http://typekit.com"&gt;Typekit&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;LFT Etica Web &amp;amp; PT Sans&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;LFT Etica Web&lt;/strong&gt; est une police moins froide que ces consoeurs, presque de type humaniste. Elle se décline sous 16 graisses/styles différents et peut être utilisée pour du texte ou des &lt;em&gt;headings&lt;/em&gt;.&lt;/p&gt;
&lt;img style="margin-bottom: 20px;"  src="http://static.phollow.fr/2011/11/LFTEtica_0-640x285.gif" alt="" title="LFTEtica_0" width="640" height="285" class="alignnone size-medium wp-image-3788"&gt;
&lt;p&gt;&lt;strong&gt;PT Sans&lt;/strong&gt; est une font au look moderne et humaniste. Là encore, elle possède plusieurs familles et styles et peut donc s’adapter à l’usage. Par exemple la famille &lt;em&gt;caption&lt;/em&gt; sera utilisée pour les petits textes.&lt;/p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-29-à-13.27.532.jpg" alt="" title="Capture d’écran 2011-11-29 à 13.27.53" class="alignnone size-full wp-image-3793"&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a href="http://jonikorpi.com" target="_blank"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-29-à-13.06.37-640x463.jpg" alt="" title="Joni Korpi" width="640" height="463" class="alignnone size-medium wp-image-3782"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;Sur le site web de Joni Korpi, on peut voir l’utilisation de ces deux polices. Avec LFT Etica Web pour les titres et PT Sans pour le corps de texte.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Proxima Nova&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Proxima Nova&lt;/strong&gt; (2005) est une refonte complète de Sans Proxima (1994). Les six polices originales (trois poids avec italique) ont été élargies à 42 polices OpenType complet. Proxima Nova chevauche l'écart entre les fontes comme Futura et Akzidenz Grotesk. Le résultat est un hybride combinant des proportions humanistes avec un aspect un peu géométrique.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="http://sparrowmailapp.com/" title="Sparrow Mail" target="_blank"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-29-à-13.36.23-640x297.jpg" alt="" title="Proxima Nova" width="640" height="297" class="alignnone size-medium wp-image-3797"&gt;&lt;/a&gt;

&lt;a href="http://penguincreative.com/" target="_blank"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-30-à-00.42.44-640x380.jpg" alt="" title="Capture d’écran 2011-11-30 à 00.42.44" width="640" height="380" class="alignnone size-medium wp-image-3817"&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;h3&gt;FF Dagny Web Pro&lt;/h3&gt;
&lt;p&gt;En 2002, le journal suédois Dagens Nyheter (DN) a migré du format broadsheet vers un format tabloïde. Le changement au format tabloïde a rendu le cadre plus compact et Pangea a été mandaté pour produire un correspondant sans-serif pour le journal Suédois. Cela est devenu DN Grotesk, qui a maintenant évolué en &lt;strong&gt;FF Dagny&lt;/strong&gt;. Conçu par Örjan Nordling et Söderström Göran.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a href="http://www.thedesigncubicle.com/" title="The Design Cubicle"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-30-à-00.37.09-640x515.jpg" alt="" title="The Design Cubicle" width="640" height="515" class="alignnone size-medium wp-image-3815"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;h3&gt;Myriad Pro&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Myriad Pro&lt;/strong&gt;, un grand classique d‘Adobe est aussi disponible sur Typekit. 10 fonts au total (5 graisses différentes).&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a href="http://www.warbyparker.com/" title="Warby Parker" target="_blank"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-30-à-00.50.48-640x355.jpg" alt="" title="Warby Parker" width="640" height="355" class="alignnone size-medium wp-image-3820"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;Principalement utilisée sur ce site pour le corps de texte et quelques &lt;em&gt;headlines&lt;/em&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3&gt;Ratio&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ratio&lt;/strong&gt; est disponible en 6 graisses allant de minces à lourdes avec les italiques pour chaques. Que ce soit sur ​​papier ou sur écran, Ratio ajoute un niveau de sophistication et de polyvalence qui fait ressortir le meilleur dans n’importe quel design.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a href="http://cargocollective.com/pstype#39674/Ratio" title="Ratio" target="_blank"&gt;&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-30-à-01.00.40.jpg" alt="" title="Ratio" width="640" height="564" class="alignnone size-full wp-image-3822"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;Disponible aussi sur Typekit, avec la variante &lt;a href="http://cargocollective.com/pstype#197264/Ratio-Display-new" title="Ratio Display" target="_blank"&gt;Ratio Display&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Et voilà. Ce n’est qu’un petit échantillon des polices disponibles pour &lt;em&gt;font-face&lt;/em&gt;, à l’heure où j’écris ces lignes, je compte plus de 140 sans-serifs sur Typekit. Pour le prochain article, je prépare une collection de &lt;strong&gt;slab-serifs&lt;/strong&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/9IkMMYtxkgk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/11/mes-polices-web-preferees-sans-serif</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/11/7-frameworks-css-pour-developper-en-responsivec2a0webc2a0design</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/qpx3OzNPIHQ/7-frameworks-css-pour-developper-en-responsivec2a0webc2a0design" />
    <title>7 frameworks CSS pour développer en Responsive Web Design</title>
    <published>2011-11-21T13:51:19+01:00</published>
    <updated>2011-11-21T13:51:19+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;
Je commence une série d'article à propos d'outils permettant de faciliter le développement d’un site internet &lt;em&gt;responsive&lt;/em&gt;, s’adaptant dynamiquement à la taille de l’écran du média. Dans cet article, je vais parler uniquement de tout ce qui a un rapport avec le CSS. En particulier des &lt;strong&gt;grids&lt;/strong&gt; et des &lt;strong&gt;templates&lt;/strong&gt; CSS.
&lt;/p&gt;
&lt;h3&gt;320 and up&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-12.57.571-822x450.jpg" alt="" title="320-and-up" width="822" height="450" class="alignnone size-medium wp-image-3729"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;320 and up&lt;/strong&gt; est un template basé sur &lt;strong&gt;HTML5 Boilerplate&lt;/strong&gt; et la grid de &lt;strong&gt;Less Framework 4&lt;/strong&gt;. 
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://stuffandnonsense.co.uk/projects/320andup/" title="320 and up" target="_blank"&gt;320 and up&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;1140 CSS Grid&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.08.58-832x376.jpg" alt="" title="1140" width="832" height="376" class="alignnone size-medium wp-image-3739"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;1140 CSS Grid&lt;/strong&gt; se base sur la résolution d’un moniteur de 1280 de large, et se réduit de manière &lt;strong&gt;fluide&lt;/strong&gt; sur les plus petites résolutions.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://cssgrid.net/" title="1140 CSS Grid" target="_blank"&gt;1140 CSS Grid&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;Less Framework 4&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.15.03-832x399.jpg" alt="" title="Less Framework 4" width="832" height="399" class="alignnone size-medium wp-image-3742"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;Less Framework 4&lt;/strong&gt; permet de construire des sites web qui s’adaptent aux différents devices grâce à 4 templates et 3 pré-réglages typographiques.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://lessframework.com/" title="Less Framework 4" target="_blank"&gt;Less Framework 4&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;Mobile Boilerplate&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.21.14-832x442.jpg" alt="" title="Mobile Boilerplate" width="832" height="442" class="alignnone size-medium wp-image-3745"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;Mobile Boilerplate&lt;/strong&gt; est une collection de CSS, HTML et diverses bibliothèques Javascript permettant de bien démarrer un projet web mobile.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://html5boilerplate.com/mobile" title="Mobile Boilerplate" target="_blank"&gt;Mobile Boilerplate&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;Skeleton&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.24.19-750x450.jpg" alt="" title="Skeleton" width="750" height="450" class="alignnone size-medium wp-image-3747"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;Skeleton&lt;/strong&gt; contient une grille CSS et un style de base (typographie, formulaire, boutons…) pour commencer un projet.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://www.getskeleton.com/" title="Skeleton" target="_blank"&gt;Skeleton&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;Golden Grid System&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.28.08-832x344.jpg" alt="" title="Golden Grid System" width="832" height="344" class="alignnone size-medium wp-image-3750" /&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;Golden Grid System&lt;/strong&gt; : Pour moi une des grilles adaptatives les plus propres. L’avantage de celle-ci est qu’elle conserve plusieurs colonnes tout le temps, même au format mobile.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://goldengridsystem.com/" title="Golden Grid System" target="_blank"&gt;Golden Grid System&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;h3&gt;The Semantic Grid System&lt;/h3&gt;
&lt;figure&gt;
&lt;p&gt;
&lt;img src="http://static.phollow.fr/2011/11/Capture-d’écran-2011-11-21-à-13.36.24-832x386.jpg" alt="" title="The Semantic Grid System" width="832" height="386" class="alignnone size-medium wp-image-3754"&gt;
&lt;/p&gt;
&lt;figcaption&gt;
&lt;strong&gt;The Semantic Grid System&lt;/strong&gt; est intéressante dans le sens où c’est vous qui choisissez le nombres de colonnes, la taille des marges etc.
&lt;/figcaption&gt;
&lt;p&gt;&lt;a href="http://semantic.gs/" title="The Semantic Grid System" target="_blank"&gt;The Semantic Grid System&lt;/a&gt;&lt;/p&gt;
&lt;/figure&gt;
&lt;p&gt;Je vous conseille aussi de ne pas hésiter à modifier ces divers frameworks pour votre utilisation. Par exemple le thème de ce blog tourne sur une version modifiée de &lt;strong&gt;Skeleton&lt;/strong&gt; — &lt;em&gt;j’ai rendu la grille fluide&lt;/em&gt; – et les bibliothèques Javascript de &lt;strong&gt;320 and up&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En regardant le code de ces projets vous allez avoir une meilleure vision de ce qui se passe avec les &lt;strong&gt;media queries&lt;/strong&gt;. Et ainsi adapter leurs fonctionnements à votre propre projet.&lt;/p&gt;
&lt;p&gt;Si vous en connaissez d’autres, n’hésitez pas à en parler aux gens avec les commentaires.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/qpx3OzNPIHQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/11/7-frameworks-css-pour-developper-en-responsivec2a0webc2a0design</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/11/homebrew-un-gestionnaire-de-paquet-pour-mac-osx</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/ievOOnELgiQ/homebrew-un-gestionnaire-de-paquet-pour-mac-osx" />
    <title>Homebrew, un gestionnaire de paquet pour Mac OS/X</title>
    <published>2011-11-01T20:12:51+01:00</published>
    <updated>2011-11-01T20:12:51+01:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;img style="margin-top:0; margin-bottom: 20px;" src="http://static.phollow.fr/2011/11/formula.png" alt="" title="formula" width="700" height="300" class="alignnone size-full wp-image-3677"&gt;
&lt;p&gt;Quand on a pris la &lt;strong&gt;bonne&lt;/strong&gt; habitude de travailler sous un environnement Unix, il y a certains outils qui vous manquent &lt;em&gt;cruellement&lt;/em&gt; quand on se retrouve par exemple sur Mac OS/X. Ce système d’exploitation ne possède pas de gestionnaire de paquet comme &lt;span class="code"&gt;apt-get&lt;/span&gt; sous Debian ou &lt;span class="code"&gt;yum&lt;/span&gt; sous CentOS. Il existe heureusement des solutions, comme par exemple &lt;strong&gt;Macports&lt;/strong&gt;. J’en avais parlé &lt;a href="http://phollow.fr/2009/08/les-macports/" title="Macports"&gt;sur ce billet&lt;/a&gt; il y a quelques temps déjà.&lt;/p&gt;
&lt;p&gt;Aujourd’hui j’utilise un autre gestionnaire de paquet s'appelant &lt;strong&gt;Homebrew&lt;/strong&gt;. Il se veut plus simple que Macports et diffère un peu dans sa manière de faire. Pour faire simple Homebrew va toujours essayer d'utiliser les librairies déjà sur le système pour compiler nos paquets. Cette manière de procéder possède des avantages et des inconvénients. L'avantage c'est que pour compiler un paquet, on ne va pas devoir compiler X librairies avant. L'inconvénient c'est que nos exécutables risquent grandement de planter après une mise à jour de l’OS ; les librairies de Mac OS/X étant mises à jour.&lt;/p&gt;
&lt;p&gt;C'est donc un choix à faire. Et j’ai choisit Homebrew car je n'ai pas non plus 50 paquets à maintenir, une vingtaine tout au plus, et je ne mets pas mon système d’exploitation à jour tous les quatre matins.&lt;/p&gt;
&lt;h3&gt;Pré-requis&lt;/h3&gt;
&lt;p&gt;Il faut savoir que par défaut il n’y a pas les outils de compilation dans Mac OS/X. Alors on va devoir installer &lt;span class="code"&gt;gcc&lt;/span&gt; et ses potes, et ça se fait &lt;em&gt;simplement&lt;/em&gt; en installant &lt;a href="http://itunes.apple.com/us/app/xcode/id448457090" title="Xcode" target="_blank"&gt;Xcode&lt;/a&gt;. Pour certains paquets vous allez peut-être avoir besoin du « Java Developer Update ». On peut trouver ce qu’il faut sur &lt;a href="https://developer.apple.com/downloads/index.action" title="Mac - Java Developer Update" target="_blank"&gt;cette page&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;L'installation à proprement parler du gestionnaire de paquets peut maintenant commencer. Homebrew est écrit en &lt;strong&gt;Ruby&lt;/strong&gt; et son script d’installation aussi.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il va faire son &lt;em&gt;nid&lt;/em&gt; dans &lt;span class="code"&gt;/usr/local&lt;/span&gt;, ce qui nous permettra d’installer des paquets sans passer par &lt;strong&gt;sudo&lt;/strong&gt;. De plus cet endroit est assez indépendant du système, on pourra donc facilement tout enlever si besoin. Il est bien sûr toujours possible de mettre tout ça ailleurs si vous préférez.&lt;/p&gt;
&lt;h3&gt;Et ensuite on peut RTFM&lt;/h3&gt;
&lt;figure&gt;&lt;p&gt;&lt;img style="margin-top:0;" src="http://static.phollow.fr/2011/11/RTFM.jpg" alt="" title="RTFM" width="700" height="464" class="alignnone size-full wp-image-3704" /&gt;&lt;/p&gt;&lt;figcaption&gt;J'admets avoir la flemme de tout vous expliquer, mais franchement il suffit de lire.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Pour avoir la liste complète de ce qu’il est possible d’installer, on peut se rendre sur GitHub, sur &lt;a href="https://github.com/mxcl/homebrew/tree/master/Library/Formula/" title="Homebrew Formula List" target="_blank"&gt;cette page&lt;/a&gt;. À savoir que vous pouvez créer vos propres formules et la proposer à la communauté si vous voyez un manque. Homebrew m’a servi pour installer quelques paquets toujours pratiques comme &lt;span class="code"&gt;git&lt;/span&gt;, &lt;span class="code"&gt;ffmpeg&lt;/span&gt;, &lt;span class="code"&gt;x264&lt;/span&gt;, &lt;span class="code"&gt;mongodb&lt;/span&gt;, &lt;span class="code"&gt;redis&lt;/span&gt;, &lt;span class="code"&gt;htop&lt;/span&gt;, &lt;span class="code"&gt;wget&lt;/span&gt;…
&lt;p&gt;&lt;a href="http://mxcl.github.com/homebrew/" title="Homebrew" target="_blank"&gt;Site web de Homebrew&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/ievOOnELgiQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/11/homebrew-un-gestionnaire-de-paquet-pour-mac-osx</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/10/mes-polices-web-preferees-serifs</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/6Df6unpl6Os/mes-polices-web-preferees-serifs" />
    <title>Mes polices web préférées [serifs]</title>
    <published>2011-10-23T22:04:59+02:00</published>
    <updated>2011-10-23T22:04:59+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Le marché des &lt;em&gt;« web fonts »&lt;/em&gt; ne s'est jamais aussi bien porté. Et son avenir le semble tout autant. La quantité et la qualité des polices croissent tous les jours et avec l'aide des services comme &lt;a title="typekit" href="http://typekit.com" target="_blank"&gt;Adobe Typekit&lt;/a&gt; et &lt;a title="Google WebFonts" href="http://www.google.com/webfonts" target="_blank"&gt;Google WebFonts&lt;/a&gt;, l'intégration est simple.&lt;/p&gt;

&lt;p&gt;Le processus de création d'une police pour le format web est moins simple que l'on peut le penser au premier abord. Il ne suffit pas de prendre une simple .ttf et de la convertir au format &lt;span class="code"&gt;@font-face&lt;/span&gt;. La police doit être retravaillée complètement pour être lisible sur les différents OS/Navigateur. Un processus appelé en anglais &lt;em&gt;« hinting »&lt;/em&gt; et très bien expliqué &lt;a title="Type rendering" href="http://blog.typekit.com/2010/10/05/type-rendering-on-the-web/" target="_blank"&gt;ici&lt;/a&gt; et &lt;a title="Type rendering" href="http://blog.typekit.com/2010/10/15/type-rendering-operating-systems/" target="_blank"&gt;là&lt;/a&gt; par Typekit. Les grandes fonderies travaillent donc à convertir leurs grands classiques au format web, pour mon plus grand plaisir !
J'ai donc décidé dans cet article de vous présenter ma série de polices web préférées du moment, en me concentrant uniquement aujourd'hui sur la famille des &lt;strong&gt;serifs&lt;/strong&gt;. Vous l'aurez compris d'autres articles viendront plus tard dans le même style.&lt;/p&gt;

&lt;h3&gt;FF Meta Serif Web Pro&lt;/h3&gt;
&lt;p&gt;Cette police a été créee en partant de la version sans-serif de base (FF Meta). Elle a été développée en 3 ans par 3 designers Erik Spiekermann, Christian Schwartz &lt;em&gt;&amp;amp;&lt;/em&gt; Kris Sowersby.&lt;/p&gt;

&lt;figure&gt;&lt;a title="Trent Walton" href="http://trentwalton.com/info/" target="_blank"&gt;&lt;img class="alignnone size-full wp-image-3607" title="Trent Walton" src="http://static.phollow.fr/2011/10/Capture-d’écran-2011-10-23-à-19.34.42.jpg" alt="Trent Walton" width="700" height="339" /&gt;&lt;/a&gt;

&lt;figcaption&gt;&lt;strong&gt;Fig. 1:&lt;/strong&gt; Le blog personnel de Trent Walton utilise cette police à 100%. Elle rend bien à n'importe quelle taille que ça soit pour les paragraphes ou les headings grâce notamment à son « x-height » élevé.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h3&gt;Adobe Minion Pro&lt;/h3&gt;
&lt;p&gt;Une police Adobe désignée par Robert Slimbach dans les années 90. Elle a le style des polices utilisées dans les livres pendant la Renaissance. Minion est élégante et très lisible.&lt;/p&gt;

&lt;figure&gt;&lt;a href="http://robweychert.com/"&gt;&lt;img class="alignnone size-full wp-image-3616" title="http://robweychert.com/" src="http://static.phollow.fr/2011/10/Capture-d’écran-2011-10-23-à-20.00.43.jpg" alt="http://robweychert.com/" width="701" height="465" /&gt;&lt;/a&gt;

&lt;figcaption&gt;&lt;strong&gt;Fig. 2:&lt;/strong&gt; Le blog de Rob Weychert l'utilise dans ces paragraphes.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h3&gt;FF Tisa Web Pro&lt;/h3&gt;
&lt;p&gt;Dessinée par Mitja Miklavčič pour l'usage dans des magazines modernes. Un &lt;em&gt;« x-height »&lt;/em&gt; large et des serifs prononcés améliorent la lisibilité. Et je trouve vraiment la version italique jolie.&lt;/p&gt;

&lt;figure&gt;&lt;a href="http://simplebits.com/"&gt;&lt;img class="alignnone size-full wp-image-3621" title="Simplebits" src="http://static.phollow.fr/2011/10/Capture-d’écran-2011-10-23-à-20.23.03.jpg" alt="Simplebits" width="700" height="340" /&gt;&lt;/a&gt;

&lt;figcaption&gt;&lt;strong&gt;Fig. 3:&lt;/strong&gt; Dan Cederholm l'utilise dans les paragraphes de ces articles.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h3&gt;Skolar Web&lt;/h3&gt;
&lt;p&gt;Skolar, la police primée conçue par David Březina, est une serif qui a été désignée à l'origine pour des publications savantes et multilingues. La police maintient sa crédibilité tout en incorporant un style subtil personnel.&lt;/p&gt;

&lt;figure&gt;&lt;a href="http://elliotjaystocks.com/about/"&gt;&lt;img class="alignnone size-full wp-image-3626" title="http://elliotjaystocks.com/about/" src="http://static.phollow.fr/2011/10/Capture-d’écran-2011-10-23-à-20.39.34.jpg" alt="http://elliotjaystocks.com/about/" width="700" height="345" /&gt;&lt;/a&gt;

&lt;figcaption&gt;&lt;strong&gt;Fig. 4:&lt;/strong&gt; Elliot Jay Stocks utilise cette police à toutes les sauces. Dans les paragraphes ou les titres en majuscules avec un letter-spacing etc.&lt;/figcaption&gt; &lt;/figure&gt;
&lt;h3&gt;FF Scala Web&lt;/h3&gt;
&lt;blockquote style="margin-bottom:0"&gt;FF Scala is an old style, humanist, serif typeface designed by Dutch typeface designer Martin Majoor in 1990 for the Vredenburg Music Center in Utrecht, the Netherlands. The FF Scala font family was named for the Teatro alla Scala (1776–78) in Milan. Like many contemporary Dutch serif faces, FF Scala is not an academic revival of a single historic typeface but shows influences of several historic models. Similarities can be seen with William Addison Dwiggins' 1935 design Electra in its clarity of form, and rhythmic, highly calligraphic italics. Eric Gill's 1931 typeface Joanna (released by Monotype in 1937), with its old style armature but nearly square serifs is also similar in its nearly mono-weighted stroke width.&lt;/blockquote&gt;
&lt;cite style="color:#99968A;margin-bottom: 20px;display: block;"&gt;— Wikipedia, &lt;a title="FF Scala" href="http://en.wikipedia.org/wiki/FF_Scala" target="_blank"&gt;source&lt;/a&gt;&lt;/cite&gt;

&lt;p&gt;C'est la police que j'utilise dans les paragraphes de ce blog. J'aime beaucoup les détails calligraphiques. Il existe plusieurs familles dont une &lt;em&gt;condensée&lt;/em&gt; et une &lt;em&gt;« small-caps »&lt;/em&gt;. Et aussi une version sans-serif.
Toutes ces &lt;em&gt;fonts&lt;/em&gt; sont disponibles sur &lt;a title="Typekit" href="http://typekit.com" target="_blank"&gt;Typekit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;C'est d'ailleurs ce service que j'utilise, parce que c'est là où toutes les polices professionnelles se trouvent. J'ai testé un peu Google WebFonts et à vrai dire je n'en trouve pas beaucoup de bonne qualité. À part peut-être la famille de fonts Droid ou Lobster la nouvelle Comic Sans de nos chers &lt;em&gt;designerfags&lt;/em&gt; en herbe — &lt;em&gt;Mais c'est cool ça fait retro !&lt;/em&gt; — Bref je m'égare, je garde ma haine pour la mauvaise utilisation de Lobster dans un article à part.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/6Df6unpl6Os" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/10/mes-polices-web-preferees-serifs</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/10/les-cesures-dans-le-web</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/tdgDvM0Hfnk/les-cesures-dans-le-web" />
    <title>Les césures dans le web</title>
    <published>2011-10-10T23:59:14+02:00</published>
    <updated>2011-10-10T23:59:14+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;En typographie, la &lt;strong&gt;césure&lt;/strong&gt; est l'art de couper un mot de telle manière à ce qu'il entre dans la justification. Cette pratique est utilisée dans les livres et depuis peu de temps possible aussi sur le web.&lt;/p&gt;
&lt;p&gt;On a inventé ce système pour pouvoir mettre plus de mots sur une page donc économiser du papier à l'imprimerie et améliorer la justification. Même si on n'utilise pas de papier sur le web, on peut toujours gagner de la place et améliorer l'aspect général de la typographie.&lt;/p&gt;
&lt;p&gt;Parfois les textes justifiés sont vraiment horribles sur les pages web, avec des &lt;em&gt;rivières&lt;/em&gt; monstrueuses. Les &lt;strong&gt;césures&lt;/strong&gt; améliorent nettement ça, donc passons maintenant au code.&lt;/p&gt;
&lt;figure&gt;&lt;img src="http://static.phollow.fr/2011/10/books-900x600.jpg" alt="" title="books" width="900" height="600" class="alignnone size-large wp-image-3563" /&gt;&lt;/figure&gt;
&lt;h3&gt;Nouvelle méthode CSS3&lt;/h3&gt;
&lt;pre&gt;
&lt;code&gt;
p {
    hyphens: auto;
    -webkit-hyphens: auto;
    -moz-hyphens: auto;
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;À l'heure où j'écris ces lignes, les navigateurs supportant ces propriétés sont &lt;strong&gt;Firefox&lt;/strong&gt; 6+ et &lt;strong&gt;Safari&lt;/strong&gt; 5.1+. Pour les désactiver il suffit de passer &lt;span class="code"&gt;auto&lt;/span&gt; en &lt;span class="code"&gt;manual&lt;/span&gt;. En mode manuel, les &lt;span class="code"&gt;&amp;amp;shy;&lt;/span&gt; sont néanmoins toujours respectés.&lt;/p&gt;
&lt;p&gt;Les césures ont des règles strictes d'utilisation, règles changeant suivant la langue. Le navigateur doit savoir dans quelle langue vous écrivez, donc vous devez la renseigner. Un &lt;span class="code"&gt;lang="fr"&lt;/span&gt; dans la balise &lt;span class="code"&gt;&amp;lt;html&amp;gt;&lt;/span&gt; suffit par exemple.&lt;/p&gt;
&lt;h3&gt;Hyphenator&lt;/h3&gt;
&lt;p&gt;Cette bibliothèque javascript permet d'activer les césures sur tous les navigateurs supportant le « &lt;em&gt;trait d'union conditionnel&lt;/em&gt; ». Ce caractère &lt;span class="code"&gt;&amp;amp;shy;&lt;/span&gt; est invisible quand on le place mais il sert à déterminer l'endroit où une césure peut avoir lieu.&lt;/p&gt;
&lt;p&gt;L'avantage de ce script est qu'il privilégie l'utilisation de la méthode CSS3 sur les navigateurs la supportant.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/hyphenator/" title="hyphenator.js" target="_blank"&gt;http://code.google.com/p/hyphenator/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;p&gt;Les paragraphes de mon blog devraient maintenant tous fonctionner avec ce système de césures — &lt;em&gt;depuis la mise à jour du thème en fait&lt;/em&gt; — et donc vous devriez les voir sur cet article (et les autres) — à condition d'avoir un navigateur assez récent, mais je ne me fais pas de soucis pour vous.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/tdgDvM0Hfnk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/10/les-cesures-dans-le-web</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/10/css-multi-columns</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/m9_tSle5BtE/css-multi-columns" />
    <title>CSS Multi-Columns</title>
    <published>2011-10-07T00:28:43+02:00</published>
    <updated>2011-10-07T00:28:43+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;img style="margin-top:0;" class="alignnone size-full wp-image-3503" title="css" src="http://static.phollow.fr/2011/10/css.png" alt="" width="832" height="300" /&gt;
&lt;h3&gt;Qu'est-ce que c'est ?&lt;/h3&gt;
&lt;p&gt;Le module CSS &lt;em&gt;multi-colums&lt;/em&gt; permet de diviser un long flux de texte en plusieurs colonnes de manière automatique. Et donc nous n'avons pas besoin, par exemple, pour 3 colonnes de créer 3 conteneurs. Cette technique est beaucoup utilisée dans les journaux ou les magazines mais encore très peu sur le web.&lt;/p&gt;

&lt;p&gt;Ainsi de larges blocs de texte peuvent être divisés facilement en sous-colonnes pour offrir une meilleure lecture et améliorer l'esthétisme d'un site. C'est un avantage aussi d'un point de vue sémantique, car on se passe de balises supplémentaires nécessaires pour avoir le même rendu sans CSS3.&lt;/p&gt;

&lt;p&gt;D'un autre côté la lisibilité d'un site peut être complètement ruinée avec une mauvaise utilisation de ce module. Un site web n'étant pas forcément statique comme le serait la page d'un magazine. Par exemple l'utilisateur ne doit pas avoir à scroller quand il lit la fin de la colonne et passe à la suivante.&lt;/p&gt;

&lt;h3&gt;Compatibilité des navigateurs&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;Opera 11.10+, Opera Mobile 11.10+&lt;/li&gt;
	&lt;li&gt;IE 10+&lt;/li&gt;
	&lt;li&gt;Firefox 3.6+&lt;/li&gt;
	&lt;li&gt;Safari 3.2+&lt;/li&gt;
	&lt;li&gt;Chrome 10+&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Utilisation&lt;/h3&gt;

&lt;p&gt;Il y a deux façons de créer des colonnes, on peut d'une part spécifier un nombre fixe de colonnes à l'aide de la propriété &lt;span class="code"&gt;column-count&lt;/span&gt; ou alors spécifier la largeur des colonnes à l'aide de &lt;span class="code"&gt;column-width&lt;/span&gt; (pixels ou ems, mais pas de pourcentage…). Les deux propriétés peuvent être cumulées, mais le navigateur choisira l'une ou l'autre suivant les cas. Il existe bien sur d'autre propriétés :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class="code"&gt;column-gap&lt;/span&gt; pour gérer l'espacement entres les colonnes&lt;/li&gt;
	&lt;li&gt;&lt;span class="code"&gt;column-rule&lt;/span&gt;, &lt;span class="code"&gt;column-rule-width&lt;/span&gt;, &lt;span class="code"&gt;column-rule-style&lt;/span&gt;, &lt;span class="code"&gt;column-rule-color&lt;/span&gt; pour gérer l'apparence de la séparation des colonnes&lt;/li&gt;
	&lt;li&gt;&lt;span class="code"&gt;break-before&lt;/span&gt;, &lt;span class="code"&gt;break-after&lt;/span&gt;, &lt;span class="code"&gt;break-inside&lt;/span&gt; permet par exemple de forcer le passage d'un élément sur la colonne suivante. Plus d'infos sur le site du &lt;a title="w3c" href="http://www.w3.org/TR/css3-multicol/#column-breaks" target="_blank"&gt;w3c&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Exemples&lt;/h3&gt;
&lt;h4&gt;Séparation en deux colonnes&lt;/h4&gt;

&lt;div style="font-size: 80%; column-count: 2; column-gap: 20px; -moz-column-count: 2; -moz-column-gap: 20px; -o-column-count: 2; -o-column-gap: 20px; -webkit-column-count: 2; -webkit-column-gap: 20px; text-align: justify;"&gt;

&lt;p&gt;Now that we know who you are, I know who I am. I'm not a mistake! It all makes sense! In a comic, you know how you can tell who the arch-villain's going to be? He's the exact opposite of the hero. And most times they're friends, like you and me! I should've known way back when... You know why, David? Because of the kids. They called me Mr Glass.&lt;/p&gt;

&lt;p&gt;Do you see any Teletubbies in here? Do you see a slender plastic tag clipped to my shirt with my name printed on it? Do you see a little Asian child with a blank expression on his face sitting outside on a mechanical helicopter that shakes when you put quarters in it? No? Well, that's what you see at a toy store. And you must think you're in a toy store, because you're here shopping for an infant named Jeb.&lt;/p&gt;

&lt;p&gt;Now that there is the Tec-9, a crappy spray gun from South Miami. This gun is advertised as the most popular gun in American crime. Do you believe that shit? It actually says that in the little book that comes with it: the most popular gun in American crime. Like they're actually proud of that shit.&lt;/p&gt;

&lt;p&gt;Now that we know who you are, I know who I am. I'm not a mistake! It all makes sense! In a comic, you know how you can tell who the arch-villain's going to be? He's the exact opposite of the hero. And most times they're friends, like you and me! I should've known way back when... You know why, David? Because of the kids. They called me Mr Glass.&lt;/p&gt;

&lt;p&gt;Look, just because I don't be givin' no man a foot massage don't make it right for Marsellus to throw Antwone into a glass motherfuckin' house, fuckin' up the way the nigger talks. Motherfucker do that shit to me, he better paralyze my ass, 'cause I'll kill the motherfucker, know what I'm sayin'?&lt;/p&gt;

&lt;p&gt;Well, the way they make shows is, they make one show. That show's called a pilot. Then they show that show to the people who make shows, and on the strength of that one show they decide if they're going to make more shows. Some pilots get picked and become television programs. Some don't, become nothing. She starred in one of the ones that became nothing.&lt;/p&gt;

&lt;/div&gt;
&lt;h4&gt;Code&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nc"&gt;.twocol&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Séparation en trois colonnes + style&lt;/h4&gt;
&lt;div style="font-size: 75%; column-count: 3; column-gap: 10px; column-rule-color: #ccc; column-rule-style: dotted; column-rule-width: 2px; -moz-column-count: 3; -moz-column-gap: 10px; -moz-column-rule-color: #ccc; -moz-column-rule-style: dotted; -moz-column-rule-width: 2px; -o-column-count: 3; -o-column-gap: 10px; -o-column-rule-color: #ccc; -o-column-rule-style: dotted; -o-column-rule-width: 2px; -webkit-column-count: 3; -webkit-column-gap: 10px; -webkit-column-rule-color: #ccc; -webkit-column-rule-style: dotted; -webkit-column-rule-width: 2px; text-align: justify;"&gt;

&lt;p&gt;The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who would attempt to poison and destroy My brothers. And you will know My name is the Lord when I lay My vengeance upon thee.&lt;/p&gt;

&lt;p&gt;Look, just because I don't be givin' no man a foot massage don't make it right for Marsellus to throw Antwone into a glass motherfuckin' house, fuckin' up the way the nigger talks. Motherfucker do that shit to me, he better paralyze my ass, 'cause I'll kill the motherfucker, know what I'm sayin'?&lt;/p&gt;

&lt;p&gt;Your bones don't break, mine do. That's clear. Your cells react to bacteria and viruses differently than mine. You don't get sick, I do. That's also clear. But for some reason, you and I react the exact same way to water. We swallow it too fast, we choke. We get some in our lungs, we drown. However unreal it may seem, we are connected, you and I. We're on the same curve, just on opposite ends.&lt;/p&gt;

&lt;p&gt;Now that we know who you are, I know who I am. I'm not a mistake! It all makes sense! In a comic, you know how you can tell who the arch-villain's going to be? He's the exact opposite of the hero. And most times they're friends, like you and me! I should've known way back when... You know why, David? Because of the kids. They called me Mr Glass.&lt;/p&gt;

&lt;p&gt;Well, the way they make shows is, they make one show. That show's called a pilot. Then they show that show to the people who make shows, and on the strength of that one show they decide if they're going to make more shows. Some pilots get picked and become television programs. Some don't, become nothing. She starred in one of the ones that became nothing.&lt;/p&gt;

&lt;p&gt;Normally, both your asses would be dead as fucking fried chicken, but you happen to pull this shit while I'm in a transitional period so I don't wanna kill you, I wanna help you. But I can't give you this case, it don't belong to me. Besides, I've already been through too much shit this morning over this case to hand it over to your dumb ass.&lt;/p&gt;

&lt;/div&gt;
&amp;nbsp;
&lt;h4&gt;Code&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="css"&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nc"&gt;.threecol&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
	&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;moz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;dotted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
	&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;webkit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;La propriété CSS &lt;em&gt;multi-columns&lt;/em&gt; se dégrade assez naturellement sur les navigateurs qui ne supporte pas encore la spécification. On voit simplement qu'une seule colonne. Pouvoir gérer ce genre de layout sans avoir recours à des scripts quelconque est vraiment pratique. À l'heure où les designers donnent de plus en plus d'importance à la lisibilité du contenu, je pense qu'on en verra un peu plus d'ici quelques temps.&lt;/p&gt;

&lt;p&gt;P.S. : Vous avez reconnu les citations des exemples ?&lt;/p&gt;

&lt;p&gt;Réf. : &lt;a href="http://www.w3.org/TR/css3-multicol/" target="_blank"&gt;Spécifications&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/m9_tSle5BtE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/10/css-multi-columns</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/08/un-exercice-sur-le-responsive-web-design</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/DKoE-_JrRDw/un-exercice-sur-le-responsive-web-design" />
    <title>Un exercice sur le Responsive Web Design</title>
    <published>2011-08-28T18:44:28+02:00</published>
    <updated>2011-08-28T18:44:28+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p&gt;Mon blog est maintenant &lt;em&gt;responsive&lt;/em&gt;. Terme que l'on peut traduire à l'arrache par &lt;em&gt;qui répond bien&lt;/em&gt;. Le thème et le contenu va automatiquement s'adapter à la taille de l'écran. Le concept est intéressant et plus pratique que de faire un thème normal + un thème mobile par exemple. À l'heure actuelle les sites internets ne sont plus seulement affichés sur un ordinateur mais de plus en plus souvent sur des appareils de type mobile, smartphones ou tablettes.&lt;/p&gt;

&lt;h3&gt;S'adapter&lt;/h3&gt;

&lt;p&gt;Au début on avait pas énormément d'appareils &lt;em&gt;exotiques&lt;/em&gt; en dehors du desktop. On voyait souvent un sous-domaine dédié à l'affichage d'un site sous iPhone, avec un thème propre. D'un point de vue conception on était tranquille, le thème mobile était indépendant du thème principal, et on connaissait les contraintes de l'iPhone. Mais maintenant on a beaucoup plus de smartphones et même des tablettes, chaque appareil possédant sa propre résolution. Et là on se rend compte que faire un thème dédié pour chacun de ces appareils est une idée complètement idiote. Donc le site web doit &lt;strong&gt;s'adapter&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Bonjour media query&lt;/h3&gt;

&lt;p&gt;Vous les avez déjà utilisées. Mais si, &lt;span class="code"&gt;media="print"&lt;/span&gt; pour avoir un CSS dédié à l'impression par exemple. C'est pas nouveau, ça date de la norme CSS 2.1. Ce qui est nouveau se sont les ajouts de la norme CSS3. Des ajouts nous permettant de tester la résolution de l'écran, le type de &lt;em&gt;device&lt;/em&gt; etc.&lt;/p&gt;

&lt;span class="code"&gt;&amp;lt;link rel="stylesheet" type="text/css" media="screen and (max-device-width: 480px)" href="mobile.css"/&amp;gt;&lt;/span&gt;

&lt;p&gt;Si l'appareil à une résolution inférieure ou égale à 480px en largeur, le fichier mobile.css sera lu. L'attribut &lt;span class="code"&gt;@media&lt;/span&gt; du CSS permet de faire la même chose sans avoir à le faire dans la balise &lt;span class="code"&gt;&amp;lt;link&amp;gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Par exemple sur ce site quand la résolution devient petite, j'enlève la sidebar sur la gauche pour la placer en dessous du contenu. C'est ce que permettent de faire les &lt;strong&gt;media queries&lt;/strong&gt;. On peut imaginer faire disparaître certains éléments qui n'auraient par leur place sur un petit écran, avec un &lt;span class="code"&gt;display:none;&lt;/span&gt; par exemple.&lt;/p&gt;

&lt;p&gt;Les media queries de ce type ne fonctionnent que sur les navigateurs récents et sur la plupart des navigateurs mobiles (webkit, opera). Il y a donc un script js que j'utilise pour certains navigateurs (&lt;em&gt;Oh hai, Internet Explorer&lt;/em&gt;). Vous pouvez le trouver sur &lt;a title="respond.js" href="https://github.com/scottjehl/respond" target="_blank"&gt;cette page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Responsive Grid&lt;/h3&gt;

&lt;p&gt;Pour me faciliter le travail j'ai utilisé une Grid CSS réactive. Construite sur les media queries, les différents blocs peuvent se ré-agencer suivant la taille de l'écran. Voici une liste non-exhaustive&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a title="Less Framework 4" href="http://lessframework.com/" target="_blank"&gt;Less Framework 4&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a title="Less+ Framework" href="http://www.angrycreative.se/projekt/less-framework/" target="_blank"&gt;Less+ Framework&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a title="Skeleton" href="http://www.getskeleton.com/" target="_blank"&gt;Skeleton&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a title="320 and up" href="http://stuffandnonsense.co.uk/projects/320andup/" target="_blank"&gt;320 and up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;FitText&lt;/h3&gt;

&lt;div&gt;&lt;img class="alignnone size-medium wp-image-3487" title="Capture d’écran 2011-09-06 à 11.23.57" src="http://static.phollow.fr/2011/08/Capture-d’écran-2011-09-06-à-11.23.57-832x415.jpg" alt="" width="832" height="415" /&gt;&lt;/div&gt;
&amp;nbsp;

&lt;p&gt;&lt;a title="FitText.js" href="http://fittextjs.com/" target="_blank"&gt;FitText.js&lt;/a&gt; est un plugin jQuery permettant de rendre les tailles de polices flexibles. Je l'utilise pour certains headers. Ce plugin va les redimensionner par rapport à la taille du conteneur. Pratique.&lt;/p&gt;

&lt;h3&gt;Thème Phollow&lt;/h3&gt;

&lt;p&gt;Je met en ligne la source du thème Wordpress actuel sur Github pour les personnes intéressées. Vous pouvez le trouver sur &lt;a title="Phollow Wordpress Theme" href="https://github.com/Rydgel/Phollow3-Theme" target="_blank"&gt;cette adresse&lt;/a&gt;. Les forks sont fortement encouragés.&lt;p&gt;

&lt;p&gt;Pour moi il est maintenant obligatoire de travailler sur des sites qui fonctionnent sur &lt;em&gt;n'importe quelles&lt;/em&gt; resolutions que sur des sites qui fonctionnent sur les résolutions des appareils actuels.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/DKoE-_JrRDw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/08/un-exercice-sur-le-responsive-web-design</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/08/wallpapers-of-the-week-19</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/oGtYebm4tnQ/wallpapers-of-the-week-19" />
    <title>Wallpapers of the Week</title>
    <published>2011-08-08T12:04:10+02:00</published>
    <updated>2011-08-08T12:04:10+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p style="text-align: justify;"&gt;Wallpapers of the Week : 8 août 2011.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span id="title_div5055987677" class="upper" style="text-align: justify;"&gt;&lt;a href="http://www.flickr.com/photos/22890143@N04/5055987677/in/photostream/" target="_blank"&gt;NY state of mind vs LA state of mind&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;img class="mainimage alignnone size-large wp-image-3415" title="5055987677_6e9166ddc1_b" src="http://static.phollow.fr/2011/08/5055987677_6e9166ddc1_b-804x554.jpg" alt="" width="804" height="554" /&gt;&lt;/p&gt;
&lt;!--more--&gt;
&lt;span class="upper"&gt;&lt;a href="http://liqui.deviantart.com/art/green-ish-244638331"&gt;green...ish?&lt;/a&gt; &lt;small&gt;by ~&lt;a href="http://liqui.deviantart.com/"&gt;liqui&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;
&lt;img class="alignnone size-medium wp-image-3416" title="green___ish__by_liqui-d41ng57" src="http://static.phollow.fr/2011/08/green___ish__by_liqui-d41ng57-537x335.jpg" alt="" width="537" height="335" /&gt;

&lt;span class="upper"&gt;&lt;a href="http://zim2687.deviantart.com/art/Grape-Leaves-214266009"&gt;Grape Leaves&lt;/a&gt; &lt;small&gt;by ~&lt;a href="http://zim2687.deviantart.com/"&gt;Zim2687&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;

&lt;img class="alignnone size-medium wp-image-3420" title="2560x1440 Grape Leaves by Zim2687" src="http://static.phollow.fr/2011/08/2560x1440-Grape-Leaves-by-Zim2687-537x302.jpg" alt="" width="537" height="302" /&gt;

&lt;span class="upper"&gt;&lt;a href="http://irvinggfm.deviantart.com/art/Icewind-Dale-215409803"&gt;Icewind Dale&lt;/a&gt; &lt;small&gt;by *&lt;a href="http://irvinggfm.deviantart.com/"&gt;IrvingGFM&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;

&lt;img class="alignnone size-medium wp-image-3422" title="Icewind Dale 1440 x 900" src="http://static.phollow.fr/2011/08/Icewind-Dale-1440-x-900-537x335.jpg" alt="" width="537" height="335" /&gt;

&lt;span class="upper"&gt;&lt;a href="http://katz93.deviantart.com/art/Suong-Dem-212784766"&gt;Suong Dem&lt;/a&gt; &lt;small&gt;by =&lt;a href="http://katz93.deviantart.com/"&gt;kAtz93&lt;/a&gt;&lt;/small&gt;&lt;/span&gt;

&lt;a href="http://www.flickr.com/photos/22890143@N04/5055987677/in/photostream/" target="_blank"&gt;&lt;img title="Suong Dem" src="http://static.phollow.fr/2011/08/Suong-Dem-537x339.png" alt="" width="537" height="339" /&gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/oGtYebm4tnQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/08/wallpapers-of-the-week-19</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/08/mockups-des-futures-versions-de-firefox-7-8-e28094-mac-windows</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/xvF32pUn3RU/mockups-des-futures-versions-de-firefox-7-8-e28094-mac-windows" />
    <title>Mockups des futures versions de Firefox 7 &amp; 8 — Mac, Windows</title>
    <published>2011-08-04T21:15:20+02:00</published>
    <updated>2011-08-04T21:15:20+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p style="text-align: justify;"&gt;La team des designers Firefox ne cesse de rechercher à améliorer l'ergonomie du navigateur. Et aujourd'hui ils nous proposent des mockups de ce que pourrait ressembler les futures versions de Firefox 7 ou 8. Firefox 4 avait déjà vu son interface grandement changée, l'histoire risque encore de se répéter — &lt;em&gt;et c'est tant mieux !&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;!--more--&gt;Ces mockups ne seront pas forcément une image exacte des versions finales. Ils ont été réalisés avant tout dans une optique de recherche et de discussions. On peut voir sur ces premiers écrans la disparition de la barre de recherche, &lt;em&gt;que j'avais déjà enlevé personnellement la trouvant inutile&lt;/em&gt;, un nouveau style de menu et un mode plein-écran qui a l'air plutôt sympathique.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/01-Firefox-Australis-Mac.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3394" title="Firefox 7 - 1" src="http://static.phollow.fr/2011/08/01-Firefox-Australis-Mac-804x536.jpg" alt="Firefox 7 - 1" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/02-Firefox-Australis-Mac-FxMenu.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3395" title="Firefox 7 - 2" src="http://static.phollow.fr/2011/08/02-Firefox-Australis-Mac-FxMenu-804x536.jpg" alt="Firefox 7 - 2" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/03-Firefox-Australis-Mac-AddOns.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3396" title="Firefox 7 - 3" src="http://static.phollow.fr/2011/08/03-Firefox-Australis-Mac-AddOns-804x536.jpg" alt="Firefox 7 - 3" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/06-Firefox-Australis-Mac-Persona.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3397" title="Firefox 7 - 4" src="http://static.phollow.fr/2011/08/06-Firefox-Australis-Mac-Persona-804x536.jpg" alt="Firefox 7 - 4" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/01-Firefox-Australis-Mac-Fullscreen.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3398" title="Firefox 7 - 5" src="http://static.phollow.fr/2011/08/01-Firefox-Australis-Mac-Fullscreen-804x536.jpg" alt="Firefox 7 - 5" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/01-Firefox-Australis-Windows.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3400" title="Firefox 7 - 6" src="http://static.phollow.fr/2011/08/01-Firefox-Australis-Windows-804x536.jpg" alt="Firefox 7 - 6" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;a href="http://static.phollow.fr/2011/08/01-Firefox-Australis-Windows-Fullscreen.jpg"&gt;&lt;img class="mainimage alignnone size-large wp-image-3401" title="Firefox 7 - 7" src="http://static.phollow.fr/2011/08/01-Firefox-Australis-Windows-Fullscreen-804x536.jpg" alt="Firefox 7 - 7" width="804" height="536" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Comme d'habitude ces expérimentations sont ouvertes et disponibles pour ceux qui veulent les tester. Mozilla a crée un nouveau build appelé Australis et téléchargeable à &lt;a title="Firefox 8 - Australis - UX" href="https://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-ux/" target="_blank"&gt;cette adresse&lt;/a&gt;. Ce build est une nightly, donc tous les jours une update pourra être téléchargée. La team UX Firefox déclare que c'est sur cette version que seront déposé leurs différents tests.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Maintenant je vais faire mon community manager en vous demandant ce que vous pensez de ces premiers concepts ? Pour ma part ça me plaît beaucoup même si on voit encore que Chrome a pas mal inspiré nos designers.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Via &lt;a title="Mozilla" href="http://people.mozilla.com/~shorlander/ux-presentation/ux-presentation.html" target="_blank"&gt;Mozilla&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/xvF32pUn3RU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/08/mockups-des-futures-versions-de-firefox-7-8-e28094-mac-windows</feedburner:origLink></entry>
  
  <entry>
    <id>http://phollow.fr/2011/07/dotshare-it-partage-de-dotfiles</id>
    <link type="text/html" rel="alternate" href="http://feedproxy.google.com/~r/phollow/iuEO/~3/aTTasqvySGQ/dotshare-it-partage-de-dotfiles" />
    <title>Dotshare.it, partage de .dotfiles</title>
    <published>2011-07-27T12:45:31+02:00</published>
    <updated>2011-07-27T12:45:31+02:00</updated>
    <author>
      <name>Jérôme Mahuet</name>
      <uri>http://phollow.fr/</uri>
    </author>
    <content type="html">&lt;p style="text-align: justify;"&gt;Je joue beaucoup avec les dotfiles – ces petits fichiers cachés qui servent généralement à configurer un programme. Si vous aimez justement personnaliser votre système, vous en avez sans doute ouverts déjà pas mal. C'est là ou rentre en jeu &lt;a title="Dotshare.it" href="http://dotshare.it/" target="_blank"&gt;Dotshare.it&lt;/a&gt;, un site web que l'on ma présenté il y a quelques temps.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Généralement il y a toujours un thread &lt;em&gt;Post your screenshot and configs&lt;/em&gt; sur les différents forum des distributions *nix. La config était généralement collée à l'arrache en dessous. Pas pratique pour les retrouver plus tard. Certains utilisent Github, ce qui me semble déjà une bonne évolution mais encore à un niveau en dessous de Dotshare, &lt;em&gt;qui lui est fait seulement pour ça&lt;/em&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;!--more--&gt;Dotshare.it veut donc faciliter le partage et la recherche de fichiers dotfiles. Ils sont triés par applications, avec une capture du résultat. On peut aller chercher tous les fichiers d'un utilisateur en particulier sur sa page profil, suivre cette personne pour être alerté des updates etc.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;img class="alignnone size-medium wp-image-3376" title="Capture d’écran 2011-07-27 à 13.24.27" src="http://static.phollow.fr/2011/07/Capture-d’écran-2011-07-27-à-13.24.27-537x376.jpg" alt="" width="537" height="376" /&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Le look du site web est minimaliste et c'est une bonne chose. Ça ne devrait pas trop piquer les yeux des adeptes des CLI tools. L'information est bien présentée et l'essentiel est là. Il y a même des petites références au monde de la ligne de commande, comme &lt;em&gt;scrot&lt;/em&gt; pour voir la capture du logiciel.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;img class="mainimage alignnone size-large wp-image-3378" title="Capture d’écran 2011-07-27 à 13.33.06" src="http://static.phollow.fr/2011/07/Capture-d’écran-2011-07-27-à-13.33.06-804x365.jpg" alt="" width="804" height="365" /&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;img class="mainimage alignnone size-large wp-image-3379" title="Capture d’écran 2011-07-27 à 13.38.51" src="http://static.phollow.fr/2011/07/Capture-d’écran-2011-07-27-à-13.38.51-804x302.jpg" alt="" width="804" height="302" /&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;On a donc tout pour avoir un joli petit réseau social pour le partage des fichier de conf. Unix. Reste à voir si les gens vont suivre. Si vous avez des recommendations ou des demandes à faire aux devs vous pouvez toujours allez faire un tour sur &lt;em&gt;#dotshare at freenode.&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Via &lt;a title="Dotshare.it" href="http://dotshare.it/" target="_blank"&gt;dotshare&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/phollow/iuEO/~4/aTTasqvySGQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://phollow.fr/2011/07/dotshare-it-partage-de-dotfiles</feedburner:origLink></entry>
  
 
</feed>
