<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Spécialisé dans la conception d’interfaces utilisateur (Développement et Graphisme), je me suis beaucoup intéressé aux bonnes pratiques d’ergonomie et d’accessibilité dans le respect des standards.

Warry.fr</description><title>Warry</title><generator>Tumblr (3.0; @warry)</generator><link>http://iam.warry.fr/</link><item><title>Présentation faite lors de l’évènement Zengularity le 9...</title><description>&lt;iframe src="http://player.vimeo.com/video/20068393" width="400" height="300" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Présentation faite lors de l’évènement Zengularity le 9 février.&lt;/p&gt;</description><link>http://iam.warry.fr/post/3348809144</link><guid>http://iam.warry.fr/post/3348809144</guid><pubDate>Thu, 17 Feb 2011 21:27:41 +0100</pubDate></item><item><title>Développeurs PHP: démarrez un nouveau projet sous Java/Play!framework</title><description>&lt;p&gt;Cet article est une réponse à &lt;a href="http://apluggedinlife.com/fr/2011/02/16/developpeurs-php-demarrer-project-python-django/"&gt;celui&lt;/a&gt; de &lt;a href="http://twitter.com/#!/thoas"&gt;Florent Messa&lt;/a&gt; qui abordait l’opportunité offerte par l’arrivée de PHP 5.3, pour découvrir et adopter d’autres langages et frameworks. Il propose une comparaison entre Django, Symfony et Zend. Pour ma part je vais, sur les mêmes critères, me concentrer sur &lt;a href="http://www.playframework.org/"&gt;Play! Framework&lt;/a&gt;, bien que je ne connaisse pas ce framework sur le bout des doigts.&lt;/p&gt;
&lt;p&gt;Play! est un framework relativement jeune en version 1.1, codé en Java et compatible avec &lt;a href="http://www.playframework.org/modules/scala"&gt;Scala&lt;/a&gt;. Il a la particularité, par rapport aux autres frameworks Java, d’être complètement stateless, autoriser le rechargement à chaud (sans re-compilation), et de cibler les architectures REST. C’est en somme un RoR/Django like en Java. Et cocorico, il est français, initié et maintenu par &lt;a href="http://github.com/playframework/play"&gt;Guillaume Bort et  la communauté&lt;/a&gt;.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;em&gt;notes:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Dans Play! les modules sont eux-même des applications Play! Ils s’installent à l’aide de la commande “play install module-name-version”&lt;/li&gt;
&lt;li&gt;Les Samples sont disponibles dans le répertoire &lt;a href="https://github.com/playframework/play/tree/master/samples-and-tests"&gt;samples-and-test&lt;/a&gt; de Play! et sont des exemples des fonctionnalités les plus répandues à travers des exemples concrets (blog, forum, jobboard…).&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Fonctionnalités&lt;/h2&gt;
&lt;p&gt;Comme Florent, je vais détailler l’utilisation de fonctionnalités dans Play!Framework, en réponse à des besoins très basiques, voire récurrents.&lt;/p&gt;
&lt;h3&gt;1. La gestion de mots clés (tags)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : taguer n’importe quel type de ressources : article, commentaire, lien, vidéo, etc.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il n’existe pas de module Play! pour les tags, mais il est extrêmement simple de le créer grâce aux annotations JPA. D’ailleurs, une implémentation est disponible dans les samples de Play! (celui de &lt;a href="https://github.com/playframework/play/blob/master/samples-and-tests/yabe/app/models/Post.java#L31"&gt;Yabe&lt;/a&gt; plus précisément).&lt;/p&gt;
&lt;h3&gt;2. Recherche full-text&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : effectuer une recherche sur l’ensemble du contenu et des ressources de l’application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le module &lt;a href="http://www.playframework.org/modules/search"&gt;Search&lt;/a&gt; permet de faire de la recherche full texte en base. Et &lt;a href="https://github.com/grandfatha/play-solr"&gt;ce module&lt;/a&gt; permet de s’interconnecter avec Solr.&lt;/p&gt;
&lt;h3&gt;3. Gestion des utilisateurs&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : offrir un système complet d’authentification (connexion, déconnexion, validation du compte utilisateur, récupération du mot de passe, etc.), de gestion de groupes d’utilisateurs et de permission.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il y a l’application &lt;a href="https://github.com/schaloner/deadbolt"&gt;Deadbold&lt;/a&gt; sur Github, ainsi que certains samples (Yabe, Jobbard…) qui démontrent différentes interprétations de l’authentification. Il y a d’autres exemples, l’authentification est un thème récurrent.&lt;/p&gt;
&lt;h3&gt;4. Interconnexion avec d’autres plateformes sociales&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : se connecter via des applications tierces et pouvoir partager des liens vers celles-ci.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L’authentification HTTP (pratique pour bootstraper un projet) et OpenID sont build-in. Il existe également plusieurs module pour l’authentification dont &lt;a href="http://www.playframework.org/modules/oauth"&gt;OAuth&lt;/a&gt;, &lt;a href="http://www.playframework.org/modules/fbconnect"&gt;Facebook connect&lt;/a&gt; et un &lt;a href="https://github.com/playframework/play/tree/master/samples-and-tests/facebook-oauth2"&gt;sample pour Facebook&lt;/a&gt;. &lt;/p&gt;
&lt;h3&gt;5. Ajouter des commentaires&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : commenter n’importe quel type de ressource (article, vidéo, etc.) et modérer&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Idem que pour les tags, démontré dans le sample Yabe.&lt;/p&gt;
&lt;h3&gt;6. Gestion d’avatars&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : permettre à l’utilisateur de télécharger un avatar personnel afin de l’affecter à son compte ou utiliser un système décentralisé comme Gravatar.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Non développé, mais la manipulation des images est simple et expliquée dans &lt;a href="http://www.touilleur-express.fr/2010/11/05/play-framework-uploader-une-image/"&gt;cet article&lt;/a&gt;. Pour Gravatar il y a &lt;a href="https://github.com/mzehrer/play-gravatar"&gt;ce module&lt;/a&gt; qui existe déjà.&lt;/p&gt;
&lt;h2&gt;Spécificités pour les développeurs&lt;/h2&gt;
&lt;h3&gt;1. Intégration des tests unitaires et tests fonctionnels&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : tester toute l’application afin de rajouter des fonctionnalités sans pour autant avoir peur de casser l’existant.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Les tests unitaires et fonctionnels sont accessibles (build-in) via la commande “&lt;a href="http://www.playframework.org/documentation/1.1.1/test"&gt;play test&lt;/a&gt;”, et utilisent &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;. A noter également la possibilité de faire tourner des tests selenium dans votre browser (en mode DEV: mon-site/@test), et affiche en temps réel les echecs et réussites.&lt;/p&gt;
&lt;h3&gt;2. Héritage dans les templates (template inheritance)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : définir un template de base que l’on va hériter comme dans un contexte de programmation orientée objet. Ainsi, on affecte à son template des blocks qui peuvent être surchargés dans les templates enfants. Grâce à cette fonctionnalité, les intégrateurs peuvent préparer plusieurs templates de base pour hiérarchiser leurs layouts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le &lt;a href="http://www.playframework.org/documentation/1.1.1/templates#inheritance"&gt;moteur de templates par défaut&lt;/a&gt; ressemble assez à celui de Django et bénéficie de l’héritage. Il existe d’autre moteurs que vous pouvez découvrir (&lt;a href="http://www.playframework.org/modules/mustache"&gt;Mustache&lt;/a&gt;, basé sur le moteur Javascript du même nom, ou &lt;a href="http://www.playframework.org/modules/scalate"&gt;Scalate&lt;/a&gt; en scala).&lt;/p&gt;
&lt;h3&gt;3. Minification automatique des fichiers statiques (CSS/JS) sur un serveur tiers dédié&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Besoin : compresser des fichiers statiques afin de réduire les requêtes HTTP et diminuer le temps de chargement de la page, les télécharger à la volée sur un serveur tiers dédié à cet usage afin de ne pas surcharger le serveur web principal et offrir une réactivité plus importante côté client (performance).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fonctionnalités offertes par le module &lt;a href="http://www.playframework.org/modules/greenscript"&gt;greenscript&lt;/a&gt;, bien qu’il ne semble pas y avoir la fonctionnalité de l’hébergement sur un serveur tiers, mais seulement la minification.&lt;/p&gt;
&lt;h2&gt;Courbe d’apprentissage&lt;/h2&gt;
&lt;p&gt;Dans le contexte d’un switch d’un langage ou framework vers un autre, la courbe d’apprentissage est un critère primordial, et certainement la plus grosse barrière pour une adoption massive de Python ou Ruby.&lt;/p&gt;
&lt;h3&gt;Points positifs :&lt;/h3&gt;
&lt;p&gt;Play! est en Java, donc la syntaxe est extrêmement simple et connue, basé sur C++ donc proche de PHP, avec un modèle objet également assez proche. Il est aussi compatible &lt;a href="http://www.playframework.org/modules/scala"&gt;Scala&lt;/a&gt; pour ceux qui préfèrent les langages plus fonctionnels. Pour ceux qui ne connaissent pas, Scala est un langage qui est compatible avec la JVM, mais qui ressemble beaucoup plus à Ruby à la fois dans la syntaxe et dans la philosophie.&lt;/p&gt;
&lt;p&gt;La philosophie même du framework tend vers un maximum de simplicité (peu de configuration), et de souplesse (tout est facultatif, sauf les controlleurs). Par exemple, tout fonctionne out-of-the box, et le déploiement se fait aussi simplement qu’en PHP, directement avec le serveur Apache Mina &lt;a href="http://news.ycombinator.com/item?id=1380405"&gt;intégré à Play&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Play! est full MVC et a été conçu pour faire du vrai Web (REST, XHR, WebSockets…), et très orienté mashups.&lt;/p&gt;
&lt;p&gt;Play! utilise par défaut Hibernate et JPA pour la persistance des données. Doctrine utilisant les annotations JPA, si vous connaissez Doctrine: vous connaissez Play!. J’ajouterai que c’est même plus simple puisque tous les setter/getter sont facultatifs.&lt;/p&gt;
&lt;p&gt;Play! permet le rechargement à chaud des pages en mode DEV, mais est compilé en mode PROD. Cela a pour conséquences des performances significatives, si l’on compare avec PHP par exemple.&lt;/p&gt;
&lt;p&gt;Play! est compatible avec pratiquement toutes les librairies Java existantes. En fait c’est même l’essence du framework qui est principalement utilisé dans un monde Java (déployé dans des banques et assurances), il bénéficie en outre de la solidité de la JVM. J’ajouterais que ce framework est jeune, mais est une compilation de plusieurs librairies très éprouvées (Hibernate, Sienna, Apache Mina…). Play! ne sort pas de nul part. Il est même possible d’exporter votre application dans un war si vous avez un Tomcat (serveur Java classique à papa), mais vous perdrez de l’intérêt du stateless.&lt;/p&gt;
&lt;h3&gt;Point négatifs :&lt;/h3&gt;
&lt;p&gt;Le framework est jeune, et la communauté, bien que grandissante, ne vaut pas celle d’un Django ou Symfony, et la documentation, comme les tutoriaux, ne sont pas abondants. De même que les modules ne sont pas très nombreux.&lt;/p&gt;
&lt;p&gt;Le langage Java, fait fuir autant qu’il attire. Or Play! utilise Java, est compatible Java, mais n’a rien à voir avec les autres frameworks Java ! Par exemple, l’utilisation d’un IDE est complètement facultative dans Play!. C’est un positionnement qui potentiellement peut plaire au gens de Java, comme au gens pures web, mais aussi le contraire.&lt;/p&gt;
&lt;p&gt;L’interrogation concernant l’acquisition de Java par Oracle ? Quel avenir pour Java ?Bien que Play! fonctionne aussi très bien avec OpenJDK.&lt;/p&gt;
&lt;p&gt;Les plateformes d’hébergement ne sont pas aussi répandues que celles pour PHP. A noter l’initiative de &lt;a href="http://playapps.net"&gt;PlayApps&lt;/a&gt; qui permet de déployer ses applications avec la commande “play playapps:deploy”.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;En conclusion, Play! est certainement le framework le plus simple d’accès, et d’apprentissage parmi tous ceux que j’ai pu tester, tout en permettant d’aller très loin. Il n’y a pas un gros socle de connaissance à obtenir (ex: connaître des dizaines de lignes commande pour générer une table…), tout se fait assez naturellement. Ceux qui viendront exclusivement de PHP auront principalement à s’approprier le langage plus que le framework (ex: nouveaux types pour les collections, pas seulement des array…).&lt;/p&gt;
&lt;p&gt;Enfin, je pense que Play! vaut largement le coup si l’on vient de PHP (Zend, Symfony, Ci…) ou du Java à papa (Spring, JBoss…), mais est-ce le cas si l’on vient de Django ou Rails ? Probablement pas. Les langages et la philosophie font que l’on rentre dans ces frameworks comme l’on rentre en religion, source de nombreux trolls. Mais au delà de cela, il y a des choses dans Play! qui pourront frustrer les développeurs qui viennent de Django ou RoR (ex: CRUD moins puissant que dans Django). Si je ne m’étais pas spécialisé dans le développement FRONT-SIDE, j’hésiterai probablement entre Play! et Django.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Voilà, je vous laisse regarder la vidéo d’intro sur le site de Play! qui montre assez bien l’esprit du framework : &lt;a href="http://www.playframework.org/"&gt;Vidéo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description><link>http://iam.warry.fr/post/3344550520</link><guid>http://iam.warry.fr/post/3344550520</guid><pubDate>Thu, 17 Feb 2011 15:11:00 +0100</pubDate><category>playframework</category><category>apil</category><category>php</category></item><item><title>Développer des WebApps sur iPhone - Etape 2</title><description>&lt;p&gt;Wah ! Du temps s’est écoulé depuis notre première étape du &lt;a href="http://iam.warry.fr/post/432748965/developper-des-webapps-sur-iphone-etape-1"&gt;tutoriel développer des webapps sur iphone&lt;/a&gt; ! Je vous avais promis une application pour l’exemple, et bien nous allons développer une webapp pour Twitter ! C’est du déjà vu mais cela reste un bon exemple.&lt;/p&gt;
&lt;p&gt;Toutes les fonctionnalités ne seront pas implémentées : nous allons nous limiter à l’affichage des twitt’s, la composition de nouveaux statuts, la recherche par mot clef, et l’affichage des messages privés. Le résultat final (pour les pressés) est &lt;a target="_blank" href="http://warry.fr/tuto/#timeline"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Pour l’étape 2, nous allons intégrer une application en HTML5/CSS3 et découvrir les nouveaux sélecteurs, les dégradés, les animations… En prenant soin de ne pas y ajouter une seule ligne de Javascript pour le moment. Voici les maquettes que nous allons intégrer :&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l5r746Jzv11qa49ug.png"/&gt;&lt;/p&gt;
&lt;p&gt;Pour information, la taille des applications iphone sont &lt;code&gt;320x460&lt;/code&gt; en mode portrait (&lt;code&gt;480x300&lt;/code&gt; en paysage) soit la résolution de l’iphone moins les 20 pixels de la barre de statut.&lt;/p&gt;
&lt;h2&gt;1. Le HTML&lt;/h2&gt;
&lt;p&gt;La structure est la même que pour un site web, avec un doctype HTML5 :&lt;/p&gt;
&lt;pre&gt;&lt;!DOCTYPE html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Hotwitt'&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
	&lt;/body&gt;
&lt;/html&gt;&lt;/pre&gt;
&lt;p&gt;On y ajoute également les meta-tags que nous avions vu la dernière fois dans le &lt;code&gt;&lt;head/&gt;&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/&gt;
&lt;meta name="apple-mobile-web-app-capable" content="yes" /&gt;
&lt;meta name="apple-mobile-web-app-status-bar-style" content="black" /&gt;
&lt;link rel="apple-touch-startup-image" href="images/startup.png"&gt;  
&lt;link rel="apple-touch-icon-precomposed" href="/images/icon.png"/&gt;&lt;/pre&gt;
&lt;p&gt;Pour palier au fait que &lt;code&gt;position:fixed&lt;/code&gt; n’existe pas sur l’iPhone, on doit procéder comme si on devait utiliser une div avec un &lt;code&gt;overflow:auto&lt;/code&gt;, avec un “wrapper” (enveloppe en français) et un “groupe de pages” :&lt;/p&gt;
&lt;pre&gt;&lt;div id="wrapper"&gt;
	&lt;div id="pages"&gt;
		&lt;section id="timeline"&gt;
		&lt;/section&gt;
		&lt;section id="messages"&gt;
		&lt;/section&gt;
		&lt;section id="search"&gt;
		&lt;/section&gt;
		&lt;section id="account"&gt;
		&lt;/section&gt;
	&lt;/div&gt;
&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;Je place la balise du formulaire d’ajout avant ce wrapper afin de pouvoir le faire apparaitre au-dessus avec un comportement indépendant :&lt;/p&gt;
&lt;pre&gt;&lt;form id="compose"&gt;
	&lt;textarea id="content"&gt;&lt;/textarea&gt;
	&lt;button id="cancel"&gt;Cancel&lt;/button&gt;
	&lt;label id="chars-left"&gt;140&lt;/label&gt;
&lt;/form&gt;&lt;/pre&gt;
&lt;p&gt;A propos des formulaires justement, il y a de nouveaux attributs disponibles pour les balises input (entre autres), comme le &lt;code&gt;placeholder&lt;/code&gt; qui permet d’afficher une valeur par défaut aux champs. La liste de toutes ces nouveautés est &lt;a target="_blank" href="http://www.yourinspirationweb.com/en/the-future-of-the-web-how-well-create-forms-in-html5/"&gt;disponible ici&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Pour le champ de recherche j’utilise un champ de type “search” et pour le compte un champ type “email” avec l’auto-capitalisation et la correction orthographique désactivés :&lt;/p&gt;
&lt;pre&gt;&lt;input type="text" id="keywords" placeholder="Keywords" autocorrect="off" autocapitalize="off" /&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;input type="email" id="login" placeholder="Email or login" autocorrect="off" autocapitalize="off" /&gt;
&lt;input type="password" id="password" placeholder="Password" autocorrect="off" autocapitalize="off" /&gt;&lt;/pre&gt;
&lt;p&gt;Pour afficher chaque twitt j’utilise des listes de définitions, parce que c’est ma lubie, mais vous pouvez utiliser ce que vous voulez. La balise &lt;code&gt;&lt;time/&gt;&lt;/code&gt; est également mise à contribution pour afficher les dates :&lt;/p&gt;
&lt;pre&gt;&lt;dl&gt;
	&lt;dt&gt;&lt;img src="avatar.png" /&gt;somebody&lt;/dt&gt;
	&lt;dd class="time"&gt;&lt;time datetime="2010-07-17T05:00-12:00"&gt;5 minutes ago&lt;/time&gt;&lt;/dd&gt;
	&lt;dd class="content"&gt;lorem ipsum dolor sit amet consectetuer&lt;/dd&gt;
&lt;/dl&gt;&lt;/pre&gt;
&lt;p&gt;On crée le menu à l’aide de la balise nav (qui se comporte comme ul/ol)…&lt;/p&gt;
&lt;pre&gt;&lt;nav&gt;
	&lt;li class="active"&gt;&lt;a href="#timeline"&gt;Timeline&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#compose"&gt;Compose&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#messages"&gt;Messages&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#search"&gt;Search&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#account"&gt;Account&lt;/a&gt;&lt;/li&gt;
&lt;/nav&gt;&lt;/pre&gt;
&lt;p&gt;Et c’est fini pour le HTML (&lt;a target="_blank" href="http://warry.fr/tuto/html.html"&gt;résultat ici&lt;/a&gt;) ! C’est pas bien sorcier, donc on ne s’y attarde pas. Si vous avez besoin de précisions je vous invite à lire, si ce n’est pas déjà le cas, la première étape de ce tutoriel et &lt;a target="_blank" href="http://developer.apple.com/safari/library/codinghowtos/Mobile/UserExperience/index.html"&gt;la documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;2. Les CSS&lt;/h2&gt;
&lt;p&gt;Là on va jouer ! Je ne vais pas tout détailler mais uniquement parler des CSS3, on va partir d’une feuille de style CSS2 classique et basique dont vous pouvez admirer la beauté &lt;a target="_blank" href="http://www.warry.fr/tuto/css2.html"&gt;ici&lt;/a&gt;, et ajouter les modifications.&lt;/p&gt;
&lt;p&gt;La première chose que je fais c’est empêcher la sélection de texte intempestive par l’utilisateur, et masquer les zone active lors du touch :&lt;/p&gt;
&lt;pre&gt;body {
	-webkit-user-select: none;
	-webkit-tap-highlight-color: rgba(0,0,0,0);
}&lt;/pre&gt;
&lt;p&gt;Ensuite, il faut modifier la balise #wrapper afin que le scroll se fasse avec &lt;code&gt;overflow:auto,&lt;/code&gt; du coup sur iPhone il sera impossible de défiler en attendant le javascript.  &lt;code&gt;-webkit-box-sizing:border-box&lt;/code&gt; permet de modifier le box model pour que le width et le height inclusent le &lt;code&gt;padding&lt;/code&gt; et le &lt;code&gt;border,&lt;/code&gt; et ainsi pouvoir mettre un height 100%. En vérité c’est un attribut CSS2, mais associé aux CSS3 (&lt;a target="_blank" href="http://www.quirksmode.org/css/box.html"&gt;détails&lt;/a&gt;) :&lt;/p&gt;
&lt;pre&gt;#wrapper {
	...
	overflow: auto;
	-webkit-box-sizing: border-box;
	border-bottom: 43px solid transparent;
}&lt;/pre&gt;
&lt;p&gt;Mettons maintenant en forme le menu à l’aide des &lt;a target="_blank" href="http://webkit.org/blog/181/css-masks/"&gt;masques CSS&lt;/a&gt;. Il suffit de &lt;a target="_blank" href="http://warry.fr/tuto/images/twitts.png"&gt;créer un png&lt;/a&gt; où les zones transparentes sont cachées, et cela nous permet d’avoir des icônes de toutes les couleurs en utilisant qu’une image par icône (en changeant les background), et ils s’utilisent pratiquement comme les background :&lt;/p&gt;
&lt;pre&gt;nav a {
	...
	text-indent: -999em;
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center center;
}
nav a[href="#timeline"] {
	-webkit-mask-image: url('images/twitts.png');
}&lt;/pre&gt;
&lt;p&gt;On répète l’opération pour toutes les icônes, et pour avoir des boutons actifs avec un look d’onglets on utilise les &lt;a target="_blank" href="http://www.css3.info/preview/border-image/"&gt;border-images&lt;/a&gt; :&lt;/p&gt;
&lt;pre&gt;nav li.active {
	-webkit-border-image: url('images/button.png') 0 5 0 5 stretch stretch;
}&lt;/pre&gt;
&lt;p&gt;On ajoute des dégradés :&lt;/p&gt;
&lt;pre&gt;nav li.active a {
	background: -webkit-gradient(linear, left top, left bottom, from(#000), to(#555));
}&lt;/pre&gt;
&lt;p&gt;Ils s’utilisent en background (ou en masques) de cette façon dans webkit : &lt;code&gt;-webkit-gradient([linear ou radial], [position début]&lt;/code&gt;&lt;span&gt;, [position fin],&lt;/span&gt;&lt;code&gt; from([couleur début]), to([couleur fin])&lt;/code&gt;. Vous pouvez aussi ajouter des points d’arrêts, je vous laisse regarder la &lt;a target="_blank" href="http://www.zenelements.com/blog/css3-gradients/"&gt;documentation&lt;/a&gt; pour en savoir plus.&lt;/p&gt;
&lt;p&gt;Intéressons-nous au formulaire d’ajouts, en particulier le petit compteur de caractères restants car il va nous permettre d’aborder 3 sujets : les bords arrondis, les ombres des boites, et les ombres de texte :&lt;/p&gt;
&lt;pre&gt;#chars-left {
	...
	-webkit-box-shadow: 0 2px 2px #000;
	-webkit-border-bottom-left-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	text-shadow: 1px 1px 0px #fff;
}&lt;/pre&gt;
&lt;p&gt;Les ombres s’utilisent de la manière suivante (textes ou boites) : &lt;code&gt;[décalage horizontal] [décalage vertical] [taille du flou] [couleur]&lt;/code&gt;. Il y a aussi les ombres internes (qui ne fonctionnent pas encore sur iPhone) en ajoutant le mot-clef “inset” : &lt;code&gt;-webkit-box-shadow: inset -2px -2px 5px #000;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;N’oubliez pas, vous pouvez utiliser les couleurs rgba, c’est à dire avec la transparence : &lt;code&gt;rgba(0,0,0,.5)&lt;/code&gt; = noir à 50%.&lt;/p&gt;
&lt;p&gt;Les bords arrondis sont connus, il suffit de préciser le rayon de l’arrondis : &lt;code&gt;-webkit-border-radius: 3px;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Avec l’iPhone, il y a tout une partie des CSS qui s’envole, c’est tout ce qui touche au survol (hover) ! Plus gênant qu’autre chose cet attribut sur iPhone est géré basiquement (1ère tape = hover, 2ème tape = click). Mon conseil est donc de ne pas l’utiliser.&lt;/p&gt;
&lt;p&gt;En revanche je vous recommande le pseudo-sélecteur &lt;code&gt;:target&lt;/code&gt; afin de créer une navigation basique, en attendant le javascript. L’attribut target permet d’ajouter des styles aux div qui sont pointées dans l’url (index.html#id1 &gt; id1 — voir le html de la navigation) :&lt;/p&gt;
&lt;pre&gt;section {
	...
	display: none;
}
section:target {
	display: block;
}&lt;/pre&gt;
&lt;p&gt;Pour se la péter un peu on fait la même chose avec le formulaire d’ajout, et on y ajoute une animation :&lt;/p&gt;
&lt;pre&gt;#compose {
	...
	-webkit-transition: top 200ms linear;
}
form:target#compose {
	top: 0;
}&lt;/pre&gt;
&lt;p&gt;Les animations en CSS3 sont simples, il suffit de préciser les attributs à animer (séparés par des virgules, ou all pour indiquer tous les attributs), la durée en millisecondes (ms) ou secondes (s), et enfin la forme de l’animation (accélération, décélaration, linéaire…), &lt;a target="_blank" href="http://webkit.org/blog/138/css-animation/"&gt;Plus d’infos ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Après avoir répété toutes les actions ci-dessus aux bon endroits, on obtient le résultat est disponnible &lt;a target="_blank" href="http://warry.fr/tuto/#timeline"&gt;ici&lt;/a&gt;, vous pouvez aussi y accéder avec votre iPhone. Un Github est aussi mis en place &lt;a target="_blank" href="http://github.com/Warry/Hottwit-"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;C’est tout pour aujourd’hui ! La prochaine et dernière étape concernera la couche javascript. Nous y verrons les limitations des évènements et du scroll en détail, ainsi que des trucs plus funs comme le localstorage. A bientôt !&lt;/p&gt;
&lt;p&gt;Si vous en voulez encore voici deux petits liens :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Gradients/Gradients.html"&gt;La documentation d’Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://iphone.wikidot.com/extras"&gt;Un article qui parle de l’iPhone et HTML5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Et pour finir en beauté comme la dernière fois, sachez que ma société Zenexity (Paris 9) est actuellement à la recherche d’un webdesigner (UI-designer &amp; front developper) pour des applications web et web mobile. Contactez-moi pour plus d’informations.&lt;/p&gt;</description><link>http://iam.warry.fr/post/827792280</link><guid>http://iam.warry.fr/post/827792280</guid><pubDate>Sun, 18 Jul 2010 15:23:00 +0200</pubDate></item><item><title>La Farce.fr !</title><description>&lt;p&gt;Le site France.fr a été présenté cette semaine, avec les déboires que l’on connait : serveur incapable de supporter la charge dans un premier temps, puis audit de sécurité par la suite… Une débandade générale, et les médias internationaux s’en donnent à cœur joie. Après l’équipe de France de foot, les affaires, l’invitation de chefs d’états africains controversés au 14 juillet… le nom de notre pays est décidément mis à rudes épreuves ces derniers temps.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Revenons au site en lui même. Dès que l’on rentre sur le site, quelque chose choque : la france est franchement coupée au Nord :&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.warry.fr/farce/background2.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;Là où c’est très choquant, c’est que lorsque l’on fait une superposition avec une carte des régions, cette image s’arrête pil-poil à la limite de la région du Nord. Bon j’avoue qu’avec leur film il m’ont bien cassé les noix mais on parle d’un site qui est censé représenter la France dans le Monde, la banière du PSG en devient moins outrageante.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.warry.fr/farce/nord-coupe.png"/&gt;&lt;/p&gt;
&lt;p&gt;Et si l’on fouille un peu, on remarque que cette image s’appelle background2.jpg, regardons alors background.jpg et bam surprise plus de Bretagne !&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.warry.fr/farce/background.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;La belle affaire, depuis le temps que cela devait être officiel ! Je me suis donc donné à une petite interprétation de notre carte de France, en enlevant la Bretagne, le Nord, la Corse, le Pays Basque…&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.warry.fr/farce/farce.png"/&gt;&lt;/p&gt;
&lt;p&gt;Vous imaginez la météo la dessus ? Moi je trouve que ça roxe ! Du coup il vous faudrait un nouveau nom : la Frnce ? la Frace ? Nan je sais : la FARCE ! Moi je retourne dans ma Belle Zone Humide.&lt;/p&gt;</description><link>http://iam.warry.fr/post/823555968</link><guid>http://iam.warry.fr/post/823555968</guid><pubDate>Sat, 17 Jul 2010 14:35:00 +0200</pubDate></item><item><title>Développer des WebApps sur iPhone - Etape 1</title><description>&lt;p&gt;Depuis qu’Apple a introduit l’AppStore, la plus part d’entre nous a délaissé ce qui à l’origine était le seul moyen de développer des applications pour iPhone à savoir les WebApps. Aujourd’hui, les annonces d’emplois, de projets, les éditeurs de contenus ne jurent que par Objective-C et les applications natives. Mais pour la plus part des usages, html5 et la puissance des css3 sont largement suffisants pour construire de très bonnes applications. Et si vous souhaitez quand même profiter de la publicité offerte par l’introduction de votre app sur l’AppStore, vous pouvez toujours la mettre dans une WebView et apprécier le labyrinthe de la validation d’Apple, et la joie de payer pour un iPhone developper program (99$).&lt;/p&gt;
&lt;p&gt;Pour cette première étape, nous allons faire une rapide visite des fonctionnalités disponibles sur Webkit mobile afin de développer des WebApps qui ont tout des grandes, suivez le guide !&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2&gt;Les options spéciales d’HTML5&lt;/h2&gt;
&lt;p&gt;Pour gérer les relations avec le système, certains meta-tags sont indispensables :&lt;/p&gt;
&lt;p&gt;Sur iPhone, l’ensemble du système repose sur UTF-16, donc si vous avez des versions japonaise ou arabe, pas de problème !&lt;/p&gt;
&lt;pre&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-16"/&gt;&lt;/pre&gt;
&lt;p&gt;Ce tag permet de contraindre le zoom de votre appui. Dans l’exemple on interdit tous les zooms utilisateur :&lt;/p&gt;
&lt;pre&gt;&lt;meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/&gt;&lt;/pre&gt;
&lt;p&gt;Ici on dit au système que notre application peut tourner en dehors de Safari. Lorsque l’utilisateur ajoutera votre application à sa Home il ne vera plus les barres de Safari :&lt;/p&gt;
&lt;pre&gt;&lt;meta name="apple-mobile-web-app-capable" content="yes" /&gt;&lt;/pre&gt;
&lt;p&gt;La barre du haut est également personalisable: noir ou gris.&lt;/p&gt;
&lt;pre&gt;&lt;meta name="apple-mobile-web-app-status-bar-style" content="black" /&gt;&lt;/pre&gt;
&lt;p&gt;Pour se la jouer encore plus application native, on peut ajouter une icône et un écran de chargement, l’URL de l’icône est même détectée sur Android !&lt;/p&gt;
&lt;pre&gt;&lt;link rel="apple-touch-startup-image" href="/public/images/startup.png"&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;link rel="apple-touch-icon-precomposed" href="/public/images/icon.png"/&gt;&lt;/pre&gt;
&lt;p&gt;La plus part des nouveautés de HTML5 sont également prises en compte :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Local storage, WebSQL : conservez des données même lorsque la connexion est indisponible&lt;/li&gt;
&lt;li&gt;Les médias vidéo et audio sont pris en charge&lt;/li&gt;
&lt;li&gt;Les nouvelles balises (lien)&lt;/li&gt;
&lt;li&gt;Canvas&lt;/li&gt;
&lt;li&gt;SVG natif&lt;/li&gt;
&lt;li&gt;La géolocalisation&lt;/li&gt;
&lt;li&gt;L’accès au carnet d’adresse&lt;/li&gt;
&lt;li&gt;Orientation verticale/horizontale&lt;/li&gt;
&lt;li&gt;Des protocoles spéciaux (ex: href=”tel:+3300000000”)&lt;/li&gt;
&lt;li&gt;Des types de formulaires dédiés (types number, email, search…)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Par contre, on ne pourra pas accéder à des couches plus basses comme l’appareil photo ou les notifications.&lt;/p&gt;
&lt;h2&gt;La puissance des CSS3&lt;/h2&gt;
&lt;p&gt;Voici une liste des nouveautés de CSS3 :&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Sélecteurs&lt;/li&gt;
&lt;li&gt;Dégradés&lt;/li&gt;
&lt;li&gt;Fonds multiples&lt;/li&gt;
&lt;li&gt;Border-images&lt;/li&gt;
&lt;li&gt;Ombres (textes et boites)&lt;/li&gt;
&lt;li&gt;SVG&lt;/li&gt;
&lt;li&gt;Masques&lt;/li&gt;
&lt;li&gt;Couleurs rgba&lt;/li&gt;
&lt;li&gt;Transitions/animations CSS&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Et peut-être d’autres que j’ai oublié !&lt;/p&gt;
&lt;p&gt;Egalement deux d’attributs très utiles pour le développement iPhone :&lt;/p&gt;
&lt;pre&gt;-webkit-tap-highlight-color: rgba(0,0,0,0)&lt;/pre&gt;
&lt;p&gt;Lorsque que vous cliquez sur un élément qui a un évènement onclick, un cadre noir apparait automatiquement, cet attribut vous permet de choisir sa couleur, et de le masquer&lt;/p&gt;
&lt;pre&gt;-webkit-user-select: none&lt;/pre&gt;
&lt;p&gt;Cet attribut permet d’empêcher l’utilisateur de sélectionner du texte (ce qui arrive tout le temps, généralement par erreur).&lt;/p&gt;
&lt;p&gt;Mais tout n’es pas rose, nous allons encore le voir par la suite, il y a un truc très très très chiant : l’absence de l’attribut “position: fixed”. Cela veut dire qu’il n’est pas possible de placer des éléments immobiles type header ou footer comme on en trouve sur la plus part des applications. Et comme les iframes ou les boites avec “overflow: auto” ne se défilent qu’avec 2 doigts, et bien il faut chercher des solutions peu heureuses en javascript (la moins pire selon moi est &lt;a target="_blank" href="http://cubiq.org/scrolling-div-for-mobile-webkit-turns-3/16"&gt;iScroll&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;Le Javascript&lt;/h2&gt;
&lt;p&gt;Je ne suis pas partisant de l’utilisation de jQuery sur iPhone — lourd à charger pour des petites connexion 3G — et la fonction magique &lt;strong&gt;querrySelectorAll&lt;/strong&gt; nous permet de créer un mini framework en 50 lignes qui va nous permettre déjà de démarrer une application simple :&lt;/p&gt;
&lt;pre&gt;/* -----------------------------------------------
 * UNIVERSAL SELECTOR
 * -----------------------------------------------
 */
window.$ = HTMLElement.prototype.$ = function(selector, context) {
	if (selector == null)
		return null
	var context=context||this==window?document:this,results=context.querySelectorAll(selector),isId=/^\#[a-zA-Z]*$/;
	if (isId.test(selector) &amp;&amp; results)
		return results[0]
	else
		return results
}

/* -----------------------------------------------
 * EACH FUNCTION
 * -----------------------------------------------
 */
var each = function(c) {
	for(var i=0; i&lt;this.length; i++)
		c(this[i], i);
}
Array.prototype.each = each
NodeList.prototype.each = each

/* -----------------------------------------------
 * GET JSON
 * -----------------------------------------------
 */
var getJson = function(url, callback) {
	var url = url, callback = callback, request = new XMLHttpRequest()
	request.open("GET", url, true)
	request.addEventListener('readystatechange', function(e){
		if (this.readyState==4 &amp;&amp; this.status=="200")
			callback(eval(this.responseXML))
	})
	request.send()
}

/* -----------------------------------------------
 * GETTER/SETTER FOR CSS
 * -----------------------------------------------
 */
var css = function(prop, value) {
	if (value)
		this.style.setProperty(prop, value)
	else
		return window.getComputedStyle(this, null)[prop]
}
HTMLElement.prototype.css = css;&lt;/pre&gt;
&lt;p&gt;L’autre gros problème sur iPhone en plus du scroll, ce sont les évènements focus/blur qui sont bridés. En effet, on ne peut pas les récupérer en dehors d’un évènement click. Cela veut dire qu’il est très complexe de pouvoir gérer l’affichage/masquage du clavier virtuel qui ne se montre que lorsqu’un champ texte est actif.&lt;/p&gt;
&lt;p&gt;Malgré tout, ne pas avoir IE6 dans les pattes et pouvoir jouer avec html5 et css3 c’est un grand bonheur ! Il n’y a plus qu’à espérer que la Team Webkit soit à l’écoute des développeurs, deux petites limitations à corriger ce n’est pas la mer à boire !&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Dans cet article je n’ai pas parlé de toutes options pour développer des WebApps sur iPhone. Il y a bien-sûr Dashcode, le meilleur choix si vous voulez créer une application avec le look and feel classic d’Apple. Mais il y a aussi des solution hybrides telles que Appcelerator qui permettent de créer des applications natives à l’aide de Javascript, et qui donne accès à des couches plus basses du téléphone (appareil photo, notifications).&lt;/p&gt;
&lt;p&gt;Dans le prochain article, nous mettrons en pratique ce qui a été abordé ici avec un exemple concret. J’espère vous y retrouver !&lt;/p&gt;
&lt;p&gt;J’en profite pour signaler aux fans de technologies pure web et javascript que ma société, Zenexity (Paris 9), recrute actuellement des développeurs pour la division iPhone, contactez-moi pour plus d’informations.&lt;/p&gt;
&lt;p&gt;MAJ: Etape2 du &lt;a href="http://iam.warry.fr/post/827792280/developper-des-webapps-sur-iphone-etape-2"&gt;tutoriel développer des webapp pour iPhone&lt;/a&gt; est disponible.&lt;/p&gt;</description><link>http://iam.warry.fr/post/432748965</link><guid>http://iam.warry.fr/post/432748965</guid><pubDate>Sun, 07 Mar 2010 19:14:00 +0100</pubDate></item><item><title>Museum of modern betas</title><description>&lt;a href="http://momb.socio-kybernetics.net/"&gt;Museum of modern betas&lt;/a&gt;</description><link>http://iam.warry.fr/post/220293390</link><guid>http://iam.warry.fr/post/220293390</guid><pubDate>Thu, 22 Oct 2009 23:24:42 +0200</pubDate></item><item><title>Citation</title><description>&lt;p&gt;« Avec plus de 70 millions de machines utilisées dans le monde, les ordinateurs DOS fabriqués par des sociétés telles qu’IBM, Compaq, Tandy et des millions d’autres sont de loin les plus populaires. D’un autre côté, les fans de Macintosh noteront que les cafards sont bien plus nombreux que les humains, mais que ce chiffre seul ne dénote pas d’une forme de vie plus avancée. »&lt;br/&gt;&lt;br/&gt;&lt;i&gt;New York Times, 26 novembre 1991&lt;/i&gt;&lt;/p&gt;</description><link>http://iam.warry.fr/post/217062415</link><guid>http://iam.warry.fr/post/217062415</guid><pubDate>Mon, 19 Oct 2009 12:38:51 +0200</pubDate></item><item><title>Multitouch, une réflexion sur le digne descendant de la souris.</title><description>&lt;iframe src="http://player.vimeo.com/video/6712657" width="400" height="220" frameborder="0"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Multitouch, une réflexion sur le digne descendant de la souris.&lt;/p&gt;</description><link>http://iam.warry.fr/post/216430230</link><guid>http://iam.warry.fr/post/216430230</guid><pubDate>Sun, 18 Oct 2009 19:26:30 +0200</pubDate></item><item><title>Webdesign russe !</title><description>&lt;a href="http://www.smashingmagazine.com/2009/10/17/global-web-design-russia/"&gt;Webdesign russe !&lt;/a&gt;</description><link>http://iam.warry.fr/post/216322326</link><guid>http://iam.warry.fr/post/216322326</guid><pubDate>Sun, 18 Oct 2009 16:39:37 +0200</pubDate></item><item><title>I am Warry !</title><description>&lt;p&gt;Un peu à l’étroit chez les cousins d’en face, Twitter, j’ai décidé d’ouvrir un espace un peu plus large, voici Tumblr !&lt;/p&gt;</description><link>http://iam.warry.fr/post/216298937</link><guid>http://iam.warry.fr/post/216298937</guid><pubDate>Sun, 18 Oct 2009 15:56:21 +0200</pubDate></item></channel></rss>

