<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LeMondeDuDev</title>
	<atom:link href="http://www.lemondedudev.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lemondedudev.com</link>
	<description>tribulations d&#039;un architecte logiciel</description>
	<lastBuildDate>Thu, 07 Mar 2013 14:25:37 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>If you&#8217;re to nail CSS, Less is more &#8211; part 3 : mixins, client and server side</title>
		<link>http://www.lemondedudev.com/2013/03/07/if-youre-to-nail-css-less-is-more-part-3-mixins-client-and-server-side/</link>
		<comments>http://www.lemondedudev.com/2013/03/07/if-youre-to-nail-css-less-is-more-part-3-mixins-client-and-server-side/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 14:25:37 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[Conception / Modélisation]]></category>
		<category><![CDATA[Ergonomie]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Modèle de données]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[client-side]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[feignasse]]></category>
		<category><![CDATA[fluid]]></category>
		<category><![CDATA[fusion]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[génération]]></category>
		<category><![CDATA[générer]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[less is more]]></category>
		<category><![CDATA[live long and prosper]]></category>
		<category><![CDATA[meryl]]></category>
		<category><![CDATA[meryl streep]]></category>
		<category><![CDATA[mixins]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[nerd]]></category>
		<category><![CDATA[nest]]></category>
		<category><![CDATA[nested]]></category>
		<category><![CDATA[nested rule]]></category>
		<category><![CDATA[nested rules]]></category>
		<category><![CDATA[nesting]]></category>
		<category><![CDATA[nesting variables]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server-side]]></category>
		<category><![CDATA[streep]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=519</guid>
		<description><![CDATA[So, we&#8217;re here. We now know how to create a neat Less file that will generate the CSS file we want, we know how to use variables, how to nest styling rules and how to set up the watch mode on our browser. We still have a couple of things to see before we start [...]]]></description>
				<content:encoded><![CDATA[<p>So, we&rsquo;re here. We now know how to create a neat Less file that will generate the CSS file we want, we know how to use variables, how to nest styling rules and how to set up the watch mode on our browser. We still have a couple of things to see before we start talking about the console and the Less compilation : we need to talk about mixins, client-side and server-side.<span id="more-519"></span></p>
<h3>Mixins</h3>
<p>This feature is awesome. Imagine if you could define styling rules not just as such, but as functions, with parameters. Less makes it possible.</p>
<p>For example, you might want to use rounded-cornered boxes here and there on your page, but with various corner-radius and different background-colors.  There&rsquo;s an easy way to do that with less (and before you start screaming the hell out of me, the classnames i&rsquo;ll be using in that example are just for the sake of the example, you should know i&rsquo;m not that dumb) :</p>
<pre class="brush: css; gutter: true">.rounded-box (@radius: 5px, @bgcolor: #000) {
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
  -ms-border-radius: @radius;
  -o-border-radius: @radius;
  border-radius: @radius;
  background-color: @bgcolor;
}

.red_small_box {
  width: 200px;
  height: 200px;
  .rounded-box (4px, #c00);
}

.blue_huge_box {
  width: 800px;
  height: 800px;
  .rounded-box (16px, #99f);
}</pre>
<p>don&rsquo;t you like it when it&rsquo;s just that easy ?</p>
<h3>Server and client side</h3>
<p>I know what you&rsquo;re going to say : Less is CSS managed by Javascript, so it&rsquo;s client managed. And, strangely, you are not that wrong. But let&rsquo;s see what&rsquo;s available for you.</p>
<h4>Client side</h4>
<p>Well, we&rsquo;ve been doing that all along, so the basics are already known : if you want to use Less properly, you should load your <em>.less</em> (with the <em>rel</em> attribute set to <em>stylesheet/less)</em> files BEFORE loading your <em>less.js</em> file, within the &lt;head&gt; section of your page :</p>
<pre class="brush: html; gutter: true">...
  &lt;head&gt;
    ...
    &lt;link rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; src=&quot;path/to/my/file.less&quot; /&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;path/to/my/less.js&quot;&gt;&lt;/script&gt;
  &lt;/head&gt;
...</pre>
<p>But here&rsquo;s a couple of things you don&rsquo;t know yet (unless, of course, if you already do) :</p>
<p>you can set things on a global <strong>less</strong> object before you load the <em>less.js</em> script file :</p>
<pre class="brush: javascript; gutter: true">&lt;script type=&quot;text/javascript&quot;&gt;
    less = {
        env: &quot;development&quot;, // or &quot;production&quot;
        async: false,       // load imports async
        fileAsync: false,   // load imports async when in a page under
                            // a file protocol
        poll: 1000,         // when in watch mode, time in ms between polls
        functions: {},      // user functions, keyed by name
        dumpLineNumbers: &quot;comments&quot;, // or &quot;mediaquery&quot; or &quot;all&quot;
        relativeUrls: false,// whether to adjust url&#039;s to be relative
                            // if false, url&#039;s are already relative to the
                            // entry less file
        rootpath: &quot;:/a.com/&quot;// a path to add on to the start of every url
                            //resource
    };
&lt;/script&gt;</pre>
<p>You can as well modify the content of your Less styles in run-time, using simple javascript within your page; for example, if you want to change a variable :</p>
<pre class="brush: actionscript3; gutter: true">less.modifyVars({
  @bgcolor: #c0c0c0;
});</pre>
<p>Since you can modify the styling at run-time, you might as well have fun with the console (console on Chrome and Safari, Firebug on Firefox, etc.).</p>
<p>Also, same way you can launch the watch mode using the URL suffix <strong>#!watch</strong>, you can add other options, such as : <strong>#!dumpLineNumbers:mediaQuery.</strong></p>
<p>And that&rsquo;s about it regarding the client side.</p>
<h4>Server side</h4>
<p>The server side is completely related to the Less compiler, and therefore will be talked about in the next post. See ya !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2013/03/07/if-youre-to-nail-css-less-is-more-part-3-mixins-client-and-server-side/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>If you&#8217;re to nail CSS, Less is more &#8211; part 2</title>
		<link>http://www.lemondedudev.com/2013/03/02/if-youre-to-nail-css-less-is-more-part-2/</link>
		<comments>http://www.lemondedudev.com/2013/03/02/if-youre-to-nail-css-less-is-more-part-2/#comments</comments>
		<pubDate>Sat, 02 Mar 2013 01:16:26 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[Conception / Modélisation]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[feignasse]]></category>
		<category><![CDATA[fluid]]></category>
		<category><![CDATA[fusion]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[génération]]></category>
		<category><![CDATA[générer]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[less is more]]></category>
		<category><![CDATA[live long and prosper]]></category>
		<category><![CDATA[meryl]]></category>
		<category><![CDATA[meryl streep]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[nerd]]></category>
		<category><![CDATA[nest]]></category>
		<category><![CDATA[nested]]></category>
		<category><![CDATA[nested rule]]></category>
		<category><![CDATA[nested rules]]></category>
		<category><![CDATA[nesting]]></category>
		<category><![CDATA[nesting variables]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[streep]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=509</guid>
		<description><![CDATA[In the last post, we&#8217;ve started running Less script to use variables in dynamic CSS file. Now, we&#8217;re going to get a bit more real and start designing sort of a real web page, with what would&#8217;ve usually been a header, a menu, a sidebar with blocks, a page container and some stuff in it. [...]]]></description>
				<content:encoded><![CDATA[<p>In the last post, we&rsquo;ve started running Less script to use variables in dynamic CSS file. Now, we&rsquo;re going to get a bit more real and start designing sort of a real web page, with what would&rsquo;ve usually been a header, a menu, a sidebar with blocks, a page container and some stuff in it. We&rsquo;re gonna do it all using CSS first, then Less.<span id="more-509"></span></p>
<h3>Nesting styles</h3>
<p>In your project directory, create a new file, called <em>nesting.html</em>. For the sake of this post only, let&rsquo;s also create a <em>nesting.less</em> file within <em>css/</em> directory. Here&rsquo;s the content of both the files :</p>
<pre class="brush: html; gutter: true">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;Less is more&lt;/title&gt;
  &lt;link rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; href=&quot;css/nesting.less&quot; /&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;js/less.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id=&quot;header&quot;&gt;
    &lt;h1&gt;This is the nesting page&lt;/h1&gt;
    &lt;ul class=&quot;menu&quot;&gt;
      &lt;li&gt;Menu 1&lt;/li&gt;
      &lt;li&gt;Menu 2&lt;/li&gt;
      &lt;li&gt;Menu 3&lt;/li&gt;
      &lt;li&gt;Menu 4&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;div id=&quot;sidebar&quot;&gt;
    &lt;div class=&quot;block&quot;&gt;
      &lt;h1&gt;Block 1&lt;/h1&gt;
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
      incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
      exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    &lt;/div&gt;
    &lt;div class=&quot;block&quot;&gt;
      &lt;h1&gt;Block 2&lt;/h1&gt;
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
      incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
      exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    &lt;/div&gt;
    &lt;div class=&quot;block&quot;&gt;
      &lt;h1&gt;Block 3&lt;/h1&gt;
      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
      incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
      exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div id=&quot;container&quot;&gt;
    &lt;div class=&quot;article&quot;&gt;
      &lt;h1&gt;Article title 1&lt;/h1&gt;
      &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
        incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
        exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
        irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
        pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
        deserunt mollit anim id est laborum.&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;article&quot;&gt;
      &lt;h1&gt;Article title 2&lt;/h1&gt;
      &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
        incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
        exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
        irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
        pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
        deserunt mollit anim id est laborum.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>It&rsquo;s long, but nothing fancy here.</p>
<h4>Fun trick first</h4>
<p>Here&rsquo;s a fun trick; in your browser, open the nesting.html page, which will look roughly like that at this point :</p>
<p style="text-align: center;"><img class="size-medium wp-image-512 aligncenter" style="border: 1px solid #999;" alt="No style nesting page" src="http://www.lemondedudev.com/wp-content/uploads/2013/03/Capture-d’écran-2013-03-01-à-17.10.18-287x300.png" width="287" height="300" /></p>
<p style="text-align: left;">Now, in your browser, add the following to the url, right after nesting.html :  <strong>#!watch</strong>    (e.g. http://localhost/less/nesting.html#!watch).<br />
This way, you enter the watch mode; the fun part of it is, whenever you change the CSS/Less file (and save your changes), the page will automatically be updated. Neat, right ?</p>
<h4>The classic CSS</h4>
<p>Here&rsquo;s a classic CSS content (in <em>nesting.less</em>) :</p>
<pre class="brush: css; gutter: true">body,div,p,ul,li,table,tr,td, h1 {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

body {
	margin: 0;
	padding: 0;
	font: 12px normal Arial, Sans-serif;
	color: #666;
}
#header {
	margin: 0;
	width: 100%;
	height: 100px;
	background-color: #ccc;
}
#header h1 {
	font-size: 36px;
	margin: 0;
	padding: 10px 5px;
	color: #000;
}
#header ul {
	position: absolute;
	top: 60px;
	left: 0;
	margin: 0;
	padding: 0;
	list-style-type: none;
	width: 100%;
	background-color: #ddc;
}
#header ul li {
	float: left;
	padding: 10px;
	width: 25%;
	height: 40px;
	border-left: 1px solid #333;
	text-align: center;
	font-size: 18px;
}
#sidebar {
	float: left;
	padding: 10px 20px;
	width: 25%;
	top: 0;
	bottom: 0;
}
#sidebar .block {
	text-align: justify;
	margin-bottom: 12px;
	background-color: #ccd;
	padding: 0 5px 10px 5px;
	border-radius: 5px;
	-moz-border-radius : 5px;
	-webkit-border-radius: 5px;
}
#sidebar .block h1 {
	font-size: 18px;
}
#container {
	float: left;
	width: 75%;
	padding: 10px 20px;
}
#container .article {
	font-size: 15px;
	text-align: justify;
	margin-bottom: 15px;
	background-color: #ddf;
	padding: 0 10px 20px 10px;
	border-radius: 10px;
	-moz-border-radius : 10px;
	-webkit-border-radius: 10px;
}
#container .article h1 {
	font-size: 24px;
	padding-left: 20px;
	border-left: 4px solid #666;
}</pre>
<p>Let&rsquo;s just forget the first 5 lines of the code that are supposed to handle the padding behaviour in different browsers (more info on <a title="this page" href="http://www.lemondedudev.com/2013/02/06/gerer-le-padding-dans-les-differents-browsers/">this page</a>). Here&rsquo;s the tree of styles :</p>
<pre class="brush: text; gutter: true">- body
    - header
        - h1
        - ul
            - li
    - sidebar
        - block
            - h1
    - container
        - article
        - h1</pre>
<p>And it looks like this (oh, wow) :<br />
<img class="size-medium wp-image-516 aligncenter" style="border: 1px solid #666" alt="La version CSS" src="http://www.lemondedudev.com/wp-content/uploads/2013/03/Capture-d’écran-2013-03-02-à-01.39.53-300x246.png" width="300" height="246" /></p>
<h4>The Less version</h4>
<p>Now we&rsquo;re to use one of the most powerful features of Less : the nested rules. For example, the <strong>#header h1</strong> will be defined as <em><strong>h1</strong> within <strong>#header</strong></em>, which will look like this :</p>
<pre class="brush: css; gutter: true">#header {
	margin: 0;
	width: 100%;
	height: 100px;
	background-color: @middle_color;

	h1 {
		margin: 0;
		font-size: @font_size*3;
		padding: 10px 5px;
		color: @dark_color;
	}
}</pre>
<p>It doesn&rsquo;t really cuts on the size of the file, but it reads easier. And combined with usage of variables, we get the following file :</p>
<pre class="brush: css; gutter: true">/* variables */
@font_size: 12px;
@dark_color: #000;
@intense_color: #666;
@middle_color: #ccc;
@menu_color: #ddc;
@block_color: #ccd;
@article_color: #ddf;

/* Take care of padding */
body,div,p,ul,li,table,tr,td, h1 {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

/* Nested styles */
body {
	margin: 0;
	padding: 0;
	font: @font_size normal Arial, Sans-serif;
	color: @intense_color;

	#header {
		margin: 0;
		width: 100%;
		height: 100px;
		background-color: @middle_color;

		h1 {
			margin: 0;
			font-size: @font_size*3;
			padding: 10px 5px;
			color: @dark_color;
		}

		ul {
			position: absolute;
			top: 60px;
			left: 0;
			margin: 0;
			padding: 0;
			list-style-type: none;
			width: 100%;
			background-color: @menu_color;

			li {
				float: left;
				padding: 10px;
				width: 25%;
				height: 40px;
				border-left: 1px solid @intense_color/2;
				text-align: center;
				font-size: @font_size*1.5;
			}
		}
	}

	#sidebar {
		float: left;
		padding: 10px 20px;
		width: 25%;
		top: 0;
		bottom: 0;

		.block {
			text-align: justify;
			margin-bottom: @font_size;
			background-color: @block_color;
			padding: 0 5px 10px 5px;
			border-radius: 5px;
			-moz-border-radius : 5px;
			-webkit-border-radius: 5px;

			h1 {
				font-size: @font_size*1.5;
			}
		}
	}

	#container {
		float: left;
		width: 75%;
		padding: 10px 20px;

		.article {
			font-size: @font_size*1.25;
			text-align: justify;
			margin-bottom: @font_size*1.25;
			background-color: @article_color;
			padding: 0 10px 20px 10px;
			border-radius: 10px;
			-moz-border-radius : 10px;
			-webkit-border-radius: 10px;

			h1 {
				font-size: @font_size*2;
				padding-left: 20px;
				border-left: 4px solid #666;
			}
		}
	}
}</pre>
<p style="text-align: center;">It looks like this (oh, wow) :<br />
<img class="aligncenter" title="La version Less" alt="La version Less" src="http://www.lemondedudev.com/wp-content/uploads/2013/03/Capture-d’écran-2013-03-02-à-01.39.53-300x246.png" width="300" height="246" /></p>
<p> Same, right ?!</p>
<p>And that&rsquo;s pretty much all you need to know about nested rules.</p>
<p>In the next topic, we&rsquo;ll talk about functions in Less, as well as Client Side and Server Side usage (and, if you behave, we&rsquo;ll talk about the Less compiler LessC and when to use it)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2013/03/02/if-youre-to-nail-css-less-is-more-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>If you&#8217;re to nail CSS, Less is more</title>
		<link>http://www.lemondedudev.com/2013/02/28/if-you-r-to-nail-css-less-is-more/</link>
		<comments>http://www.lemondedudev.com/2013/02/28/if-you-r-to-nail-css-less-is-more/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 18:09:51 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Ergonomie]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[feignasse]]></category>
		<category><![CDATA[fluid]]></category>
		<category><![CDATA[fusion]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[génération]]></category>
		<category><![CDATA[générer]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[less is more]]></category>
		<category><![CDATA[live long and prosper]]></category>
		<category><![CDATA[meryl]]></category>
		<category><![CDATA[meryl streep]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[nerd]]></category>
		<category><![CDATA[nesting variables]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[streep]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=501</guid>
		<description><![CDATA[Here&#8217;s the deal : a while ago, i wrote an article about CSS and how one&#8217;s not supposed to forget about the C in CSS (C meaning Cascading, you noobs&#8230;); but the fact is, the more i&#8217;ve been working with people, the more i&#8217;ve seen stuff that just give me the Gee-Bees : people confusing [...]]]></description>
				<content:encoded><![CDATA[<p>Here&rsquo;s the deal : a while ago, i wrote an article about CSS and how one&rsquo;s <a title="not supposed to forget about the C in CSS" href="http://www.lemondedudev.com/2011/09/22/noubliez-pas-le-c-de-css/" target="_blank">not supposed to forget about the C in CSS</a> (C meaning Cascading, you noobs&#8230;); but the fact is, the more i&rsquo;ve been working with people, the more i&rsquo;ve seen stuff that just give me the Gee-Bees : people confusing classes, ids, creating #containers in nested .containers containing .contents. Of course, it wasn&rsquo;t that bad, it&rsquo;s been a long time since i&rsquo;ve seen CSS code with a .red-background classname (FYI, last time i saw one, the background color was actually blue, which helps understanding why it is so wrong). However, for a couple of years now has emerged a new way to design CSS, and when i say &laquo;&nbsp;design CSS&nbsp;&raquo;, i mean neat, clean and beautiful CSS, with a capital C.<span id="more-501"></span></p>
<h3>Meryl Streep is that good for a reason</h3>
<p>It might only be a legend, but it&rsquo;s been told that Meryl Streep considers the fact that being an actor doesn&rsquo;t really rely on what you do as much as on what you don&rsquo;t do; she would say that <em>less is more</em>. Funny i mention it, because we&rsquo;re going to talk about a way to create awesome CSS design using less code, and it&rsquo;s called <a title="Less Css" href="http://lesscss.org" target="_blank"><strong>Less CSS</strong></a>.</p>
<p>First of all, Less CSS (hereafter simply &laquo;&nbsp;Less&nbsp;&raquo;) is nothing but a cutie-lighter-than-light-javascript-file. There, i&rsquo;ve said it !</p>
<p>What it does is it gives you all the gifts you always wanted regarding CSS files : variables, nested information, functions, etc. Ten years ago, i used to work with CSS files that were actually PHP files (completely dynamic), and i&rsquo;m not proud of it (i was, then), but the fact is that Less succeeds where server-side scripting had failed : it lets you focus on what you&rsquo;re doing and prevents the distraction of how you&rsquo;re doing it (and i&rsquo;ve seen some long-ass CSS files in my career, knowing that whoever wrote them had been running out of synonyms for &laquo;&nbsp;container&nbsp;&raquo;, &laquo;&nbsp;menu_item&nbsp;&raquo;, &laquo;&nbsp;side_menu&nbsp;&raquo; and so on).</p>
<h3>Head first</h3>
<p>Where do we start ? You go to <a title="lesscss.org" href="http://lesscss.org" target="_blank">lesscss.org</a>, follow the &laquo;&nbsp;Download less.js&nbsp;&raquo; button link, copy the content displayed and save it on your computer in a <strong>less.js</strong> file. Let&rsquo;s assume you&rsquo;re following this post with a directory that contains nothing but : an <em>index.html</em> file, a <em>js/</em> directory and a <em>css/</em> directory. Well, then, put your <em>less.js</em> file in the <em>js/</em> directory. Then, in the <em>css/</em> directory, create an empty <strong>style.less</strong> file  (yes, the extension is .less and not .css). Finally, open your index.html and copy this incredibly sharp and witty code :</p>
<pre class="brush: html; gutter: true">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Less is more&lt;/title&gt;
  &lt;link rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; href=&quot;css/style.less&quot; /&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;js/less.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<pre class="brush: html; gutter: true"></pre>
<p>Note — because it&rsquo;s really important — that the less.js file is called <span style="text-decoration: underline;"><strong>AFTER</strong></span> the style.less file. Believe it or not, you&rsquo;re all set to work way better than you&rsquo;ve been used to.</p>
<h3>First sample code</h3>
<p>&nbsp;</p>
<h4>Understanding variables</h4>
<p>Open your index.html and insert the following within the &lt;body&gt; of your document :</p>
<pre class="brush: html; gutter: true">&lt;div id=&quot;greetings&quot;&gt;Live long and prosper&lt;/div&gt;</pre>
<p>I know&#8230;great, right ?</p>
<p>Now open the <em>css/style.less</em> file. Here&rsquo;s a good impression of what can cross your mind as you try to make your index page unforgettable :</p>
<ul>
<li>i don&rsquo;t know what color i want to use yet;</li>
<li>i know i want a border around the greetings div;</li>
<li>i know i&rsquo;ll probably use the same color for the border and for the text within that div;</li>
<li>maybe i&rsquo;ll go with rounded corners;</li>
<li>should i set up some margins for the body ? for the div ? What about padding ?</li>
</ul>
<p>And because all those questions will keep on running as long as you&rsquo;re not done with your project, it tends to get hard to keep track of everything you change so that you&rsquo;re sure you&rsquo;ve changed it everywhere.</p>
<p>Let&rsquo;s assume i&rsquo;d go with the following CSS file :</p>
<pre class="brush: css; gutter: true">body {
  margin: 0;
  background-color: #fff;
  font: 11px normal Helvetica,Sans-serif;
}

#greetings {
  border: 1px solid #999;
  color: #999;
  border-radius: 5px;              /* mostly for IE */
  -moz-border-radius: 5px;      /* mostly for Firefox */
  -webkit-border-radius: 5px;   /* mostly for Safari and Chrome */
}</pre>
<p>Well, you should normally be able to tell the weaknesses of such a file :</p>
<ul>
<li>if you feel like changing the color of the border and text, you need to change two values;</li>
<li>if you feel like changing the radius of the div corners, you need to do it at three different lines.</li>
</ul>
<p>At this point, i&rsquo;m already bored just reading myself and, let&rsquo;s face it, our index page lacks a certain je-ne-sais-quoi that really could improve its quality.</p>
<p>Now, let&rsquo;s write the exact same CSS code, but using Less instead : (go to your <em>style.less</em> file and edit the following)</p>
<pre class="brush: css; gutter: true">@a_color: #999;
@radius: 5px;

body {
  margin: 0;
  background-color: #fff;
  font: 11px normal Helvetica, Sans-serif;
}

#greetings {
  border: 1px solid @a_color;
  color: @a_color;
  border-radius: @radius;
  -moz-border-radius : @radius;
  -webkit-border-radius: @radius;
}</pre>
<p>You&rsquo;re done (you may look at the page now, but be aware you will not feel rewarded for your hard work&#8230;not yet). Now what did we do ?</p>
<p>@a_color: #999;</p>
<p>This is setting up a variable, called <em>a_color</em> (prefix with the character @ to indicate it&rsquo;s a variable); then the writing is the same as for CSS : after naming your variable, use a colon and write down the value (it can be anything supported in CSS, such as : #ccc, 12px, none, etc. and it can even be another variable — we&rsquo;ll see that later).</p>
<p>Then, in what looks just like a regular CSS file, you may write the variable instead of the value (which is really programming 101, but may seem new to some of you regarding CSS) :</p>
<p>border: 1px solid @a_color;</p>
<p>means exactly</p>
<p>border: 1px solid #999;</p>
<h4>More variables</h4>
<p>Let&rsquo;s now make it a bit better. We have now figured out that we probably won&rsquo;t be using the same color for the body background and the greetings background; however, the greetings background color should, somehow, be related to the text and border color; moreover, the greetings div should be smaller (right now, it&rsquo;s page wide); also, the radius of the corners of the greetings box should be related to the text size&#8230;and to the padding&#8230;etc.</p>
<p>Empty the content your style.less file and let&rsquo;s try the following :</p>
<pre class="brush: css; gutter: true">@main_color: #000;
@second_color: #999;
@background_color: #ccc;
@font_size:12px;
@radius: 6px;
@padding: 12px;

body {
  margin: 0;
  background-color: @background_color;
  font: @font_size normal Helvetica, Sans-serif;
}

#greetings {
  margin: 100px auto; /* 100px from the top, horizontally centered */
  width: 300px;       /* why not ? */
  padding: @padding;
  border: 1px solid @main_color;
  color: @main_color;
  border-radius: @radius;
  -moz-border-radius : @radius;
  -webkit-border-radius: @radius;
  background-color: @second_color;
}</pre>
<p>The content is quite self-explanatory, and the result looks just like that :</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-504" title="Simple Less project using simple variables" src="http://www.lemondedudev.com/wp-content/uploads/2013/02/Capture-d’écran-2013-02-28-à-18.53.47-300x191.png" alt="Simple Less project using simple variables" width="300" height="191" /></p>
<p style="text-align: left;">We almost did what we said we would, but not completely : we didn&rsquo;t create any relationship between variables; so let&rsquo;s just change the first lines of style.less (the variables declarations) into that :</p>
<pre class="brush: css; gutter: true">@main_color: #000;
@font_size:12px;

@second_color: @main_color + (.6 * #fff);
@background_color: @main_color + (.8 * #fff);
@radius: @font_size/2;
@padding: @font_size;</pre>
<p>It roughly didn&rsquo;t change anything, and you&rsquo;d better believe it : you may now add, multiply, divide (watch out for the per zero division), subtract colors, lengths, etc.</p>
<p>To get what we&rsquo;re doing, just change the first two lines now, for example into :</p>
<pre class="brush: css; gutter: true">@main_color: #6a5199;
@font_size:26px;</pre>
<p>Watch the difference :</p>
<p><img class="size-medium wp-image-505 aligncenter" style="border: 1px solid #999;" title="Second simple project using less variables" src="http://www.lemondedudev.com/wp-content/uploads/2013/02/Capture-d’écran-2013-02-28-à-19.05.23-300x147.png" alt="Second simple project using less variables" width="300" height="147" /></p>
<p>&nbsp;</p>
<p>In the next topic, we&rsquo;ll talk about nesting information within Less files.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2013/02/28/if-you-r-to-nail-css-less-is-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gérer le padding dans les différents browsers</title>
		<link>http://www.lemondedudev.com/2013/02/06/gerer-le-padding-dans-les-differents-browsers/</link>
		<comments>http://www.lemondedudev.com/2013/02/06/gerer-le-padding-dans-les-differents-browsers/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 13:24:04 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[border]]></category>
		<category><![CDATA[border-box]]></category>
		<category><![CDATA[box-sizing]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[content-box]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[margin]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[msie]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[padding]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webkit]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=496</guid>
		<description><![CDATA[Le problème est le suivant : vous créez une page web avec des div dans tous les sens, des liens, etc. À un moment donné, vous allez vous intéresser à l&#8217;aspect de votre page web et rentrez dans votre CSS. Partons du principe, pour l&#8217;article, que vous êtes sur du CSS from scratch (vous n&#8217;utilisez [...]]]></description>
				<content:encoded><![CDATA[<p>Le problème est le suivant : vous créez une page web avec des div dans tous les sens, des liens, etc. À un moment donné, vous allez vous intéresser à l&rsquo;aspect de votre page web et rentrez dans votre CSS. Partons du principe, pour l&rsquo;article, que vous êtes sur du CSS from scratch (vous n&rsquo;utilisez ni Less, ni Bootstrap, ni aucune feuille de style reset.css trouvée sur le web). Vous créez un certain type de div, disons de la classe &laquo;&nbsp;article&nbsp;&raquo; en mettant bien que la hauteur du div doit être de 150px et la largeur de 400px (oui, vous le faites en pixels&#8230;). Par ailleurs, vous souhaitez que le texte ne colle pas les bords de votre div, aussi mettez-vous un padding de 10px partout. Comme vous n&rsquo;avez aucun goût, vous décidez de mettre un bord noir d&rsquo;un pixel d&rsquo;épaisseur autour de votre div. À ce stade, vous en êtes là :<span id="more-496"></span></p>
<pre class="brush: css; gutter: true">.article {
  height: 150px;
  width: 400px;
  padding: 10px;
  border: 1px solid #000;
}</pre>
<p>Et, pour le HTML :</p>
<pre class="brush: html; gutter: true">...
&lt;div class=&quot;article&quot;&gt;Lorem ipsum dolor sit amet&lt;/div&gt;</pre>
<p>Comme vous êtes quelqu&rsquo;un de consciencieux, vous décidez de tester votre magnifique page dans tous les principaux navigateurs. Cette page sort plutôt bien sur l&rsquo;ensemble de ceux-ci mais, en y regardant de plus près, il apparaît que, sous Safari, votre div est plus grande que sur les autres navigateurs; en effet, les autres navigateurs ont  bien dessiné un div de 150&#215;400 pixels, tandis que Safari en a dessiné un de 170&#215;420 pixels. Il a tout simplement considéré le padding comme une dimensions supplémentaire.</p>
<h2>Standards HTML</h2>
<p>En matière de boxing (l&rsquo;art de concevoir des boîtes), tout le monde s&rsquo;est à peu près mis d&rsquo;accord pour dire qu&rsquo;on peut définir une box avec quatre éléments :</p>
<ul>
<li>le margin : c&rsquo;est l&rsquo;espace réservé par la box au-dehors de celle-ci (marge externe, si vous voulez);</li>
<li>le border : c&rsquo;est le bord de la box;</li>
<li>le padding : c&rsquo;est la marge comprise entre le bord de la box et la zone de contenu (marge interne);</li>
<li>la zone de contenu : c&rsquo;est la zone que vous pouvez naturellement remplir avec du texte, des images, des liens, d&rsquo;autres box, etc.</li>
</ul>
<p>Les standards HTML étant ce qu&rsquo;ils sont (et, surtout, ayant été ce qu&rsquo;ils furent par le passé), chaque navigateur a sa propre interprétation de ce qui correspond à quoi, de ce qui prime sur quoi, etc.</p>
<p>Concernant Safari, il considère que les dimensions données à une box sont en fait les dimensions de sa zone de contenu, là où la plupart des navigateurs considèrent que ce sont les dimensions mesurées au bord de la box. Nul ne peut dire qui a raison ou tort, ce n&rsquo;est qu&rsquo;une question d&rsquo;interprétation de ce qu&rsquo;est une box. En revanche, ce qui importe, c&rsquo;est de faire en sorte, lorsque vous concevez une page HTML au pixel près,  que l&rsquo;affichage de celle-ci soit le même indépendamment de l&rsquo;environnement.</p>
<h2>Box-sizing</h2>
<p>Il existe une directive CSS (ou plutôt une règle) pour chaque kit de browser qui vous permet de définir une fois pour toutes le comportement des éléments d&rsquo;une box, c&rsquo;est le box-sizing.</p>
<p>Dans votre fichier CSS, vous ajoutez, par exemple pour les divs uniquement, le code suivant :</p>
<pre class="brush: css; gutter: true">div {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

.article {
  height: 150px;
  width: 400px;
  padding: 10px;
  border: 1px solid #000;
}</pre>
<p>Et le tour est joué.</p>
<p>Regardons de plus près ce code :</p>
<p><strong>-wekbit-box-sizing</strong> est une règle du webkit (principalement Safari et Chrome) pour déterminer la mesure des dimensions d&rsquo;une box ; <strong>-moz-box-sizing</strong> est l&rsquo;équivalent Firefox et autres Gecko, tandis que le simple <strong>box-sizing</strong> vaut pour Opera et Internet Explorer.</p>
<p>La valeur <strong>border-box</strong> signifie très exactement ce dont on parlait à l&rsquo;instant, c&rsquo;est à dire la mesure aux bords de la box.</p>
<p>Indiquons les différentes valeurs possibles de ces règles pour bien comprendre le fonctionnement :</p>
<ul>
<li><span style="text-decoration: underline;"><strong>content-box</strong> :</span> la mesure se fait à l&rsquo;intérieur du bord d&rsquo;une box;</li>
<li><span style="text-decoration: underline;"><strong>border-box</strong> :</span> la mesure se fait à l&rsquo;extérieur du bord d&rsquo;une box (si votre border fait 25px, la différence avec le précédent sera de 50px);</li>
<li><span style="text-decoration: underline;"><strong>padding-box</strong> :</span> la mesure se fait uniquement sur la zone de contenu (la padding et le border sont ensuite ajoutés).</li>
</ul>
<h2>Conclusion</h2>
<p>Ok, cet article est court et tient plus du Tip que du dossier de fond; mais il illustre surtout, selon moi, le besoin d&rsquo;aller chercher, dans les kits navigateurs, les subtilités de chacun, les moyens d&rsquo;obtenir les mêmes résultats sur des environnements différents, etc.</p>
<p>Du coup, je vous invite à visiter les sites suivants (mais également de nombreux autres, tous plus ou moins bien faits, mais qui ont le mérite d&rsquo;exister) :</p>
<ul>
<li><a title="Le WebKit (pour Safari et Chrome)" href="http://www.webkit.org" target="_blank">le WebKit (pour Safari et Chrome)</a> ;</li>
<li><a title="le &quot;mozKit&quot; (pour Firefox et autres Gecko)" href="https://developer.mozilla.org/en-US/docs/Mozilla/Gecko" target="_blank">le &laquo;&nbsp;mozKit&nbsp;&raquo; (pour Firefox et autres Gecko)</a> .</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2013/02/06/gerer-le-padding-dans-les-differents-browsers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salt&#8217;n Pepper on passwords; spicy enough ?</title>
		<link>http://www.lemondedudev.com/2012/10/03/saltn-pepper-on-passwords-spicy-enough/</link>
		<comments>http://www.lemondedudev.com/2012/10/03/saltn-pepper-on-passwords-spicy-enough/#comments</comments>
		<pubDate>Wed, 03 Oct 2012 10:19:44 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[TIML]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=490</guid>
		<description><![CDATA[You heard a lot about it and, let&#8217;s face it, from time to time, you talked about it yourself with a cute touch of self-confidence that usually makes you sound like you know what you&#8217;re talking about. But salt &#38; pepper ? On passwords ? Is it safe ? Is it safe ? All right, [...]]]></description>
				<content:encoded><![CDATA[<p>You heard a lot about it and, let&rsquo;s face it, from time to time, you talked about it yourself with a cute touch of self-confidence that usually makes you sound like you know what you&rsquo;re talking about. But salt &amp; pepper ? On passwords ?</p>
<p><span id="more-490"></span></p>
<h3>Is it safe ? Is it safe ?</h3>
<p>All right, if you&rsquo;re under 30 you didn&rsquo;t get the joke, but i don&rsquo;t really mind. Let&rsquo;s first talk a bit about passwords because, let&rsquo;s face it, you know for sure the weak link won&rsquo;t be your code, but the fact that people tend to use their birthdate or kids name for passwords. So how can you make sure it is safe ?</p>
<h4>There&rsquo;s no such thing as safe</h4>
<p>This is your first mantra : THERE&rsquo;S NO SUCH THING AS SAFE PASSWORD; cracking a password is always a possibility, and only a matter of time and will (of course, i&rsquo;m talking about regular security; don&rsquo;t post a message telling that a self-destructing database after one password error is safe&#8230;and it&rsquo;s really not, btw).</p>
<p>Whether you know exactly how or not, password encryption is actually become quite good; with a sh*tload of mathematics, prime number compositions, and so on&#8230;What you need to know about it is that they&rsquo;ve managed to create an encryption system that is not a bijection (meaning there&rsquo;s no algorithm — at least it hasn&rsquo;t been found — that can take you from the encrypted password to the original password). What it means to you is that your passwords should be protected against <strong>brute force attacks</strong>.</p>
<h4>Brute Force attacks</h4>
<p>A brute force attack is encrypting every possible string until the encryption you get matches the encrypted password; it&rsquo;s called brute force because it&rsquo;s as brainless as it is ruthless, enough time given. Theoretically, it can&rsquo;t miss&#8230;but it can take days or weeks. And because it&rsquo;s long, crackers (i.e. people hacking passwords) have developed strategies to get faster where they want to go.</p>
<h5>Dictionaries</h5>
<p>Simple, neat, elegant. They try real words; they can even choose a most-likely-to-be-used language; so if your usual password is &laquo;&nbsp;password&nbsp;&raquo;, &laquo;&nbsp;secret&nbsp;&raquo;, &laquo;&nbsp;admin&nbsp;&raquo;, &laquo;&nbsp;poodle&nbsp;&raquo; or &laquo;&nbsp;steam-pipe&nbsp;&raquo;,  you may want to reconsider (you also may want to reconsider being a software developer anyway). There&rsquo;re also first name dictionaries out there so, unless you named your kid &laquo;&nbsp;@3#dZgv4éS4&Prime; (poor child), you want to avoid first names.</p>
<h5>Character tables</h5>
<p>Most crackers are not trying to get <strong>your</strong> password; trey try to get <strong>any</strong> password; whether it&rsquo;s yours or not is completely irrelevant. So, since they try to get as far as they can, they brute-force-attack the weakest passwords, in terms of brute-force-attack strength. That means that they try to crack the passwords with the weakest combinatory, <em>ergo</em> the less amount of different characters.</p>
<p>For example, if you can only use the letters A and B to create a four-letter password, possible passwords are very limited :</p>
<p>AAAA, AAAB, AABA, AABB, ABAA, ABAB, ABBA <em>(waterloo)</em>, ABBB, BAAA, BAAB, BABA, BABB, BBAA, BBAB, BBBA, BBBB = 16 cases</p>
<p>If you only add the letter C, you get 81 cases. Add D and you get 256 cases. Now make the password five-lettered and you get 1024 cases.</p>
<p>What they do is, they try all possible passwords, from 1 to 14 characters, using all the letters of the latin alphabet, both uppercase and lowercase ( so A to Z and a to z ) as well as digits ( 0 to 9 ). If your password is less than 8 characters and only using those characters, it&rsquo;s a matter of seconds. That&rsquo;s exactly why you&rsquo;re usually told to use other characters, such as ponctuation marks ( ! , ? # &#8211; _  @ $ an so on).</p>
<h5>Databases</h5>
<p>Because crackers are usually anything but morons, they chose to do it another way; they&rsquo;ve created a database, where they store all possible encryption; they have tables with — to make it simple — two columns : the first one is the original password, the second one is the encrypted password (they usually have one column per encryption mode; so there&rsquo;s one MD5 column, one SHA1&#8230;). But since it&rsquo;s impossible to store all the possible strings (because they&rsquo;re limitless, duh !), they had to narrow it as well. So it may seem that the problems are still the same, but they&rsquo;re not.</p>
<p>First of all, the attack is completely local, a simple query on a database, not the kind of things that make the feds loof after you); second, it&rsquo;s incremental, they constantly add new passwords. But it also gets larger and larger (meaning they need huge hard drives — which is not a problem anymore, thank you cloud computing — but also the queries get longer time to get executed — you can&rsquo;t imagine the size of the indexes).</p>
<h5>So&#8230;is it safe ?</h5>
<p>To sum it up, it&rsquo;s not less safe than before, given the fact that you protect yourself properly. If you use long passwords, with all different kind of characters and symbols, you should be fine. But your users, they hate it ! And remember this : they consider that security is your problem as they&rsquo;re being the weakest link in your security chain (those bast*rds !!!).</p>
<h3>Salt &amp; Pepper</h3>
<p>Actually it&rsquo;s pepper and salt, but we&rsquo;ll get to it. So the question is : how can you enforce users to use strong passwords ? Many different strategies here : you make them change every month (lame), you show them a green light when their password is strong enough&#8230;There are many ways, we&rsquo;ll only talk about our favorite : the DIY password strengthener&#8230;</p>
<p>Wouldn&rsquo;t it be great if you could change passwords to stronger passwords ? That&rsquo;s exactly what we&rsquo;ll do. It&rsquo;s not a new idea (if you ever heard of public/private key exchange, it&rsquo;s not the same at all, but it will help you to understand the deal), but it&rsquo;s smart enough and, if you do it right, it&rsquo;s a hit.</p>
<p>Your user is asked to provide a password; since he&rsquo;s completely clueless on digital security, he provides one of the best passwords ever : &laquo;&nbsp;password&nbsp;&raquo; (it&rsquo;s a .02 sec on a brute-force).</p>
<p>Before you encrypt it, you add a prefix (with a P, as in Pepper) and a suffix (with an S, as in Salt) to the password, to make it strong enough :   <strong>@&amp;é89_)#password___-°§éé&amp;ù</strong></p>
<p>That&rsquo;s a good one. Now, whenever the user is asked for his password, add the Salt&rsquo;n Pepper before encryption to match the password. And obviously (needless to say, but i&rsquo;ll say it anyway), encryptions such as MD5 or SHA1 do not show salt or pepper; you can&rsquo;t deduce them from an encrypted password.</p>
<h3>Is it safe ?</h3>
<p>Wanna make it safer ? Change the salt&rsquo;n pepper from time to time; make it automatic and programmatic; for example, when a user logs in (let&rsquo;s say once a month), you change the salt&rsquo;n pepper to new values (again, once a month); you just need to set a flag on the user in order to know if the change has been made or not. This way, you can have them change passwords as often as you want without even being aware of it.</p>
<p>IMHO, that&rsquo;s as safe as it gets.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2012/10/03/saltn-pepper-on-passwords-spicy-enough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Report score on Game Center leaderboard</title>
		<link>http://www.lemondedudev.com/2012/09/14/report-score-on-game-center-leaderboard-remains-empty/</link>
		<comments>http://www.lemondedudev.com/2012/09/14/report-score-on-game-center-leaderboard-remains-empty/#comments</comments>
		<pubDate>Fri, 14 Sep 2012 16:04:28 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[COO / POO]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Généralités]]></category>
		<category><![CDATA[iPad (bref : iOS)]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[empty]]></category>
		<category><![CDATA[feignasse]]></category>
		<category><![CDATA[game center]]></category>
		<category><![CDATA[GKScore]]></category>
		<category><![CDATA[highscore]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[ipod touch]]></category>
		<category><![CDATA[leader board]]></category>
		<category><![CDATA[leaderboard]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[score]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=481</guid>
		<description><![CDATA[A quick one&#8230; many of you &#8211; nay, many of us &#8211; shared this problem while developing a game on iOS : you&#8217;ve set up properly the Game Center Leaderboard for your application, you log in on your device&#8217;s GameCenter Sandbox, you try to report scores, the debugger chills, no problem at all, but no [...]]]></description>
				<content:encoded><![CDATA[<p>A quick one&#8230;</p>
<p>many of you &#8211; nay, many of us &#8211; shared this problem while developing a game on iOS : you&rsquo;ve set up properly the Game Center Leaderboard for your application, you log in on your device&rsquo;s GameCenter Sandbox, you try to report scores, the debugger chills, no problem at all, but no score shows up, the leaderboard remains empty as a geek&rsquo;s fridge (except for some mustard, although nobody knows exactly why).</p>
<p>You&rsquo;ve been told many things :</p>
<ul>
<li>you need to cast your score as an int_64t, whatever that may be (that&rsquo;s actually correct);</li>
<li>you need more than one account on your sandbox to have the scores displayed (that&rsquo;s absolutely not mandatory);</li>
<li>you suck (well&#8230;some of you do).</li>
</ul>
<p>I found the answer, but i won&rsquo;t take credit for that, because it was completely unexpected.<span id="more-481"></span></p>
<h3>Get it right on iTunesConnect</h3>
<p>When you create a leaderboard for your app on iTunesConnect, you set a couple of things, including :</p>
<ul>
<li>its reference (aka Leaderboard reference);</li>
<li>its id (aka Leaderboard ID).</li>
</ul>
<p>Right now, that doesn&rsquo;t help, but you&rsquo;ll see in a minute that, sometimes, it&rsquo;s all about the words&#8230;</p>
<h3>Report the score on your Leaderboard</h3>
<p>You&rsquo;ve seen those couple of lines everywhere; it&rsquo;s so easy, it&rsquo;s actually boring. To report score on your GameCenter Leaderboard, you need to initialize a GKScore, set the score and send the whole thing; you need not to worry about the user, about being authenticated (well, you need to, but not here !). It&rsquo;s great ! It&rsquo;s got a giant Apple on its ass for being so good. For the sake of it :</p>
<pre class="brush: C++; gutter: true">- (void) reportScore: (int64_t) score forCategory: (NSString*) category {
    GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
    scoreReporter.value = score;

    [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
        if (error != nil) {
            // handle the reporting error
        }
    }];
}</pre>
<p>BTW, read <a title="this page" href="http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/LeaderBoards/LeaderBoards.html">this page</a>, it&rsquo;s quite complete&#8230;<br />
You&rsquo;ve seen this code on many forums, but nobody never bothered to ask :<br />
<strong><em>Well, when you initialize your GKScore with the category, WTF is the category ?</em></strong></p>
<p>Good question; as far as i know, about 1/3 of the people get it wrong about it. For a while, i thought that the category was the leaderboard reference (because &laquo;&nbsp;category&nbsp;&raquo; doesn&rsquo;t sound as a unique item that would be used to identify it).</p>
<p>It turns out category <span style="text-decoration: underline;"><strong>IS ACTUALLY</strong></span> the leaderboard id.</p>
<p>Let&rsquo;s get it loud and clear for the google bots outside :</p>
<h3>CATEGORY == Leaderboard ID</h3>
<p>When i fixed this, the Sandbox Game center started working fantasticulously (i know it&rsquo;s not a word&#8230;i don&rsquo;t care) !</p>
<p>By that, i mean : scores get posted instantly, with only one sandbox account (in your face, you elusive doppelgänger of mine&#8230;)</p>
<p>&nbsp;</p>
<p>Anyway, hope that will help. If so, please leave a message, so that i know i&rsquo;ve been helpful to one and probably will rot in hell a bit less time. You can also visit the page of my own iPhone game app : WarpOut :</p>
<p><a title="http://itunes.com/apps/aelif/warpout" href="http://itunes.com/apps/aelif/warpout">http://itunes.com/apps/aelif/warpout</a></p>
<p><a title="http://www.facebook.com/com.aelif.warpout" href="http://www.facebook.com/com.aelif.warpout" target="_blank">http://www.facebook.com/com.aelif.warpout</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2012/09/14/report-score-on-game-center-leaderboard-remains-empty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La viralité, ou comment seul je ne peux rien, mais ensemble nous pouvons tout&#8230;</title>
		<link>http://www.lemondedudev.com/2012/09/13/la-viralite-ou-comment-seul-je-ne-peux-rien-mais-ensemble-nous-pouvons-tout/</link>
		<comments>http://www.lemondedudev.com/2012/09/13/la-viralite-ou-comment-seul-je-ne-peux-rien-mais-ensemble-nous-pouvons-tout/#comments</comments>
		<pubDate>Wed, 12 Sep 2012 22:59:30 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[iPad (bref : iOS)]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[Monde réel]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[classique]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook api]]></category>
		<category><![CDATA[feignasse]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod touch]]></category>
		<category><![CDATA[jeu]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[objet]]></category>
		<category><![CDATA[open graph]]></category>
		<category><![CDATA[opengraph]]></category>
		<category><![CDATA[sérieux]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=475</guid>
		<description><![CDATA[Post court, simplement pour évoquer une certaine reflexion autour de cette fameuse question du buzz&#8230;Comment une idée devient-elle virale ? Ma compréhension de l&#8217;App Store, c&#8217;est qu&#8217;il y a les applis qui ont été vendues en tout moins de 200 fois, et celles qui se vendent à au moins 200 exemplaires par semaine. Mais où [...]]]></description>
				<content:encoded><![CDATA[<p>Post court, simplement pour évoquer une certaine reflexion autour de cette fameuse question du buzz&#8230;Comment une idée devient-elle virale ?</p>
<p>Ma compréhension de l&rsquo;App Store, c&rsquo;est qu&rsquo;il y a les applis qui ont été vendues en tout moins de 200 fois, et celles qui se vendent à au moins 200 exemplaires par semaine. Mais où se fait la bascule ? Mettons de côté immédiatement les sociétés qui mettent des millions dans la communication, je sais bien que ça marche, mais je ne dispose pas de ce genre de budgets&#8230;Les indépendants, même très sociables, ont un cercle restreint d&rsquo;amis (une ou plusieurs centaines, mais guère plus); pourtant certains franchissent le seuil. Comment ?<span id="more-475"></span></p>
<h3>Allez donc voir ailleurs</h3>
<p>Une fois n&rsquo;est pas coûtume, je vais d&rsquo;abord vous demander d&rsquo;aller voir ailleurs, non pas si j&rsquo;y suis (car je n&rsquo;y suis pas), mais pour qu&rsquo;on parle bien tous de la même chose. Le formidable document disponible sur ted.com intitulé &laquo;&nbsp;How to start a movement&nbsp;&raquo; ne dure que quelques minutes et, s&rsquo;il est en anglais, dispose de sous-titres dans presque toutes les langues communément parlées :</p>
<p><a title="How to start a movement, par Derek Sivers" href="http://www.ted.com/talks/lang/en/derek_sivers_how_to_start_a_movement.html" target="_blank">How to start a movement, par Derek Sivers</a></p>
<p>Cela étant fait, procédons.</p>
<h3>Gaining momentum</h3>
<p>Comment atteindre ce momentum, ce seuil ? Prenons l&rsquo;exemple du jeu WarpOut que je viens de lancer sur l&rsquo;App Store&#8230;Bien évidemment, depuis qu&rsquo;il est en ligne, mes parents, mes cousins, mes plus proches amis, gamers ou non, l&rsquo;ont acquis. Mais cela ne suffit pas à faire d&rsquo;eux les premiers suiveurs. Il faut encore qu&rsquo;ils notent l&rsquo;application, qu&rsquo;ils en fassent une critique (si possible pas trop dithyrambique) et, le point le plus important, qu&rsquo;ils en parlent autour d&rsquo;eux, qu&rsquo;ils provoquent eux-mêmes à leur tour des ventes.</p>
<p>Mais attention ! Rappelons-nous bien que nos amis ne sont pas des commerciaux, et ne sauraient être traités comme des employés (on y perdrait bien plus que des ventes).</p>
<p>La difficulté est justement là; il faut que votre cercle le plus proche devienne &laquo;&nbsp;spontanément&nbsp;&raquo; un vecteur de communication de votre produit : il faut respecter vos amis (bon, je dis surtout ça pour le coup où j&rsquo;aurais des amis qui lisent l&rsquo;article).</p>
<h3>En pratique, je fais quoi ?</h3>
<p>En pratique, un outil merveilleux vous facilite (un peu) la tâche : le livre des faces (ou facebook, pour les bilingues — Amazing !).</p>
<p>Outre le fait de poster comme un porc sur votre mur (sur le vôtre, n&rsquo;allez pas spammer vos amis), il vous faut créer une page; cette page est le QG de l&rsquo;info, c&rsquo;est le site internet de votre produit qui est déjà prêt à rencontrer vos amis, leurs amis et divers inconnus, prêt à être détroussé comme une paysanne moyen-âgeuse par Google.</p>
<p>Cette page, vous n&rsquo;y couperez pas, il faut que 30 personnes l&rsquo;aiment (sinon votre page est invisible, pour ainsi dire). Votre premier cercle d&rsquo;amis; croyez-moi, vous pouvez compter sur eux.</p>
<p>Ensuite, il faut générer du contenu, et ce contenu doit être viral, au sens ou Facebook l&rsquo;entend. Qu&rsquo;est-ce à dire ?</p>
<p>Un contenu est viral, pour Facebook, lorsqu&rsquo;il commence à être vu par des témoins de 2e rang (vous diffusez une image, vos amis la voient : 1e rang; ils l&rsquo;aiment ou la partagent, leurs amis voient ce like ou ce partage : 2e rang, bravo, vous êtes viral).</p>
<p>À ce stade, ne demandez pas à vos amis d&rsquo;aimer votre contenu, car vous ne feriez, au mieux, qu&rsquo;étendre votre cercle d&rsquo;amis à leur cercle d&rsquo;amis; vous ne pourrez en aucun cas demander aux amis de vos amis d&rsquo;aimer ce que vous faites. Du coup, vous devez faire du contenu que les gens aiment. Et c&rsquo;est là que votre page Facebook est un formidable vecteur de communication.</p>
<p>Si vous avez un site internet, même formidable, mais que personne ne le visite, vous ne faites rien.</p>
<p>Si vous avez une page avec beaucoup d&rsquo;abonnés, votre moindre remarque leur sera présentée (d&rsquo;où l&rsquo;intérêt d&rsquo;un contenu de qualité).</p>
<h3>Le contenu</h3>
<p>Selon votre produit, vous pouvez produire du texte, des photos, des bandes sonores, des vidéos. Dans ce dernier cas, créez un compte Youtube et publiez vos vidéos sur youtube, vous les lieerez ensuite à votre page.</p>
<p>Pour les images, vous pouvez utiliser un compte Flickr (ou autre), ou bien directement intégrer les photos dans Facebook (en utilisant comme il faut les identifications).</p>
<p>Soyez patients, cela prendra du temps; mais, en quelques semaines, vous serez visible sur Google, vous aurez un grand nombre de spectateurs, abonnés ou non, et il suffira de peu de contenus exceptionnels pour franchir la barrière.</p>
<h3>Mon exemple</h3>
<p>Sur ma <a title="page WarpOut" href="http://www.facebook.com/com.aelif.warpout" target="_blank">page WarpOut</a>, j&rsquo;ai décidé de ne pas parler du jeu, ou presque pas. Mais d&rsquo;y faire constamment référence. Voici, en images, ce que cela peut donner :</p>
<p>Premier cas — la fausse pub qui tombe bien, niveau actualités</p>
<p><a href="http://www.facebook.com/com.aelif.warpout"><img class="aligncenter size-full wp-image-476" title="La fausse pub iPhone 5" src="http://www.lemondedudev.com/wp-content/uploads/2012/09/pub_wo_15.png" alt="La fausse pub iPhone 5" width="600" height="339" /></a></p>
<p>Deuxième cas — la fausse pub qui tombe bien, niveau culture pop (attention, toutefois, la référence réduit clairement votre cible)</p>
<p style="text-align: center;"><a href="http://www.facebook.com/com.aelif.warpout"><img class="aligncenter  wp-image-478" title="La fausse pub Big bang theory" src="http://www.lemondedudev.com/wp-content/uploads/2012/09/pub_wo_9.png" alt="La fausse pub Big bang theory" width="640" height="376" /></a></p>
<p>&nbsp;</p>
<p>Troisième cas — la fausse pub qui tombe bien, parce qu&rsquo;elle tombe bien partout où elle tombe</p>
<p style="text-align: center;"><a href="http://www.facebook.com/com.aelif.warpout"><img class="aligncenter  wp-image-477" title="La fausse pub Blake Lively" src="http://www.lemondedudev.com/wp-content/uploads/2012/09/pub_wo_13-1024x640.png" alt="La fausse pub Blake Lively" width="614" height="384" /></a></p>
<p>&nbsp;</p>
<h3>Autre chose ?</h3>
<p>Beaucoup d&rsquo;autres choses : n&rsquo;oubliez jamais le lien, soit vers votre page (idéalement), soit vers l&rsquo;appli (notamment si vous pensez que les ventes pourront être directement réalisées).</p>
<p>Ensuite, créez un compte twitter spécifiquement pour votre produit ( ex : twitter.com/warpout1 ) et liez le contenu de votre page Facebook à ce compte; ça prend une minute.<br />
Puis abonnez ce compte au maximum de comptes twitters liés à votre produit que ce soit (ça prend plus qu&rsquo;une minute), mais attention à ne pas vous abonner à des comptes inactifs depuis 3 ans, ou bien des comptes à 3 followers&#8230;</p>
<p>&nbsp;</p>
<p>Si avec tout ça vous n&rsquo;êtes pas encore abonnés à ma page, c&rsquo;est que je ne sais pas du tout de quoi je parle.</p>
<h3>Addendum de dernière minute&#8230;</h3>
<p>Si votre produit est une appli mobile (comme c&rsquo;est le cas pour mon WarpOut), pensez à intégrer les fonctionnalités socialisantes :</p>
<ul>
<li>le Game Center donne de la visibilité dans le monde entier (il y a partout des gamers fous dont le seul but dans la vie semble être de battre tous les records de tous les jeux);</li>
<li>Facebook, encore une fois, est un formidable vecteur : permettez à vos utilisateurs de voir, parmi leurs amis, ceux qui jouent au même jeu, de comparer leur score&#8230;Offrez la possibilité aux gens d&rsquo;inviter des amis à jouer à votre jeu; au début, il ne se passera rien; mais un jour un déclic se fera (ou pas) et vous aurez enfin obtenu ce &laquo;&nbsp;&lsquo;momentum&nbsp;&raquo;.</li>
</ul>
<p>Je vous le souhaite autant qu&rsquo;à moi&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2012/09/13/la-viralite-ou-comment-seul-je-ne-peux-rien-mais-ensemble-nous-pouvons-tout/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Développer un jeu sur iPhone : WarpOut</title>
		<link>http://www.lemondedudev.com/2012/09/09/developper-un-jeu-sur-iphone-warpout/</link>
		<comments>http://www.lemondedudev.com/2012/09/09/developper-un-jeu-sur-iphone-warpout/#comments</comments>
		<pubDate>Sun, 09 Sep 2012 16:25:20 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[iPad (bref : iOS)]]></category>
		<category><![CDATA[Méthodologie]]></category>
		<category><![CDATA[TIML]]></category>
		<category><![CDATA[blocks]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[cocos2d]]></category>
		<category><![CDATA[coo]]></category>
		<category><![CDATA[dynamique]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[game center]]></category>
		<category><![CDATA[gamecenter]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[ipod touch]]></category>
		<category><![CDATA[jeu]]></category>
		<category><![CDATA[leaderboard]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[open graph]]></category>
		<category><![CDATA[original]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[puzzle]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[WarpOut]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=468</guid>
		<description><![CDATA[Voilà un certain temps que je restais muet&#8230;Qu&#8217;est-ce que je peux bien dire à ma décharge, cher lecteur ? Je bosse, je n&#8217;arrête pas de bosser, et quand par miracle j&#8217;ai une minute de libre, un nouveau projet arrive (ce qui, par les temps qui courent, est — je vous l&#8217;assure — un miracle). Ceci [...]]]></description>
				<content:encoded><![CDATA[<p><img src='http://www.lemondedudev.com/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=/wp-content/thumbnails/468.png&amp;w=200&amp;h=150&amp;zc=1&amp;ft=jpg' alt='post thumbnail' /></p>
<p>Voilà un certain temps que je restais muet&#8230;Qu&rsquo;est-ce que je peux bien dire à ma décharge, cher lecteur ? Je bosse, je n&rsquo;arrête pas de bosser, et quand par miracle j&rsquo;ai une minute de libre, un nouveau projet arrive (ce qui, par les temps qui courent, est — je vous l&rsquo;assure — un miracle). Ceci étant, je me suis permis quelques jours (quelques parties de nuits, pour être parfaitement exact) de liberté, et j&rsquo;en ai profité pour assouvir un vieux rêve : créer un jeu pour iPhone.</p>
<p>Et voilà ! WarpOut, le premier jeu iPhone de la maison Aelif est désormais disponible sur l&rsquo;App Store (d&rsquo;ailleurs, je le prouve grâce au &laquo;&nbsp;badge App Store&nbsp;&raquo; de circonstance)</p>
<p>&nbsp;</p>
<p><a href="http://itunes.com/apps/aelif/warpout"><img class="aligncenter size-full wp-image-469" title="appstore_badge" src="http://www.lemondedudev.com/wp-content/uploads/2012/09/appstore_badge.png" alt="WarpOut Disponible sur l'App Store" width="300" height="101" /></a></p>
<p>&nbsp;</p>
<p>WarpOut est un jeu de blocs comme plein d&rsquo;autres, mais pas comme les autres. Comme plein d&rsquo;autres, en effet (à l&rsquo;instar de Bejeweled, Diamond dash, iGem, etc.), il y a des blocs, dans une grille, et il convient de les faire disparaître (en les reliant, en les alignant, etc.).</p>
<p><span id="more-468"></span>Mais WarpOut se distingue par son gameplay innovant (j&rsquo;en ai bien ch*é comme il faut niveau algorithme, mais le résultat y est): en effet, au lieu d&rsquo;être statiques, les blocs orbitent autour du centre de la grille, d&rsquo;où émanent constamment de nouveaux blocs. Pour l&rsquo;instant, il existe deux modes de jeux, le mode classique ( tant que tu tiens, tu mets des points ) et un mode puzzle, le tout en français, anglais et chinois (traditionnel et simplifié&#8230;évidemment !!).</p>
<p>Je prépare en ce moment même la version 1.2 (avec Game Center, Facebook, et de nouveaux puzzles).</p>
<p>Je ferai un post prochainement sur (je n&rsquo;ai pas encore décidé, donc n&rsquo;hésitez pas à proposer) :</p>
<ul>
<li>l&rsquo;intégration GameCenter avec Leaderboard (les meilleurs scores dans le monde);</li>
<li>l&rsquo;intégration Facebook (comment mon appli communique avec FB pour récupérer la liste des amis du joueur qui jouent au jeu et partager les scores, mais également poster sur le mur du joueur à quel point il est un nolife gamer);</li>
<li>l&rsquo;intégration multilingue A à Z pour iOS 5 (et supérieur);</li>
<li>l&rsquo;utilisation d&rsquo;un framework (pour ne pas réinventer la roue, autant avoir une voiture).</li>
</ul>
<p>En attendant, je vous invite à aller découvrir le jeu et, s&rsquo;il vous plaît (enfin&#8230;si le jeu vous plaît), à en parler autour de vous et, pourquoi pas, à le noter sur iTunes. Pour le coup, cela relève plus de l&rsquo;expérience qu&rsquo;autre chose, mais je cherche toujours les ingrédients de la viralité et, ma théorie actuelle, c&rsquo;est que cela relève, du moins dans les premiers temps, d&rsquo;un engagement de quelques uns.</p>
<p>À ce sujet, faites-vous plaisir et allez regarder cette vidéo sur TED.com <a title="&quot;Comment lancer un mouvement&quot;" href="http://www.ted.com/talks/lang/en/derek_sivers_how_to_start_a_movement.html" target="_blank">&laquo;&nbsp;Comment lancer un mouvement&nbsp;&raquo;</a> (il y a des sous-titres en français, ainsi qu&rsquo;en plein d&rsquo;autres langues)&#8230;il faut encore que je comprenne ce qui amène au &laquo;&nbsp;Momentum&nbsp;&raquo;, au point de bascule, par exemple entre le blog suivi par 3 personnes pendant un mois et le blog suivi par 100 personnes depuis plus d&rsquo;un an; entre l&rsquo;appli qui est achetée à 200 exemplaires sur deux semaines, puis plus rien, et l&rsquo;appli qui est téléchargée 200 fois par semaines depuis des mois.</p>
<p>J&rsquo;ai déjà quelques idées, mais on s&rsquo;éloigne de la technique et on rentre dans le marketing&#8230;en quelque sorte&#8230;mais je pense que nous autres &laquo;&nbsp;techniciens&nbsp;&raquo; savons utiliser les outils lorsqu&rsquo;on comprend comment ils fonctionnent&#8230;</p>
<p>Peace out, pour le moment</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2012/09/09/developper-un-jeu-sur-iphone-warpout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bonne année 2012</title>
		<link>http://www.lemondedudev.com/2012/01/03/bonne-annee-2012/</link>
		<comments>http://www.lemondedudev.com/2012/01/03/bonne-annee-2012/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 11:23:14 +0000</pubDate>
		<dc:creator>bruce</dc:creator>
				<category><![CDATA[TIML]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=462</guid>
		<description><![CDATA[Tout est dans le titre, ou presque. Désolé pour les abonnés RSS qui, voyant une nouveauté sur le site sont d&#8217;un coup devenus complètement fébriles à l&#8217;idée d&#8217;un nouvel article (&#171;&#160;quoi ? enfin ! pas trop tôt ! mon cerveau crie famine&#8230;&#160;&#187; et ce genre de choses), car ce n&#8217;est pas pour tout de suite [...]]]></description>
				<content:encoded><![CDATA[<p>Tout est dans le titre, ou presque. Désolé pour les abonnés RSS qui, voyant une nouveauté sur le site sont d&rsquo;un coup devenus complètement fébriles à l&rsquo;idée d&rsquo;un nouvel article (&laquo;&nbsp;quoi ? enfin ! pas trop tôt ! mon cerveau crie famine&#8230;&nbsp;&raquo; et ce genre de choses), car ce n&rsquo;est pas pour tout de suite (mais bientôt, c&rsquo;est promis; il faut juste que je trouve un peu de temps pour cela).</p>
<p>Je vous souhaite donc une excellente année 2012 (sauf si vous êtes un gros connard, cela va de soi) ainsi que le succès dans vos différents projets (sauf si nous sommes concurrents, cela va de soi), et profitez-en bien surtout, car il semble que la fin de l&rsquo;année 2012 marquera également la fin du monde&#8230;je l&rsquo;ai lu sur internet et vu à la télé, donc cela doit forcément être vrai&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2012/01/03/bonne-annee-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pourquoi Qt est cool ?</title>
		<link>http://www.lemondedudev.com/2011/10/16/pourquoi-qt-est-cool/</link>
		<comments>http://www.lemondedudev.com/2011/10/16/pourquoi-qt-est-cool/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 19:17:13 +0000</pubDate>
		<dc:creator>GreG</dc:creator>
				<category><![CDATA[COO / POO]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[graphic]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[implicit]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[signaux]]></category>
		<category><![CDATA[sinal]]></category>
		<category><![CDATA[slot]]></category>
		<category><![CDATA[toolkit]]></category>

		<guid isPermaLink="false">http://www.lemondedudev.com/?p=440</guid>
		<description><![CDATA[J&#8217;ai découvert Qt en tant que développeur il y a un peu plus d&#8217;un an et je voudrais partager avec vous les meilleurs moments lorsqu&#8217;on le découvre, un peu comme si je voulais vous donner envie d&#8217;essayer vous aussi&#8230; 1. Les signaux et les slots: tisser les appels de méthode dynamiquement à l&#8217;exécution Les objets [...]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai découvert <a href="http://qt.nokia.com">Qt</a> en tant que développeur il y a un peu plus d&rsquo;un an et je voudrais partager avec vous les meilleurs moments lorsqu&rsquo;on le découvre, un peu comme si je voulais vous donner envie d&rsquo;essayer vous aussi&#8230;<br />
<span id="more-440"></span><br />
<h4 style="padding-left: 30px;">1. Les signaux et les slots: tisser les appels de méthode dynamiquement à l&rsquo;exécution</h4>
<p>Les objets peuvent émettre des <em>signaux</em> qui ressemblent furieusement à des appels de méthode, mais dont on ne connaît pas le destinataire. Et les objets peuvent également porter des <em>slots</em> qui sont des méthodes particulières qui peuvent être <em>connectées</em> à des signaux. Cette connexion peut se faire soit à la souris dans l&rsquo;IDE si les objets concernés sont des widgets graphiques, soit programmatiquement avec une méthode qui s&rsquo;appelle <em>connect</em>. La cardinalité des connexions est bien sûr n-m, c&rsquo;est-à-dire qu&rsquo;un même signal peut être connecté un nombre quelconque de slots et qu&rsquo;un slot peut-être connecté à un nombre quelconque de signaux.</p>
<p>C&rsquo;est évidemment très pratique en matière d&rsquo;interface graphique (un bouton émet le signal clicked que l&rsquo;on peut connecter à ce qu&rsquo;on veut, etc.) mais c&rsquo;est au moins aussi pratique pour des tas d&rsquo;objets non visuels. Par exemple Qt fournit une classe qui s&rsquo;appelle QNetworkAccessManager et qui permet en quelques lignes de code de faire des requêtes HTTP de façon asynchrone et d&rsquo;être rappelé par un signal lorsque la requête est finie ou pour donner un pourcentage d&rsquo;avancement de l&rsquo;upload ou du download qui s&rsquo;en suit.</p>
<p>C&rsquo;est également très agréable pour gérer la communication entre plusieurs threads (un thread émet le signal, mais c&rsquo;est un autre qui exécute le slot) ou pour simuler un fonctionnement multithread avec le seul thread exécutant la boucle d&rsquo;événements principale: chaque slot est éxécuté à son tour, car l&rsquo;appel de slot asynchrone est un événement. C&rsquo;est de loin le modèle de communication le plus simple que je connaisse qui permette à la fois de faire des appels synchrones, et des communications multithread fonctionnant aussi bien avec des threads préemptifs et non préemptifs.</p>
<p>Pour en savoir plus c&rsquo;est ici: <a href="http://doc.qt.nokia.com/latest/signalsandslots.html">http://doc.qt.nokia.com/latest/signalsandslots.html</a> et éventuellement là: <a href="http://doc.qt.nokia.com/latest/qnetworkaccessmanager.html">http://doc.qt.nokia.com/latest/qnetworkaccessmanager.html</a></p>
<h4 style="padding-left: 30px;">2. La réflexivité et le Méta-objet</h4>
<p>On vient de parler des signaux et des slots, évidemment ils ne sont pas mus par magie et bien sûr vous vous demandiez en me lisant: comment donc les connexions peuvent-elles être dynamiques à l&rsquo;exécution alors que C++ est un langage compilé?</p>
<p>Point de sorcellerie. Qt arrive avec un modèle dit de méta-objet qui est proche de la réflexivité Java et stocke sous forme de chaîne de caractères les signatures des méthodes appelables dynamiquement (notamment les slots), pour les objets identifiés comme pouvant porter de telles méthodes (toutes les classes héritant de QObject). Et cette couche basse est directement utilisable: même sans signaux et sans slots il est possible d&rsquo;appeler une méthode à partir de son nom dans une chaîne de caractère. Pour passer un callback c&rsquo;est très plaisant. Et bien sûr l&rsquo;appel peut-être asynchrone (cf. mon exposé précédent sur la communication entre threads).</p>
<p>Pour en savoir plus, le point de départ est ici: <a href="http://doc.qt.nokia.com/latest/qmetaobject.html#invokeMethod">http://doc.qt.nokia.com/latest/qmetaobject.html#invokeMethod</a></p>
<h4 style="padding-left: 30px;">3. Une bibliothèque de classes riche et très agréable</h4>
<p>Là on est à la limite de l&rsquo;esthétique, je le reconnais, mais les classes Qt sont extrêmement agréable à utiliser. Beaucoup moins théoriquement belles que les classes Java par exemple mais beaucoup plus pragmatiques. Un seul exemple:</p>
<p>Les collections sont un vrai plaisir à utiliser (notamment grâce à l&rsquo;implicit sharing, voir point suivant), mais un peu déroutante au début avec par exemple la QList dont le temps d&rsquo;accès en indexé est constant, juste parce qu&rsquo;en vrai ce n&rsquo;est pas une liste chaînée&#8230;</p>
<p>Plus ici: <a href="http://doc.qt.nokia.com/latest/containers.html#algorithmic-complexity">http://doc.qt.nokia.com/latest/containers.html#algorithmic-complexity</a></p>
<h4 style="padding-left: 30px;">4. L&rsquo;<em>implicit sharing</em> ou la copie gratuite d&rsquo;objets</h4>
<p>Un nombre important de classes Qt pratiquent l&rsquo;<em>implicit sharing</em>, qui n&rsquo;a rien à voir avec l&rsquo;adultère ou les parties fines, mais fait que deux copies différentes d&rsquo;un objet comme une chaîne de caractère (QString) ou une image bitmap (QImage) n&rsquo;occuperont quasiment qu&rsquo;une seule fois la place mémoire et se copieront quasi instantanément, tant qu&rsquo;aucune des deux n&rsquo;est modifiée. À la première modification en revanche il y a allocation mémoire et copie, c&rsquo;est une sorte de <em>copy-on-write</em>.</p>
<p>Ça a l&rsquo;air d&rsquo;un gadget, mais cela simplifie diablement la gestion des collections et d&rsquo;une façon générale le dilemme qui existe en C++ entre le passage d&rsquo;objet par valeur ou par référence: les objets qui pratiquent l&rsquo;<em>implicit sharing</em> peuvent être passés par valeur pour éviter que l&rsquo;appelé puisse modifier l&rsquo;original (comme ce serait le cas s&rsquo;ils étaient passés par référence) sans avoir à supporter l&rsquo;essentiel du coût mémoire et CPU de la copie.</p>
<p>Plus d&rsquo;info ici: <a href="http://doc.qt.nokia.com/latest/implicit-sharing.html">http://doc.qt.nokia.com/latest/implicit-sharing.html</a></p>
<h4 style="padding-left: 30px;">5. Qt Creator: un IDE de rêve pour le C++, avec toutes les extensions apportées par Qt</h4>
<p>L&rsquo;environnement de travail de Qt Creator est, avec mes goûts et mes exigences à moi, quasi équivalent à ce qu&rsquo;est Eclipse au monde Java (je ne parle pas des modules C++ pour Eclipse qui sont très en deçà de leurs pendant Java), en un peu moins lourd (ne nourrissez pas le troll je ne suis presque pas en train de dire que C++ est moins lourd que Java).</p>
<p>Évidemment il gère toutes les spécificités apportées par Qt au C++: complétion automatique des noms de signaux et slots dans les macros Qt, support de l&rsquo;instruction foreach pour itérer sur les collections, etc.</p>
<p>Plus d&rsquo;info et une vidéo de démonstration ici: <a href="http://qt.nokia.com/products/developer-tools/">http://qt.nokia.com/products/developer-tools/</a><a href="http://qt.nokia.com/"><br />
</a></p>
<h4 style="padding-left: 30px;">6. QGraphicsView: un framework de dessin 2D multi-vues clefs en main<strong></strong><span style="text-decoration: underline;"><strong><br />
</strong></span></h4>
<p>Je ne parlerai qu&rsquo;un tout petit bout de la bibliothèque de widgets graphiques: le framework de dessin 2D qui tourne autour de la QGraphicsView.</p>
<p>Version courte: on peut mettre n&rsquo;importe quel objet 2D (un <em>item</em>) dans une <em>scene</em> et visualiser cette <em>scene</em> dans un nombre quelconque de <em>views</em>. On peut avoir plusieurs <em>scenes</em> mais ce sont des mondes séparés sans aucun partage d&rsquo;<em>items</em>. Les <em>items</em> de base sont des rectangles, ellipses, bitmaps, etc. mais il est très facile de faire son propre <em>item</em>. Le fonctionnement de base de la <em>view</em> permet à l&rsquo;utilisateur d’interagir en sélectionnant déplaçant, etc. les <em>items</em> sans aucune ligne de code, à tel point que l&rsquo;un des exemples livrés avec Qt est un Visio-like (ou du moins un Dia-like) de seulement quelques centaines de lignes de code.</p>
<p>Il paraît aussi que le modèle scale à plusieurs dizaines de milliers d&rsquo;<em>items</em>. Je n&rsquo;ai pas essayé, mais avec les précautions prises (stocker les items dans un BTree&#8230;) et les références commerciales (Walt Disney, industrie aéronautique&#8230;) je veux bien le croire. En tout cas pour quelques dizaines d&rsquo;items c&rsquo;est le pied.</p>
<p>Plus d&rsquo;info ici: <a href="http://doc.qt.nokia.com/latest/graphicsview.html">http://doc.qt.nokia.com/latest/graphicsview.html</a></p>
<h4 style="padding-left: 30px;">7. Les deux évidences: un toolkit GUI riche et une portabilité exemplaire</h4>
<p>Je le garde pour la fin car ce sont les deux points forts de Qt, tellement évidents qu&rsquo;il n&rsquo;en sont pas amusants: le toolkit graphique de base est très riche (je veux dire en dehors de QGraphicsViews dont je viens de parler mais qui n&rsquo;est qu&rsquo;un détail) et la portabilité sur Windows, Linux, MacOSX, et les systèmes embarqués Nokia est exemplaire. Il paraît qu&rsquo;on peut aussi l&rsquo;utiliser sur d&rsquo;autres plateformes (Unix propriétaires, Android, etc.) mais je ne crois pas qu&rsquo;il soit possible d&rsquo;acheter du support pour cela, donc c&rsquo;est un peu l&rsquo;aventure, et je ne l&rsquo;ai pas tentée.</p>
<h4 style="padding-left: 30px;">8. Installation en deux clics</h4>
<p>Sur la page d&rsquo;accueil de Qt (<a href="http://qt.nokia.com/">http://qt.nokia.com/</a>) il y a un gros bouton download, ensuite c&rsquo;est setup.exe sous Windows et équivalents sous Linux et Mac OS X. Et sinon n&rsquo;importe quelle distribution Linux décente package Qt Creator et ses dépendances.</p>
<p>Donc vous n&rsquo;avez aucune excuse pour continuer à lire ce billet plutôt que d&rsquo;aller installer l’environnement de développement Qt.</p>
<h4 style="padding-left: 30px;">9. Les sujets que-je-n-aborderai-pas-faute-de-place-pourtant-j-en-avais-envie</h4>
<p>En vrac, si vous n&rsquo;êtes pas encore convaincus: le système de traduction est nickel pour permettre de séparer le cycle de développement du cycle de traduction; tout est disponible entre triple licence GPL, LGPL ou commerciale; c&rsquo;est made in Europe; on peut utiliser Qt avec d&rsquo;autres langage que C++ (il existe des bindings Python et Java, notamment) mais moi j&rsquo;aime le C++ (au moins avec Qt); il y a des classes de bases très décentes pour gérer facilement des accès aux bases de données SQL et le multithread; le modèle <em>model-view</em> des widgets pour collections (QListView, QTreeView, etc.) est bien pratique une fois qu&rsquo;on a fait l&rsquo;effort de le comprendre et les versions simplifiées pour développeur pressés des mêmes widgets évitent le nœud de neurones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lemondedudev.com/2011/10/16/pourquoi-qt-est-cool/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
