flash player sur iphone et ipad

Flash sur iPhone et iPad c’est possible !

Pour ceux ne l’ayant pas encore remarqué, par défaut, les produits iPhone et iPad ne peuvent pas lire des contenus flash dans leur navigateur web ( safari ) .
Je ne vais pas rentrer dans l’ éternel débat du flash est mort … Apple sont les meilleurs ect … bref !

Les iPhone et iPad peuvent lire du flash !

La solution :

logo_puffin-web-browser

Je vous propose de télécharger et tester ce navigateur qui est en version gratuite sur Apple store : Puffin Web Browser, il a la particularité de lire sans aucun problème les contenus flash player. il n’est pas le seul, mais celui ci est gratuit ( une version gratuite et une autre payante ), testé et approuvé !

Création thème Magento : différence entre addJs et addItem

Ajout de fichier javascript dans votre thème Magento

Dans la manipulation des layouts sur Magento vous avez surement remarqué qu’il existe deux méthodes pour dire à Magento de charger des fichiers javascript : addJs et addItem, vous vous demandez surement qu’elles sont les différences entre ces deux fichiers en voici quelques une que j’ai déduites :

addJs permet l’ajout de fichier javascript à partir de la racine (root) de votre e-commerce Magento.

<action method="addJs">
   <script>js/custom.js</script>
</action>

et addItem lui, permet de faire un ajout javascript à partir de votre interface et thème Magento.

<action method="addItem"> 
<type>skin_js</type> 
<name>js/jquery.js</name> 
</action>

J’ai également remarqué que addItem permet d’ajouter des conditions par exemple charger un fichier en fonction d’un type de navigateur, comme par exemple :

<action method="addItem"> 
<type>skin_js</type> <name>js/ie6.js</name> 
<params/>
<if>lt IE 7</if> 
</action>

Flex Apache la renaissance !

flex_apache_logo_blancAdobe cède Flex SDK à la fondation Apache

Voila déjà un an qu’ Adobe à cédé le Flex SDK à apache. Durant une année j’ai calmé les développements Flex ( en maintenant seulement quelques projets pour des clients ) et complètement abandonné la R & D sur cette technologie, suite aux annonces massacrantes d’Adobe pour le player Flash et l’avenir si incertain de Flex. J’ai donc suivi le troupeau vers la technologie HTML5 / Javascript !
Vous n’imaginez même pas à quel point j’étais rempli de bonheur ( ironie ), de délaisser des années de savoir pour tout recommencer vers des technologies qui ne me semblaient pas vraiment à la hauteur, ce qui fut très rapidement confirmé.
Je n’ai plus aucun doute sur ce qui est faisable ou non en HTML5 et je vous assure que sur cette techno on est à des années lumière de ce que l’on faisait à l’époque avec Flex :).

Qu’est devenu Flex SDK ?

Aujourd’hui j’ai décidé de retourner voir ce qu’est devenu ce bijou de technologie, comment a t’il évolué ? est-ce que le SDK a changé de version ? La dernière fois ou j’ai jeté un oeil sur le projet de reprise, la fondation Apache était en train de définir le futur nouveau logo Flex, on était encore loin de connaître les futures évolutions du Framework Flex.
Qu’elle bonne surprise lorsque je découvris ce nouveau site dédié au Flex SDK, d’autant plus que la fondation Apache n’a apparemment pas chômé sur le projet, à l’ époque j’avais fait ma pause en recherche et développement sur la version 4.6 du SDK, aujourd’hui je suis comme un enfant devant ses cadeaux de noël avec cette nouvelle version Flex SDK 4.9 .

Une nouvelle jeunesse pour Flex SDK ?

Désormais je n’ai plus aucun doute quant aux besoins des entreprises pour les développements d’applications riches, actuellement aucune technologie ne peut rivaliser avec Flex, HTML5 et javascript ne sont pas l’avenir mais seulement des embryons d’une future technologie beaucoup plus avancée pour le web ( HTML6 ou HTML 7 ) mais tout ceci est un avenir très très lointain ! et d’ici là, Flex n’aura aucun mal à s’adapter aux nouvelles demandes du marché car désormais il est entre de très bonnes mains (Fondation Apache) .

Reprise des projets et de la partie recherche et développement en Flex Apache !

desktop-sm mobile-sm

Je ne doute plus de l’importance pour ma société et moi même à continuer mes recherches et me spécialiser dans la technologie Flex / Flash, pour plusieurs bonnes raisons, déja plus ou moins abordées précédemment mais également parce que je pense qu’un développeur Flex/AS aura plus de facilité à apprendre les futures nouvelles techno web (qui seront sûrement compilées ) qu’un développeur JS ou HTML5. L’autre raison c’est que je n’ai jamais aimé suivre les masses et que je pense qu’il y a plus d’avenir dans une technologie importante mais maîtrisée par peu de personne, plutôt qu’une techno qui fait le buzz et ou tout et n’importe quel développeur va s’engouffrer !

Coté HTML5 / javascript je pense avoir fait le tour en un an, car au final il n’y a pas grand chose de novateur dans ces technos. je continuerai les dev. HTML5 / javascript dans certain cas.
Je pense me pencher de nouveau sur les développements et la recherche en Flex, je vais ouvrir une section tutoriaux sur l’utilisation de ce superbe langage de programmation. Mes deux prochains projets seront la refonte de l’application en AIR qui permet de gagner des Like Facebook et plus sérieusement la partie administrateur de la gestion d’apparence graphique ainsi que de l’interface statistiques du module e-commerce WordPress récemment développé.

Voici un très bon article qui est le résumé d’un échange entre deux personnes sur les avantages et problématiques du framework Flex. : http://flexblog.faratasystems.com/2013/01/22/html5-or-flex-framework

Les textures dans Alternativa3D 8

alternativa3d-logoAujourd’hui nous allons voir comment ajouter des textures à notre modèle de boîte primitive. Pour les bases concernant l’utilisation du moteur Alternativa3D vous pouvez vous référer au premier tutorial Alternativa3D premier pas …

Pour commencer nous allons créer un dossier « assets » dans notre projet, dans lequel nous allons placer une image qui nous servira de texture.Il est indispensable que la hauteur et la largeur de l’image soit une puissance de deux. Sinon vous aurez une erreur à l’exécution :

Argument Error: Error #3682: La taille de la texture n’est pas une puissance de deux.

Si vous le souhaitez, vous pouvez utiliser une texture telle que celle-ci :

box01

Nous chargeons notre texture :

[Embed(source="assets/alternativa3d-logo.png")] static private const BoxTexture:Class; 

Nous créons un objet pour que le bitmap soit chargé dans les ressources, puis nous l’appliquons sur toutes les faces de notre box avec un objet TextureMaterial :

var bmd_res:BitmapTextureResource = new BitmapTextureResource(new BoxTexture().bitmapData);
box.setMaterialToAllSurfaces( new TextureMaterial( bmd_res ) ); 

voici le code complet de l’exemple :

package
{
import alternativa.engine3d.controllers.SimpleObjectController;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3D;
import alternativa.engine3d.core.Resource;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.TextureMaterial;
import alternativa.engine3d.primitives.Box;
import alternativa.engine3d.resources.BitmapTextureResource;

import flash.display.Sprite;
import flash.display.Stage3D;
import flash.events.Event;

public class Alternativa3DBase02 extends Sprite
{
private var rootContainer:Object3D = new Object3D();
private var camera:Camera3D;
private var controller:SimpleObjectController;
private var stage3D:Stage3D;
private var box:Box;

[Embed(source="assets/box01.png")] static private const BoxTexture:Class;

public function Alternativa3DBase02()
{
super();
addEventListener(Event.ADDED_TO_STAGE, init3D);
}

private function init3D(evt:Event):void
{
camera = new Camera3D(0.01, 10000000000);
camera.x = -50;
camera.y = -300;
camera.z = 100;
controller = new SimpleObjectController(stage, camera, 200);
controller.lookAtXYZ(0,0,0);
camera.view = new View(800, 600, false, 0xFFFFFF, 0, 4);
camera.view.hideLogo();
addChild(camera.view);
addChild(camera.diagram);

rootContainer = new Object3D();
rootContainer.addChild(camera);

//box
box = new Box();
var bmd_res:BitmapTextureResource = new BitmapTextureResource(new BoxTexture().bitmapData);
box.setMaterialToAllSurfaces( new TextureMaterial( bmd_res ) );
rootContainer.addChild(box);

stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);
stage3D.requestContext3D();

}

private function init(event:Event):void
{
for each (var resource:Resource in rootContainer.getResources(true)) {
resource.upload(stage3D.context3D);
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler)
}

private function enterFrameHandler(event:Event):void
{
box.rotationZ -= 0.01;
box.rotationY += 0.01;
controller.update();
camera.render(stage3D);
}
}
}

le rendu final :

final-300x246

Importation d’objets .A3D dans Alternativa3D

alternativa3d-logo Alternativa3D nous propose sur son site internet le téléchargement d’un plugin pour exporter ses scènes 3DSmax au format .A3D, nous allons voir comment intégrer ces objets 3D dans notre scène flash.

Pour commencer assurez-vous d’avoir téléchargé puis installé le plugin en question! Vous le trouverez en téléchargement gratuit à l’adresse suivante : Alternativa3D

Ouvrez 3ds max, puis créez votre objet 3d, pour l’exemple je vais utiliser l’emblématique « Tea Pot » de 3dsMax.
Appliquez lui une texture « standard » avec un Bitmap comme « Diffuse » :

3dsmax01_A3D-1024x613

Exportez le projet au format A3D :

3dsmax02_A3D-300x202

Passons maintenant au projet as3, créez votre projet comme expliqué dans les précédents tutoriels de la même catégorie.
Nous allons ajouter une fonction « initObject » dans laquelle nous allons charger notre objet .A3D que vous aurez bien sûr, déjà placé dans le dossier /assets/A3D/ de votre projet.
Et faites de même avec la texture que vous placez dans le dossier /assets/textures/ nomdevotretexture.jpg.
Nous utilisons un simple objet URLLoader pour charger notre modele .A3D
Le chargement effectué nous allons parser la scene 3D (ParserA3D), puis récupérer notre Teapot en passant par une boucle sur les objets de la scène.

// Model parsing
var parser:ParserA3D = new ParserA3D();
parser.parse((e.target as URLLoader).data);
var mesh:Mesh;
for each (var object:Object3D in parser.objects)
{
if (object.name == "Teapot01")
{
mesh = object as Mesh;
break;
}
}

rootContainer.addChild(mesh);        

Une fonction qui permet de charger les textures dans le context3D de la stage3D :

private function uploadResources(resources:Vector.):void
{
for each (var resource:Resource in resources)
{
resource.upload(stage3D.context3D);
}
}

Une boucle sur les matériaux de notre objet 3D, et un chargement de ces mêmes textures.

             var textures:Vector. = new Vector.();
for (var i:int = 0; i < mesh.numSurfaces; i++)
{
var surface:Surface = mesh.getSurface(i);
var material:ParserMaterial = surface.material as ParserMaterial;
if (material != null)
{
var diffuse:ExternalTextureResource = material.textures["diffuse"];
if (diffuse != null)
{
diffuse.url = "assets/textures/" + diffuse.url;
textures.push(diffuse);
surface.material = new TextureMaterial(diffuse);
}
}
}

// chargement des textures
var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);
texturesLoader.loadResources(textures);

Il ne vous reste plus qu’à tester votre projet 🙂 !
voici le code complet du projet :

 package
{
import alternativa.engine3d.controllers.SimpleObjectController;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3D;
import alternativa.engine3d.core.Resource;
import alternativa.engine3d.core.View;
import alternativa.engine3d.loaders.ParserA3D;
import alternativa.engine3d.loaders.ParserMaterial;
import alternativa.engine3d.loaders.TexturesLoader;
import alternativa.engine3d.materials.TextureMaterial;
import alternativa.engine3d.objects.Mesh;
import alternativa.engine3d.objects.Surface;
import alternativa.engine3d.primitives.Box;
import alternativa.engine3d.resources.BitmapTextureResource;
import alternativa.engine3d.resources.ExternalTextureResource;

import flash.display.Sprite;
import flash.display.Stage3D;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;

public class Alternativa3DBase03 extends Sprite
{
private var rootContainer:Object3D = new Object3D();
private var camera:Camera3D;
private var controller:SimpleObjectController;
private var stage3D:Stage3D;

public function Alternativa3DBase03()
{
super();
addEventListener(Event.ADDED_TO_STAGE, init3D);
}

private function init3D(evt:Event):void
{
camera = new Camera3D(0.01, 10000000000);
camera.x = -50;
camera.y = -100;
camera.z = 100;
controller = new SimpleObjectController(stage, camera, 200);
controller.lookAtXYZ(0,0,0);
camera.view = new View(800, 600, false, 0xFFFFFF, 0, 4);
camera.view.hideLogo();
addChild(camera.view);
addChild(camera.diagram);

rootContainer = new Object3D();
rootContainer.addChild(camera);

stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, init);
stage3D.requestContext3D();

initObject();
}

private function init(event:Event):void
{
for each (var resource:Resource in rootContainer.getResources(true)) {
resource.upload(stage3D.context3D);
}
addEventListener(Event.ENTER_FRAME, enterFrameHandler)
}

private function initObject():void
{
var loaderA3D:URLLoader = new URLLoader();
loaderA3D.dataFormat = URLLoaderDataFormat.BINARY;
loaderA3D.load(new URLRequest("assets/A3D/TeaPot.A3D"));
loaderA3D.addEventListener(Event.COMPLETE, onA3DLoad);
}

private function onA3DLoad(e:Event):void
{

// on parse le modele
var parser:ParserA3D = new ParserA3D();
parser.parse((e.target as URLLoader).data);
var mesh:Mesh;
for each (var object:Object3D in parser.objects)
{
if (object.name == "Teapot01")
{
mesh = object as Mesh;
break;
}
}

rootContainer.addChild(mesh);
uploadResources(mesh.getResources());

var textures:Vector. = new Vector.();
for (var i:int = 0; i < mesh.numSurfaces; i++)
{
var surface:Surface = mesh.getSurface(i);
var material:ParserMaterial = surface.material as ParserMaterial;
if (material != null)
{
var diffuse:ExternalTextureResource = material.textures["diffuse"];
if (diffuse != null)
{
diffuse.url = "assets/textures/" + diffuse.url;
textures.push(diffuse);
surface.material = new TextureMaterial(diffuse);
}
}
}

// chargement des textures
var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);
texturesLoader.loadResources(textures);
}

private function uploadResources(resources:Vector.):void
{
for each (var resource:Resource in resources)
{
resource.upload(stage3D.context3D);
}
}

private function enterFrameHandler(event:Event):void
{
controller.update();
camera.render(stage3D);
}
}
}

et le rendu qui paye pas de mine je vous l’accorde mais qui aujourd’hui vous permet de charger n’importe quel modèle 3D dans votre scène !

teaPot01

Développement d’un composant Clavier intuitif en Flex

Je vais vous présenter un composant, dont nous aurons besoin dans un projet d’application tablette ( Android / ios Apple ) destiné aux opticiens.
Ce composant est un clavier intuitif. Son fonctionnement de base est simple : nous lui donnons une liste de mots dans laquelle le clavier fera une recherche . Il classera alors les mots, et proposera les touches possibles pour la suite du ou des mots correspondants.

Par exemple pour la liste des mots suivants :
[ android, apple, tablette, mobile, developpement, application ]

voici notre clavier de départ :
composant-flex-clavier-01
Imaginons que nous appuyons la touche « A » le tableau se triera de cette façon :
[ android, apple, tablette, application ]
et le clavier se réactualisera de cette manière :

composant-flex-clavier-02

Pour correspondre aux lettres suivantes : [ android, apple, tablette, application ].
Et ainsi de suite jusqu’à obtenir un résultat de recherche satisfaisant.
Une fois se composant de base réalisé, nous ajouterons des fonctions plus poussées. telles que l’intégration d’un autre composant, de reconnaissance de forme que je vous détaillerai dans un prochain article.

AS3 stage.stageWidth et stage.stageHeight sur mobile Android IOS

androidappleAujourd’hui nous allons voir comment résoudre le problème de résolution d’écran pour vos applications Android et Iphone.
Sur un projet classique as3, destiné au navigateur internet, nous récupérons la largeur et la hauteur de la scène:

 stage.stageWidth; // largeur

stage.stageHeight //hauteur

Néanmoins je ne sais pas si c’est dû à un bug Adobe, mais les valeurs retournées par stageWidth et stageHeight sur un portable Android ou Iphone ou encore une tablette, sont erronées.

La seule solution que j’ai trouvé pour palier à ce problème c’est d’utiliser la classe Capabilities dont son rôle est de fournir les propriétés du système qui héberge l’application.

il suffit donc de remplacer stage.stageWidth par Capabilities.screenResolutionX et stage.stageHeight par Capabilities.screenResolutionY. Ces deux fonctions nous retournent la hauteur et largeur de l’écran ou est exécutée l’application.

Encodage des images en base64 pour votre CSS

css3-logoPour un premier tutoriel dans cette section CSS, je vais vous parler d’une méthode simple, mais efficace pour diminuer le nombre des requêtes http de votre site internet, mais également gagner un temps certain dans vos futurs développements de site internet.

Encoder une image en base64

Le principe est très simple, il suffit de transformer une image en string puis de coller cette chaîne de caractères dans sa feuille de style css avec le code suivant :

data:image/png;base64

Pour encoder votre image il existe deux méthodes différentes.Soit passer par une application en ligne, comme par exemple celle-ci :
http://www.motobit.com/util/base64-decoder-encoder.asp
ou bien encore avec une commande shell linux :

openssl base64 -in image.png | tr -d '\n\'

la partie avec le pipe | tr -d ‘\n\’ permet de supprimer les retours chariot tous les 64 caractères.

Utilisation de l’image en base64 dans une feuille de style

Maintenant que vous savez comment obtenir votre chaîne de caractères, il ne reste plus qu’à l’exploiter dans votre feuille de style css :

   background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAHElEQVR42lXGwQkAAACCwPZfyeHKb8KBAWrR/QDr+RJVVNWLAAAAAABJRU5ErkJggg==");

Compatibilité des images en base 64 avec … Internet Explorer

Comme vous devez déjà vous en douter les images en base 64 ne sont pas interprétées par les navigateurs Internet Explorer 6 et 7. la seule solution reste un hack en ajoutant son image avec la méthode traditionnelle pour ie.

Quelques outils

Je vous donne quelques balises utilisant les images en base64.J’utilise ces balises dans tous mes thèmes / templates :

Info
.info {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAACA0lEQVR42u2Xyy5DQRzGPYKlR+hDeAg7W0tLEksLO7GxFtG400QsJCIo1QuCVltU2zQtkSYERfSaEsb5baQ3Z3qYNhYj+ZJx5vt/88vcek6HEOJfSwNqQA2oATXgH4qXvWe9s65gcsrpf5/YPBaV4hl9eNoO6PCddU/vBl4AmXGdipWDC7F2HK0Sz+jDg5eatgAuecKjk1snn/N7QbERiIvtUMJUePBSQ60CQCmcWD2MMLglUUOtVUhLy2rsq491f6whQPj6NvWcLzoQ7UYeaskgSzkg+8hs5jLZwrjhsyHaZjNJllJATiL7yGwJ3ZGrfryItpmXLDKVAXJdyA6EfSdQZH8tuEPDtGUHh0xlgMagOdkhWPaGv+/ARU9IyPxkKgPkTjMbzPgbqZUMkExlgFy8JoMxa3VLJgMkUxmgs4nB2PhWAMlUBui7vG7mF8MSIJnKAP2J9B2hElkCJFMZYCz94FINSKYywMfX/KDrPKkMkCwyVQGirmj6Pmo2aOruqQqQ/3/ykkWmMkCUK5WHjuI3OdnsyWaRDLJa8brVaSyL3R1J/XQX1qrOQy0ZZLUCENmesoW5+pmUixpqyWj1K7+tWH4bYx81c3Dw4KWG2nZ9NLFEfflSeSJ5m9nnTuPirRTP6MODl5p2f9UhTmKPoYEGLwwD9OHR38UaUANqQA34e30BMUs2UusQeogAAAAASUVORK5CYII=") no-repeat scroll 0 0 #EBF5FA;
border-color: #D2DCE1;
}
Important
.important {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAABIklEQVR42u3XQUrDQBTGcY+QI3gEj+At3PYG4qYgpeDOhSCCuO89ilCwhS6Eloq4cZET6ERMipuO+WcZgo2fzCTgW3xkSN7r/JhJSHrgve91DGhAAxrQgH/8gY/lxYl7OH99vz/bvU1PPWHMOa51CszmoxWg8ug/Hy99vr4ijDlXYanpBMgKudmwAm1f7hrDNWqojQpkVZi4eL4F8lOoASmvpHTP1XCtkco9KW1tvrlm4l+FHnqDA7PF+IsJldAbHMgTqgLpDQ4snm5kIL3BgeVEqQqkNwZwogLpjQE8LOMEnKNXASrIgQAcRH3VsV3C1qpAHSngogKTFsCkMyDZB6TGgAESF8iXc1PiAPXXX9on4HENyfjI/nYa0IAGNOA/AH4DB0n6mf9lZv8AAAAASUVORK5CYII=") no-repeat scroll 0 0 #FFFAE6;
border-color: #FAE6BE;
}
Attention
.attention {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAB/UlEQVR42u2Xyy4DURjH7Wy9gNj0MbyHN7CWWFtLRKp1q6pqq9WqiEsQtwWCRCLhBWzMpXcqkYi6jfmJEaYzbWOm2sVZ/JMv813Ob86c75wzHZqmtbUEoAAUgAJQAArANgBU08E+KTr2eBMa0ZAc85fV9Gxv2wBK894XdSmo5Tbin1ISUxrAbQGoLE4dqcshrbC38ksA42spIJ9Rjvpe8zvLVYA8w0dMywBZa9n1GECWwicvjGdbAqimZoZZawbM/eXp9XO5OI2wv54DqBH7r4D6muuRor5KfnvpG/ApI/l1XzfCNp4TQyw5DgCdN0bpcKvf8GP/9BH714b5254X8VZ3bTo4/v0CqcCc2U8OuU0HpDHY68wASnL63IjBNvvJIbepgMyMkgxYdqzuKxpx2FYx5FLDfUCjMSLeN6s9z1hn7HkI2yqGXGpQy3VAJTF5lVkJ2+55uc3k556HsO3iqCHHJ65dBdSPrQE55mOAWgIQNRRHTdcAOfhrzQq6Ozt4qJRyEYRdK5Za1HQDkI5c4+CvNyuVQmZWj/cgbJPf9jLhGNDUGPbaXxsycrBNftvLhCNA/fLZlVtfqAuHpPDoO2cuwm4kh9qM4WQGO8sXx9lGBsuuRhgMYTf0UtR2/Ik5+G9PdinoqqhJbTe6mIU/2CR5xF+dABSAAlAA1tYHSwv5Nu1eZ98AAAAASUVORK5CYII=") no-repeat scroll 0 0 #FFF0EB;
border-color: #FFD7CD;
}

HTML5 et Datalist

html5-logoRemplir des formulaires sur un site est toujours long. Aujourd’hui en HTML5 grâce au composant datalist vous pouvez désormais proposer un choix multiple à vos utilisateurs, tout en leur laissant la liberté de saisir ce qu’ils souhaitent.

Les options peuvent être jumelées avec un datalist en spécifiant son id dans l’attribut  list d’un input :

<input type="text" value="" placeholder="saisissez la lettre 'a'" list="listOs" />
<datalist id="listOs">
<option value="Apple"></option>
<option value="Android"></option>
<option value="BlackBerry"></option>
</datalist>

démo :

Le composant datalist  est largement compatible avec les dernières versions de Firefox, Opéra, Chrome, et Internet Explorer 10.

Flash Builder 4.6 BUG loading workbench .snap

bug-flash-builder-4Pour ceux qui comme moi auraient leur FlashBuilder qui reste figé sur l’initialisation du Workbench ! Ne faîtes pas de réinstallation ! voici la solution à votre problème :

Pour les versions de Flashbuilder 4 à Flashbuilder 4.6 voici ce qu’il faut faire :

  1. Killez le process de Flashbuilder.exe si il est encore en exécution.
  2. Supprimez le fichier .lock dans le dossier :
    C:\Users\{votreNom}\Adobe Flash Builder 4.6\.metadata
  3. Supprimez le fichier .snap dans le dossier :
    C:\Users\{votreNom}\Adobe Flash Builder 4.6\.metadata\.plugins\org.eclipse.core.resources
  4. Et pour ceux qui ne trouvent pas comme moi ce fichier .snap allez dans
    C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.6
    et exécutez FlashBuilderC.exe

Voila, votre problème doit être réglé ! 😉

bug-flash-builder-4.6