développement d’applications sociales pour les nuls

Après la vulgarisation à l’extrême du développement d’applications iPhone par Mobile Syndication Service, c’est au tour de Sun de proposer une plateforme de création d’applications sociales (Facebook, Meebo, OpenSocial, iPhone, Google Gadgets…) pour tous les allergiques au code. Enfin presque !

La comparaison avec MSS est purement anecdotique. Zembly de son petit nom, est bien plus prometteur que le rejeton d’Infomedia en tablant sur la capitalisation et la réutilisation de code dans un élan communautaire.
Mais de quoi s’agit-il exactement ?

Pour commencer, zéro install, rien à déployer ou à télécharger sur votre machine ! Tout se passe dans le navigateur, et ce, de la simple édition de widgets standards en drag-and-drop, jusqu’à la prodution de widgets plus évolués ou de services pour la partie métier. Même s’il n’est pas besoin d’être ingénieur en informatique comme le stipule la présentation officielle, pas de miracle à l’horizon, il vous faudra disposer de certains rudiments JavaScript et HTML pour pouvoir aller plus loin que l’assemblage plug and play des widgets standards, d’où ma réserve émise en introduction concernant l’absence de prérequis techniques. Par contre, pour bien faire, Sun vous offre en bonus un IDE embarqué dans le navigateur avec code completion, auto-format et syntax highlighting. Du grand art !

Pour compléter cette offre, une longue palette d’APIs web 2.0 (Amazon, Flickr, Google, Twitter, and Yahoo…) est déjà disponible, permettant chacune de réaliser des mashups à la demande par un système d’import simplifié.

Cerise sur le gâteau, une partie sociale et collaborative sert d’éco-système pour le développement la plateforme. Tous les ingrédients sont là: Constitution d’un profil, présentation des travaux en cours, liste de contacts, travaux collaboratifs avec ses amis, système de ranking et d’exposition.
L’ambition de Sun avec Zembly ici, est d’épouser la comparaison avec wikipedia dans le domaine des applications sociales. Un repository social pour faire du social, tout un programme !

Mais la promesse ne s’arrête pas là, Sun marche aussi sur les traces du Google App Engine et de l’automatic scaling en chantant:
« Vous n’avez qu’une seule chose à faire, appuyer sur le bouton publier quand votre application est prête. Nous préférons largement que vous utilisiez votre temps à planifier le recrutement d’un million d’utilisateurs plutôt que vous le gaspilliez à calibrer un million de détails sur votre datacenter pour tenir la charge. »
Si l’on en croit le discours marketing rôdé, Zembly scales avec en coulisses pour ce faire, une architecture Solaris/Java/Glassfish/MySQL tournant sur une plateforme next-gen de cloud-computing.

Un modèle économique à l’horizon ?
L’offre est pour l’instant gratuite, mais Sun annonce la couleur dores et déjà sans rougir. Dès la fin de la beta, certaines offres deviendront payantes pour amortir les coûts de la plateforme.
Petite précision, j’ai pu ouvrir un compte hier soir sur le site soit-disant en beta privée, sans devoir montrer patte blanche avec une invitation.

Pour finir, je vous propose un showcase Facebook du nom de Capital Punishment, le tout réalisé avec Zembly of course darling, accompagné quelques ressources pour les plus téméraires:
- Création d’un widget basique en 5 minutes.
- Création d’une application Facebook avec zembly.
- Une collection d’exemples de widgets, services et applications pour bien démarrer.

Via mashable

librairie XMP sur Adobe Labs

Adobe vient de publier sur le labs un portage de sa librarie XMP pour ActionScript 3.0.
XMP (Adobe’s Extensible Metadata Platform) c’est le standard qui permet de lire et d’écrire des metadatas (titres, descriptions, mots clés, copyrights…) dans les fichiers de sauvegarde pour obtenir un workflow plus collaboratif entre les différents outils de la suite logicielle Adobe.

La librairie est découpée en 3 parties:

- Représentation du modèle de données en mémoire:
Il s’agit d’un arbre découpés en noeuds de différents types: Properties, structures, arrays, qualifiers…
L’API de la librairie s’assure à chaque instant de la validité des données de l’arbre afin qu’elles puissent être sérialisées à la demande. Une exception est lancée dans le cas contraire.

- Parseur (XML, String ou ByteArray) :

var xmpStr: String = "”
+ data + "";
var xmp: XMPMeta = new XMPMeta(xmpStr);

- Sérialiseur (XML, String ou ByteArray):

var xmp:XMPMeta = new XMPMeta(...);
// ... modify metadata
var str:String = xmp.serialize();
var buffer:ByteBuffer = xmp.serializeToBuffer();

On devrait bientôt voir éclore des applications AIR capables de lire (et de réinjecter ?) le metadata d’un fichier CS4.

développement de jeux sur iPhone

Depuis son lancement, le 11 juillet dernier, l’AppStore comptabilise 500 millions d’applications téléchargées. Parmi les applications les plus demandées figurent les jeux suivis de près par l’entertainment, domaines très juteux pour Apple. A l’époque du lancement du store, Medialets estimait déjà le chiffre d’affaires de Super Monkey Ball à 4,9 millions de dollars en trois jours et celui de Bejeweled 2 à 3,4 millions de dollars.
Des chiffres plutôt impressionnants pour un hardware dont la vocation première n’était pas celle d’une console de jeux !

Pourtant, le smartphone a eu le vent en poupe dès ses débuts, aussitôt encouragé par Sega qui le comparait à une Dreamcast, Electronic Arts qui le considérait plus puissant qu’une DS ou Carmack qui vantait ses mérites en déclarant qu’à sa sortie le géant de Cupertino révolutionnerait le développement sur mobile.

Depuis les déclaration du responsable de produits Apple US Greg Joswiak à Stuff Magazine et celles de Steve Jobs au Wall Street Journal, il ne fait plus aucun doute qu’Apple compte truster le marché du jeu mobile.
Des initiatives comme le portage de Unity3D ou l’annonce de l’iControlPad confirment la tendance, et les rumeurs concernant le lancement d’un iPhone multi-core avec Firmware 3.0 et performances graphiques boostées pourraient définitivement enfoncer le clou.

Mais quelles sont les réelles perspectives d’un développeur de jeux iPhone en 2009 ?
Avec le professionnalisme qui le caractérise, Gamasutra répond à cette question dans un dossier de 4 pages. Je vous recommande sa lecture.

Sachez que de nombreux développeurs Flash (Keith Peters, Aral Balkan, Mike Chambers, Peter Elst, Mike Downey…) ont déjà viré leur cuti partiellement voire totalement pour certains, et que quelques tutoriaux commencent à fleurir sur le net.
Rappelons par contre que la sélection naturelle se fait dès l’entrée. Il faut disposer d’un Mac avec Leopard installé, et débourser la somme de 99 euros pour pouvoir publier sur le smartphone, même s’il est toujours possible de se contenter de l’émulateur pour commencer. Il vous faudra aussi dompter Xcode et maîtriser un minimum le tandem Objective C/Cocoa Touch. Ni plus ni moins !

Pour finir, une news intéressante qui s’adresse à ceux qui aimeraient mettre le pied à l’étrier. Simon Oliver, ancien développeur Flash (encore un décidément !) mais surtout brillant auteur de Rolando vient de publier un portage du Testbed de Box2D. Ce portage en Cocoa Touch fonctionne sur iPhone et iPod Touch et prend en charge l’écran tactile et l’accéléromètre. Le repository se trouve ici et les fichiers concernant l’iPhone dans le répertoire build. Voici une petite vidéo qui devrait finir de vous convaincre.

un ORM JavaScript pour Jaxer et AIR

ActiveRecord.js est un ORM JavaScript open source écrit par Ryan Johnson (le créateur de livepipe) pour Aptana.

Disponible au téléchargement en un seul fichier avec aucune dépendance, cette librairie est conçue pour fonctionner avec Jaxer et Air (Google Gears avec Chrome aussi). Elle offre une panoplie de fonctionnalités dignes des plus grands ORMs: Création automatique de tables, validation et synchronisation des données, modèles relationnels, callbacks de cycle de vie et possibilité de stocker les objets en mémoire en cas d’indisponibilité d’une base SQL.

Une version beta est disponible ici accompagnée de sa documentation ici. En fouillant dans le repository, on trouve même un sample pour AIR.

Espérons maintenant qu’Aptana ne s’endorme pas sur ses lauriers et nous offre de nouveaux chérubins dans la famille ActiveJS, accompagnés d’updates innovants pour Jaxer et Aptana Studio.

Via aptana

Open Video Player en action

Open Video Player est un site communautaire soutenu par Akamai, leader mondial de diffusion de contenus.
Ce site se propose de partager les bonnes pratiques concernant le développement de players vidéo.

Cette initiative a déjà su s’entourer d’une liste de partenaires prestigieux avec en tête de liste Adobe et Microsoft. Les régies publicitaires ont répondu à l’appel bien sûr. On retrouve: 24/7 Real Media, BlackArrow, Eyewonder, OpenX, Panache, ScanScout et Smartclip.

Un framework open source décliné en deux versions (Silverlight 2.0 et Flash 9.0) est disponible sur le site. Il est utilisé par les non moins prestigieux Adobe TV, FWA Theater et New York Magazine.

La distribution Flash inclut les fonctionnalités suivantes: Connexions (Ondemand RTMP, Live RTMP et HTTP), containers audio et vidéo (H.264, VP6, FLV, AAC3 et MP3), détection de bande passante, prise en charge des firewalls, gestion avancée des cue points, bridage du data rate, contrôle du playback, gestion des MetaDatas, parsing Media RSS 1.1.2…

Ci-dessous, un petit test maison utilisant un connecteur 24/7 Real Media pour illustrer les possibilités d’intégration d’une régie publicitaire.

Pour l’exercice de style et proposer du contenu après la pub, j’ai modifié la classe AkamaiMediaRSS.
Après une succincte réécriture de la méthode parseXML, le player est capable de lire un flux RSS Seesmic et de prendre en charge une version raccourcie (pour l’occasion) de ma playlist utilisateur.
Que du bonheur !

Pour lancer l’exemple, il faut cliquer sur le gros bouton bleu, aimer la bière, les chutes et les brèves de comptoir.

[kml_flashembed movie="http://www.tweenpix.net/files/Akamai_Player_247.swf" width="330" height="280"/]

Via flashmagazine

des tweetbacks sous WordPress

Un tweetback, c’est tout simplement (à la manière d’un trackback), la publication des retweets d’un de vos billets (à partir de son url) dans ses commentaires.

Comme une image vaut parfois mieux qu’une longue explication, en voici une:

Après l’initiative de Dan Zarella (entièrement codée côté client et peu performante), c’est au tour de Joost de Valk, auteur de plugins bien connu des bloggeurs, de sortir en fanfare (sur SmashingMagazine) un plugin WordPress pour la gestion des Tweetbacks.

Séduit par l’idée, je l’ai installé, et je dois avouer que cela marche aux petits oignons

J’ai même hacké le plugin WP-Gravatar pour afficher les images des profils Twitter .
Pour ceux que cela intéresse, il vous suffit d’éditer la méthode ‘show_openid’ et coller ligne 171 (avant les retours) le code ci-dessous:

if (strtolower($comment->comment_type) == 'tweetback')
{
$s = str_replace("twitter:",
"http://s3.amazonaws.com/twitter_production/profile_images/",
"$comment_name
");
}

Petite mise en garde pour finir, il n’existe pour l’instant aucune modération disponible dans la console admin (version 1.41) et j’ai été envahi de spams généré par des urls raccourcis de bit.ly

jiglibflash

Petite annonce sur la mailing-list de Papervision3D pour présenter jiglibflash.

Comme son nom l’indique, il s’agit d’un portage en ActionScript 3.0 de JigLib, moteur physique 3D avec gestion des rigid-bodies écrit en C++.

Beaucoup de classes du package physics et geometry référencent directement la classe DisplayObject3D de Papervision3D, et c’est bien dommage. Il aurait été souhaitable (et plus ambitieux peut-être ?) de consulter les teams des différents moteurs 3D Flash pour mettre en place une couche polymorphique qui permettent d’utiliser jiglibflash avec la librairie de son choix.

Au final, ce nouveau moteur physique est une initiative intéressante. De plus, la démarche est innovante car il s’agit de la première librairie Flash de ce type conçue en 3D native. Box2D est assez limitée dans un contexte 3D et Wow-Engine n’est qu’une surcouche de APE sans gestion des collisions.

Pour conclure, il ne reste plus qu’à espérer que la rigueur dans le développement soit au rendez-vous pour que les performances aillent de paire. (ex: Itérateur de boucle non typé).

Dans la démo officielle présentée ci-dessous, vous pouvez déplacer une sphère à l’aide des touches du clavier.
[kml_flashembed movie="http://www.tweenpix.net/files/jiglibflashtest.swf" width="450" height="300"/]

Une deuxième démo est disponible ici.

Facebook – Flash Client Library

Today, I spent few hours to play with Facebook Javascript client library. While I was playing with it, I started to build a little library to fit my needs for a game project.
I built something compact, there’s only 2 classes at the moment (client class and its event class). Sobriety !
It uses a JavaScript proxy like FaceBookBridge library from ZeroFractal, but the approach is a bit different. That’s a matter a lot of design and code perspective. I wanted simplicity and visibility, like remoting API.
Let me show you !

You have to make direct method calls on the client (as you would with JavaScript library). It returns a responder instance on each call:

var responder : EventDispatcher = client.Friends.get() as EventDispatcher;

To get some request results, you can suscribe listeners (as many as you want) to any responder:

responder.addEventListener(FacebookClientEvent.ON_RESULT, onFriends);
responder.addEventListener(FacebookClientEvent.ON_FAULT, onError);

And guess what, results are encapsulated in events passed as arguments to your callback methods:

public function onFriends( e : FacebookClientEvent ) : void
{
	trace ( e.methodName + " call: " + e.result.length );
}

Clean and easy as I like it.
Last but not least, you got some errors reporting. I had hard time on this part, coz the JS implementation was acting weird. I’m not even sure at this time to have understood the whole error process. I must finalize this part, few errors aren’t caught at this time but every transaction is logged in firebug with Debug.dump JS calls.

public function onError( e : FacebookClientEvent = null ) : void
{
	trace ( "onGetInfoError(" + "method:" + e.methodName
				+ ", error_code:" + e.result.error_code
				+ ", error_msg:" + e.result.error_msg + ")" );
}

Here’s a short demo to end the teasing around this project.
In this example, client retrieves all the name and profile photos urls of a user friends list through 2 API calls.

package
{
	import com.bourre.facebookflashapi.FacebookClient;
	import com.bourre.facebookflashapi.FacebookClientEvent;

	import flash.display.Sprite;
	import flash.events.EventDispatcher;

	public class FacebookClientTest
		extends Sprite
	{
		protected var client : FacebookClient;

		public function FacebookClientTest()
		{
			client = new FacebookClient();

			var responder : EventDispatcher = (client.Friends.get() as EventDispatcher);
			responder.addEventListener(FacebookClientEvent.ON_RESULT, onFriends);
			responder.addEventListener(FacebookClientEvent.ON_FAULT, onError);
		}

		public function onError( e : FacebookClientEvent = null ) : void
		{
			trace ( "onGetInfoError(" + "method:" + e.methodName
						+ ", error_code:" + e.result.error_code
						+ ", error_msg:" + e.result.error_msg + ")" );
		}

		public function onFriends( e : FacebookClientEvent ) : void
		{
			trace ( e.methodName + " call" );

			( client.users.getInfo( {uids:e.result, fields:["name", "pic_big"]} )
			as EventDispatcher).addEventListener(FacebookClientEvent.ON_RESULT, onGetInfo);
		}

		public function onGetInfo( e : FacebookClientEvent ) : void
		{
			for each ( var o : Object in e.result )
				trace ( "Nom:" + o.name + ", Image:" + o.pic_big );
		}
	}
}

I will release the source code under an open source licence when it’ll be a bit more polished for people who want to try it, and maybe I’ll make a video tutorial, who knows !

Facebook et la plateforme Flash

Facebook est en pleine expansion. Hier, Inside Facebook publiait hier un bilan assez impressionnant: « 150 millions d’utilisateurs, c’est un nouveau cap majeur franchi pour Facebook, dont la croissance s’envole à la fois aux Etats-Unis et dans le monde. A ce rythme, Inside Facebook estime que Facebook devrait dépasser les 200 millions d’utilisateurs dès le mois d’avril, soit dans environ 90 jours.« .

Avec l’apparition en Juillet dernier de Facebook Connect l’interopérabilité applicative (Digg, Six Apart, Twitter, Apple, Kongregate, Seesmic, Vimeo…) bat son plein et les sollicitations de la bible du marketing sur Facebook ne laissent pas insensible le développeur Flash lambda (et surtout ceux qui l’emploient soit dit au passage). Maintenant, il se demande comment il va pouvoir rivaliser avec ses détracteurs ajaxiens et lancer la prochaine application hype qui fera baver son réseau dans une débauche d’effets multimédias dont lui seul a le secret. Il se pose la question phare: Quelles sont les possibilités d’intégrations de Facebook au sein du player Flash et par extension au sein de la plateforme Flash (Flex et Air) ?

J’ai fait quelques recherches, et je dois avouer que le terrain est encore assez vierge. Le web abrite quelques projets plus ou moins sérieux: Facebook AS2 Client, facebook-as3, facebookas3lib ou encore as3facebooklib.
La librairie la plus solide à ce jour est Facebook Actionscript API de Jason Crist qui propose une implémentation assez complète de l’API REST Facebook en ActionScript 3.0. On déplorera par contre l’activité en standby et la mauvaise qualité des exemples. Mais là où le bât blesse le plus, et c’est d’ailleurs l’inconvénient de la majorité des librairies Flash proposées, c’est la publication de la secret key dans le bytecode du swf. Cela rend la librairie inutilisable en l’état, du moins dans le cadre d’un projet sérieux quand on sait avec quelle facilité le code source d’une application Flash est décompilable.

En termes de sécurité, on préférera l’alternative intelligente FacebookBridge de ZeroFractal. Ce set de 3 classes déploit un proxy (par le biais d’ExternalInterface) qui permet à votre application Flash de communiquer avec la librairie client JavaScript de Facebook. Le seul inconvénient ici, c’est l’absence de typage dû à la communication avec JavaScript sous forme de boîte noire.

On en vient à se demander si la solution ultime ne serait pas un système capable d’intègrer la partie sécuritaire avec un proxy JavaScript (pour la prise en charge des cookies) et de proposer en aval une implémentation complète de l’API REST Facebook en ActionScript 3.0. Affaire à suivre !

Twitter ouvert ?

Pendant que tout le monde buzze sur la macworld keynote 2009, je me suis arraché les cheveux à tenter d’implémenter une partie de l’API rest de Twitter en ActionScript 3.0.
Aucune méthode authentifiée ne passait et j’avais juste en retour un joli message d’erreur peu explicite:
Error #2044: ioError non pris en charge : text=Error #2031: Erreur de socket. URL: localhost

Avec l’aide de Charles qui m’indiquait l’absence de mes headers (Authorization-Basic), et une bonne dose de patience, j’ai fini par comprendre que cela venait d’une limitation du crossdomain qui interdisait les http request headers venant de l’extérieur du domaine.

Etonnant pour un service web 2.0 dit ouvert ?

Le seul workaround que j’ai trouvé pour l’instant, c’est de builder une appli AIR pour bypasser ces limitations.
Il reste une dernière possibilité (non testée), déployer un proxy server-side pour acheminer les requêtes. Mais bon, c’est pas la panacée pour du développement applicatif.

Au final, je suis un peu déçu, non seulement par les contraintes de l’API pour les développeurs Flash, mais aussi par l’absence de documentation sur le sujet !