vendredi, juin 23 2006

LAlex.fr

Yepa!!! Juste un p'tit mot de joie pour dire que j'ai reussi a avoir lalex.fr... Je ne sait pas encore si ca va pointer sur le même site ou pas...

Ca fait du bien de se sentir localisé! 8)

mardi, juin 13 2006

Livre avec des pages

... oui bon, les livres sans pages ca existe pas, mais je trouvais pas de titre! :$

Il m'a été demandé recemment d'améliorer un livre dont les pages se tournent. Le script utilisé jusqu'à maintenant était celui dont j'ai déjà parlé sur ce blog, le fameux pageFlip. Il est vrai que le mouvement des pages est admirable de souplesse, mais il posait quelques problèmes que j'avais à résoudre:

  • Déjà, divers bugs
  • Il fallait pouvoir appliquer un effet (Flash 8) au livre
  • Le livre devait se centrer automatiquement lors de la première ou de la dernière page
  • Il fallait donner la possibilité d'inclure un zoom sur les pages
  • Il fallait pouvoir charger un SWF externe à l'animation
  • Il fallait pouvoir lancer un diaporama (déjà possible avec pageFlip, mais plus galère)

Si, comme je l'ai dis, le mouvement de pageFlip est admirable, il faut bien avouer qu'il n'en est pas de même pour la lisibilité du code! :\ Autant le dire, rajouter ce type de fonctionnalité au code existant, c'était mission impossible. J'ai donc recodé le moteur de A à Z, replongeant pour l'occasion dans les calculs de vecteurs, intersections de droites, et autres considérations du programme de maths de 1ere... Le calcul des matrices pour les dégradés des ombres (dont je ne m'étais jamais servis) m'a aussi pas mal accaparé. Sans compter le fait de redessiner systématiquement les contours du livre pour pouvoir appliquer des effets, étant impossible de le faire sur un composant....

Une autre problèméatique était aussi de rendre le composant "accessible", étant donné que c'est un graphiste pas codeur pour un sou qui devra s'en servir.

Bref, voilà mon resultat (sans preloading, pour moins de 700Ko):

Les images sont d'un dessinateur Chilien que j'ai découvert sur deviantart: pyromaniac

Le site auquel est destiné ce livre sera bientôt en ligne, je ferais une mise à jour à ce moment là ;)

vendredi, juin 9 2006

Number = parseInt

Number, en plus d'être une classe, est également une fonction, tout comme le sont Array, Boolean et String. Elle permet de convertir un objet quelconque en une instance de Number.

Seulement, ce qui n'est pas précisé dans la doc, c'est que cette fonction suit les mêmes règles que parseInt, sans pouvoir toutefois lui passer de second paramètre, qui précise dans quelle base doit se faire la conversion. Ce qui signifie que :

  • Les chaines de caractères commencant par "0x" seront considérées comme héxadécimales
  • Les chaines de caractères commencant par "0" seront considérées comme octales.

Et c'est sur ce dernier point que je me suis fait avoir, en cherchant un long moment pourquoi mon "062" devenait 50... :\ J'ai donc du remplacer toutes mes conversions :var num:Number = Number("062") // num = 50
// par
var num:Number = parseInt("062", 10) // num = 62

Donc voilà, si ca peut profiter à quelqu'un.. ;)

mercredi, mai 10 2006

Constructeur et arguments

Lors qu'une classe hérite d'une autre, tout l'interêt est bien évidemment de ne pas réimplémenter les methodes de la classe mère. En effet, en l'absence d'une méthode portant le nom demandé, la méthode de la classe mère est appelée, transmettant ainsi tous les arguments. Eh bien ce qui est dommage, c'est que ce n'est pas le cas du constructeur... :\

En effet, si une classe mère prend un argument en paramètre, et qu'une classe fille hérite de cette dernière sans implémenter de constructeur, les paramètres passés au constructeur de la classe fille ne seront pas transmis.

La preuve par l'exemple: j'utilise actuellement un ensemble de managers gérant chacun des objets (Contacts, Articles, etc...) dont les classes implémentent toutes la même interface. Le but est donc de créer un manager "de base" (non instanciable) qui factorise les comportements communs... Chaque manager est lié à un contexte dans l'application, qui est passé en paramètre au constructeur du manager:
/* == Classes utilisées
interface Item
class Contact implements Item
class Context
*/

// Classe mère
class BaseManager {
   private var _context:Context;
   private var _selectedItem:Item;
   // Le constructeur prend un paramètre
   private function BaseManager(ctx : Context) {
      _context = ctx;
   }
   public function getContext() : Context {
      return _context;
   }
   public function getSelectedItem() : Item {
      return _selectedItem;
   }
   private /*protected*/ function setSelectedItem(i : Item) {
      if (i != _selectedItem) {
         _selectedItem = i;
         dispatchEvent({type:"selectionChanged", selected:_selectedItem});
      }
   }
}
class ContactManager
   extends BaseManager {
   // Force le typage à 'Contact'
   private function setSelectedItem(c : Contact) {
      super.setSelectedItem(c);
   }
   public function getSelectedContact() : Contact {
      return Contact(getSelectedItem());
   }
}
// Création du contexte
var ctx:Context = new Context("mainApp");
// Création du ContactManager
var contactManager:ContactManager = new ContactManager(ctx);
// Affichage du contexte
trace(contactManager.getContext()); // undefined
Ceci est trés certainement du à la conversion en AS1. En effet, en AS1, déclarer une classe revient à déclarer son constructeur, et donc a relayer "manuellement" les paramètres du constructeur si besoin. Le "compilo" AS2 du coup crée automatiquement un constructeur dont le code est:function ContactManager() {
   super();
}
alors que dans mon cas, il faut que je crée le constructeur moi-même:function ContactManager(c : Context) {
   super(c);
}

C'est peut-être déjà connu de beaucoup, mais moi j'ai cherché un p'tit moment quand-même... Bref, cela revient encore et toujours au problème d'appeler le constructeur d'une classe mère avec un nombre indéfini d'arguments (l'idéal étant avec apply)... :\

mercredi, avril 5 2006

Flash Player 7 pour PocketPC

Il est beau, il est tout neuf! 8) Le Flash player est enfin disponible en version 7 pour les plateformes PocketPC. Le geek que je suis va enfin pouvoir se pavaner avec ses propres applications sur son téléphone! :mrgreen:

Pour le téléchargement, rendez-vous sur la page dédiée du site de Macromedia, euh.... Adobe pardon! :$

mercredi, mars 8 2006

RIA et gamedev : naissance d'une reference

La leçon d'aujourd'hui consiste à étendre ses connaissances en Flash, notamment en terme de composants et de programmation videoludique. Pour cela, foncez sur gumBlog, le tout nouveau blog de l'ami Foxy, qui vient tout juste d'ouvrir. 8)

Allez, on ouvre son aggregateur, on on copicolle l'adresse du fil RSS! Plus vite que ca! :P

mercredi, mars 1 2006

Librairies AS3 : plein d'APIs qu'elles sont bien

Un certain nombre de librairies AS3 viennent d'être mises à disposition sur Adobe Labs. Elles offrent un accés à quelques API comme RSS, Atom, Flickr, et bien d'autres. Du feedback est le bienvenu évidemment! ;)

Arghhhh, ce que c'est rageant de ne pas avoir le temps de me mettre à l'AS3... :(

mercredi, février 15 2006

Switch/case original : tester la classe d'une variable

Pour ceux qui ne lisent pas la mailing-list de OSFlash, Ralf Bokelberg y donne une petite astuce pour tester la classe d'une variable, et de manière plus globale comment éviter une succession de if...else if...else.

En fait, le switch...case a pour limitation de ne servir qu'à comparer une valeur à une autre (ou plusieurs autres), alors qu'un if va vérifier si une condition est vraie. Mais, et c'est là qu'est l'astuce, vérifier si une condition est vraie consiste uniquement à comparer son résultat à true... et voila! 8) Petit exemple:public static function getEnvironement(eng : Engine) : String {
        var env:String = "Twilight zone";
        switch(true) {
                case (eng instanceof Boat):
                        env = "Water";
                        break;
                case (eng instanceof Car):
                case (eng instanceof Motorcycle):
                case (eng instanceof Bus):
                        env = "Road";
                        break;
                case (eng instanceof Plane):
                        env = "Sky";
                        break;
                case (eng instanceof Spacecraft):
                        env = "Outerspace";
                        break;
                default:
                        trace("ET???");
        }
        return env;
}

C'est peut-être connu, et certainement utilisable dans de nombreux langages, mais moi j'ai découvert aujourd'hui, et je trouve l'astuce bien élégante! ^^

vendredi, février 10 2006

Flashead : la formation par la pratique

Didier Brun aka Foxy, programmeur Flash freelance de son état, propose aujourd'hui une structure de formation d'une nouvelle forme : Flashead. Basée sur des années d'experience sur le terrain et dans le domaine de la formation, cette formule originale propose à tous de se former à la programmation Actionscript sur des cas concrets, avec à la fin de chaque section un veritable module qui tourne, directement utilisable dans le travail quotidien de tout programmeur AS! Vous l'aurez compris, cela consiste à rendre le stagiaire operationnel dés sa sortie de la session de formation.

Super concept, formateur trés compétent, Flashead ne peut être qu'une réussite! 8)

lundi, février 6 2006

Compilo MM : ennemi du futur!

Une matinée entière à se casser les neurones sur un stupide problème de compilation. :\ En effet, un code qui fonctionnait parfaitement avant le week-end refusait de se compiler ce matin. Aucun modification depuis, mais je me retrouvais avec un message : "The name of this class conflicts with the name of another class"... Changement de classpath, modification des chemins, suppression des .aso, j'ai tout essayé!

Au final j'avais avancé de deux mois la date de mon ordi pour des tests de versions trial limitées dans le temps, fait 2-3 modifs à mon code, recompilé, et une fois tout ça opérationnel, je suis revenu à la date en cours... Eh ben le compilateur de Flash est incapable de gérer des fichiers dont la date de création est dans l'avenir.

La solution m'est venue du blog des développeurs de XPComponent, confronté à une problématique bien plus fréquente qui est celle du travail entre plusieurs duseaux horaires... J'en profite donc pour diffuser l'info afin d'éviter les frappages de tête contre le mur à ceux qui se retrouveraient face au même problême! :P

jeudi, janvier 5 2006

Connecteur à la console SOS

Le passage à FDT n'est pas toujours sans douleurs... Les habitudes évoluent, et la façon de coder varie inmanquablement. Un des problèmes auxquels je me suis trouvé confronté a été l'utilisation de la commande 'trace', que l'on peut bien évidemment remplacer par un appel de méthode via l'option -trace de MTASC... Comme j'en ai déjà parlé, j'utilise la console SOS, pour le côté pratique de la connexion socket que sont la connexion à une console sur une machine distante, ou la gestion d'une couleur de fond différente par application (TRES utile !!!)

Le moyen que j'utilise aujourd'hui afin d'éviter les problèmes de non-importation de la classe s'occupant de se connecter à la console consiste à créer un petit répertoire utilitaire contenant les classes utiles à FDT, et de l'inclure dans mes "Linked librairies", et d'en appeler une méthode start(). Pour l'instant, seule le connecteur à la console est présent, mais il se peut que d'autres suivent (notamment mon petit framework de profiling, a venir plus tard :P)

Bref, voici ma classe SOSTracer, utilisée par MTASC avec l'option -trace SOSTracer.out :
/**
 * @author LAlex
 * @version 0.1
 * @since 2006-01-05
 */

class SOSTracer {
        // Console infos
        public static var SOS_HOST:String = "localhost";
        public static var SOS_PORT:Number = 4444;
        // Used for static method 'out'
        private static var __instance:SOSTracer;
        // Used for line number display
        private static var __lineNumber:Number = 1;
        // Allow to display line numbers
        public static var enableLineNumber:Boolean = false;
        // Static function, used for MTASC -trace option
        // SOSTracer.start() must be called before
        public static function out(o) {
                __instance.trace(o);
        }
        // Launch the static SOSTracer with
        // given background color
        public static function start(col:Number):Boolean {
                __instance = new SOSTracer(col);
                return true;
        }
        private var _bufferize:Boolean = true;
        private var _socket: XMLSocket;
        private var _isConnected:Boolean = false;
        private var _color:Number;
        // For later ;oP
//      private var _itv:Number = -1;
        // Buffer
        private var _stack: Array;
        function SOSTracer(col:Number) {
                if (col != undefined) {
                        _color = col;
                }
                _stack = [];
                _socket = new XMLSocket();
                _socket.onConnect = function (suc) {
                        var tr = arguments.callee.tracer;
                        tr._connected(suc);
                };
                _socket.onConnect.tracer = this;
                _socket.connect(SOS_HOST, SOS_PORT);
        }
        // Launched on socket connection
        private function _connected(sc:Boolean) {
                if (sc) {
                        if (_color != undefined) {
                                _socket.send("!SOS<appColor>" + _color + "</appColor>");
                        }
                        _flush();
                        _isConnected = true;
                } else {
                        _bufferize = false;
                        throw new Error("SOS Socket connection failed");
                }
        }
        // Flush buffer
        private function _flush() {
                while(_stack.length) _socket.send(_stack.shift());
        }
        // Display a string (or object representation)
        public function trace(o) {
                var no:String = (enableLineNumber ? "[" + __lineNumber++ + "] " : "") + o.toString();
                if (_isConnected) {
                        _socket.send(no);
                } else if (_bufferize) {
                        _stack.push(no);
                }
        }
}
Le but est ici d'être indépendant de tout autre package, d'où l'utilisation d'une classe XMLSocket "de base" (j'en ai implémenté une plus évoluée), et l'utilisation d'un Delegate "à la main" :P Afin d'éviter de surcharger la connexion, je prévois ensuite d'utiliser un système de bufferisation éventuel, au moyen du buffer utilisé avant la connexion, et d'un setInterval (vous avez surement remarqué que la propriété pour l'intervalle est déjà prévue, mais pas utilisée encore :$). Pour l'utiliser, rien de plus simple, je lance un start() dans mon main et j'utilise trace() dans mon code : public static function main() {
        SOSTracer.start(0XFFFFCC); // Couleur de fond dans la console
}

Pour le déploiement, il suffit de changer dans MTASC l'option -trace SOSTracer.out par -trace no, et de commenter la ligne SOSTracer.start() (pas de import à commenter, du fait de l'absence de package 8))

::Télécharger SOSTracer.zip::

mardi, janvier 3 2006

Offre d'emploi : codeur AS2

Mon employeur est à la recherche d'un autre développeur Flash pour travailler avec moi (chercher le café, apporter les affaires au pressing, etc... Naaaan, j'déconne :P). Etant donné que je suis sequestré au bureau tant qu'on a pas 10 CV, je pousse un peu la propagande via mon blog! :mrgreen:

Plus sérieusement, l'ambiance est bonne, l'équipe jeune et compétente, et le travail passionnant : une vraie boite d'informaticiens! :) C'est un CDD menant à un CDI, et ça se passe à Sophia Antipolis (06), technopole sous le soleil de la région niçoise. 8) Voici le libellé de l'annonce :

Centile est une société de développement de serveurs Java de Voix sur IP en pleine croissance (actuellement une trentaine de personnes).

Nous avons développé un softphone en ActionScript 2. L'application a beaucoup de succés, et nous recevons de nombreuses demandes de fonctionnalités supplémentaires (Instant messaging, Vidéoconférence, Envoi de mails...). D'autres applications clientes sont également destinées à être développées en Flash/AS2.

Nous sommes à la recherche d'un développeur AS2 capable d'être rapidement opérationnel à mes côtés.

Outils utilisés :
1) Flash MX 2004 Professionel / Eclipse+FDT (ou ASDT, SEPY, ...)
2) MDM Zinc V2

Profil recherché :
Nous recherchons une personne passionnée, dynamique, ayant l'esprit d'équipe, autonome et ayant surtout une forte capacité d'assimilation.

Compétences techniques :
1) Indispensable
- Actionscript 2 avancé

2) Fortement souhaité
- Connaissances dans le développement d'applications Client/Serveur en AS2.
- Connaissances du développement flash "Standalone", pour applications autonomes Windows/Linux/MacOS.
- Connaissances des techniques d'optimisation de la mémoire et du CPU pour Flash.
- Connaissance d'un language de programmation objet (C++, C# ou Java)

3) Serait un gros plus
- Expertise dans une ou plusieurs technologies Microsoft (développement de plugins et de dll).
- Expertise dans les algorythmes de sécurité et encryption.
- Expertise en ergonomie et design graphique.
- Expertise dans le webdesign.

Rémunération :
Entre 30K€ et 40K€ selon compétences

Vous pouvez envoyer votre CV à flash.job@centile.com

Bon courage à ceux qui sont interessés! ^^

jeudi, décembre 22 2005

Simuler une énumération et/ou des contantes

Il peut être trés pratique, voire parfois indispensable pour obtenir un code "clean", de ne pouvoir passer une valeur à une méthode, qui doit obligatoirement être une des valeurs "possibles"... C'est ce que l'on appelle des énumérations. Java gère cela nativement grâce à la classe Enum.

De même, avoir la possibilité de créer des constantes est également bien utile. Dans la pratique, il s'agit en fait de créer une propriété statique en lecture seule. Le moyen le plus sûr de faire cela serait de créer une variable statique privée, et un getter statique public.

Voici ce que cela pourrait donner dans le cadre d'une classe d'encryptage:
class Crypter {
        // Private static members
        private static var _NONE:String = "none";
        private static var _MD5:String = "md5";
        private static var _SHA1:String = "sha1";
        // Public constants
        public static function get NONE():String {
                return _NONE;
        }
        public static function get MD5():String {
                return _MD5;
        }
        public static function get SHA1():String {
                return _SHA1;
        }
        private var _cryptMode:String;
        function Crypter(mode:String) {
                _cryptMode = mode;
        }
        function encrypt(s:String):String {
                // Case use private vars, to avoid decreasing
                // performances by using a getter
                switch(_cryptMode) {
                        case _NONE:
                                return s;
                        case _MD5:
                                var md5crypted:String = "";
                                // Perform MD5 cryptage
                                return md5crypted;
                        case _SHA1:
                                var sha1crypted:String = "";
                                // Perform SHA1 cryptage
                                return sha1crypted;
                }
        }
}
// Usage
var myCrypter:Crypter = new Crypter(Crypter.MD5);
trace(myCrypter.encrypt("String to be encrypted"));
Bien que tout cela soit quand-même assez clean, cette implémentation pose quelques problèmes:

  • Tout accés aux constantes (de l'exterieur) fait appel à un getter, et donc les performances peuvent s'en ressentir, selon la fréquence de ces accés
  • Il est possible de passer au constructeur une chaine de caractères qui ne fasse pas partie des valeurs attendues en entrée... Cela peut se résoudre avec un default: dans le case, mais ce n'est pas vraiment une solution satisfaisante...
Dans les premières betas de la librairie de petepx, pixLib, j'avais noté l'utilisation trés élégante qu'avait fait Francis de l'héritage de String pour le typage de ses types d'évenements (classe EventType si je ne m'abuse). A priori, il s'agissait surtout, dans ce cas, de polymorphisme avec EventDispatcher de Macromedia, mais j'ai alors étendu le concept pour pouvoir créer mes énumérations, dans une classe externe.// Enum
class CryptMode
        extends String {
        public static var NONE:CryptMode = new CryptMode("none");
        public static var MD5:CryptMode = new CryptMode("md5");
        public static var SHA1:CryptMode = new CryptMode("sha1");
        private function CryptMode(content:String) {
                super(content);
        }
}
class Crypter {
        private var _cryptMode:CryptMode;
        function Crypter(mode:CryptMode) {
                _cryptMode = mode;
        }
        function encrypt(s:String):String {
                // Case use private vars, to avoid decreasing
                // performances by using a getter
                switch(_cryptMode) {
                        case CryptMode.NONE:
                                return s;
                        case CryptMode.MD5:
                                var md5crypted:String = "";
                                // Perform MD5
                                return md5crypted;
                        case CryptMode.SHA1:
                                var sha1crypted:String = "";
                                // Perform SHA1
                                return sha1crypted;
                }
        }
}
// Usage
var myCrypter:Crypter = new Crypter(CryptMode.MD5);
trace(myCrypter.encrypt("String to be encrypted"));
Cette méthode à tous les avantages:
  • Impossible de rajouter des constantes non-prévues au runtime, du fait du constructeur privé.
  • Toujours grâce au constructeur privé, impossible de modifier la valeur d'une constante, bien qu'il s'agisse d'une propriété publique.
  • Impossible de passer une valeur non prévue à une méthode, si l'argument est typé avec l'énumération.
  • Une compatibilité avec les types de bases. Bien que l'exemple se base sur un héritage de String, il est bien sûr possible de l'utiliser sur n'importe quel type "de base" (Number par exemple) comme sur des types plus complexes. Le '==' continue de fonctionner par exemple :trace(CryptMode.MD5 == "md5"); // true
  • Petit bémol, le switch...case semble utiliser une comparaison stricte (===), donc ne pas oublier de faire un toString() ou valueOf() dans ce cas... ;)
  • Remplace presque parfaitement le fait de ne pas pouvoir créer de constantes dans les interfaces, offrant ainsi la possibilité de disposer d'une série de valeurs dans la création d'une API "pure" (sans aucune implémentation).

Bref, je suis assez content d'avoir trouvé ce moyen de rendre mes codes un peu plus clean. J'utilise dorénavant énormément cette astuce, notamment concernant la diffusion d'évenements, en créant une classe collection contenant les évenements diffusables par une classe définie, puis en utilisant le typage dans la signature de mes addEventListener (en parlant de ça, bientôt un tool de diffusion d'évenements maison).

Wala, wala! ^^

mercredi, décembre 14 2005

IDE : Eclipse et FDT

Je n'avais jamais vraiment voulu changer d'environnement de développement. SEPY associé au compilo Flash fonctionnait trés bien, surtout que SEPY permet de compiler directement dans Flash d'un simple CTRL+ENTREE, habitude que j'avais prise depuis bien longtemps, alors que les éditeurs externes n'étaient pas au point, et que je codais donc dans l'IDE Flash...

Puis, la taille du projet sur lequel je travaille devenant de plus en plus importante, les temps de compilation se sont rallongés de manière assez exponentielle... C'est alors, qu'il y a 2 jours, lassé de passer plus de temps à regarder la jauge de compilation plutôt qu'à coder, j'ai tenté une intégration de MTASC dans mon processus de dev. Là-dessus rien à dire: SEPY gère vraiment trés bien cette intégration (avec un raccourci CTRL+SHIFT+ENTREE, comme le mode debug de Flash :P), ouvrant une petite pop-up pour saisir les paramètre de MTASC, et un deuxième onglet pour afficher le SWF. Restait le problème de la sortie standard, vite réglé avec l'option -trace de MTASC et la trés agréable console de LuminicBox...Notez que SEPY est disponible en beta 1.5, parfois buggy, mais bien agréable la nouvelle barre latérale ;))

Mais je suis entouré de codeurs Java au travail. Et évidemment, voir des programmeurs utiliser un JBuilder rempli d'une foultitude de fonctionnalités interessantes en terme de gestion d'un projet de développement, c'est tentant! :P Alors, ayant entendu de nombreuses appréciations positives sur Eclipse, j'ai un peu louché de ce côté là, malgré mes réticences (IDE en Java, grosse application bien lourde...). Je m'y étais déjà tenté, mais avec peu de succés, et je n'en gardais pas le meilleur souvenir...

Evidemment, le premier réflexe fut de me tourner vers les solutions OpenSource, notamment la fameuse combinaison FAME (Flashout, ASDT, MTASC, Eclipse), en laissant le peu de travail à faire pour la création du SWF de base à Flash. Je dois avouer que je me suis complètement perdu... Ca ne doit pas être bien compliqué, mais je n'ai rien trouvé d'intuitif dans l'installation et l'utilisation de la fameuse combinaison, pourtant si prometteuse...:( Je ne dis pas que ca ne vaut pas le coup, mais juste que moi je ne suis pas arrivé à m'en servir correctement....:$

Restait Flash Developper Tools (FDT), sur lequel je partais avec un avis positif mais dubitatif quand-même. Une première installation, rentrant quelque peu en conflit avec mon FAME m'a plutôt refroidi. Mais pas découragé pour autant, je choisi de supprimer totalement eclipse et de partir sur une installation "clean"... Eh bien en un mot comme en cent, C'EST LE BONHEUR!!! 8) Je ne suis pas prêt de lacher cet IDE dorénavant... La gestion des classes est parfaite, l'autocomplétion, l'ouverture d'une classe depuis une autre par un simple raccourci clavier, la visualisation facile des chaines d'héritages, des surcharges de méthodes, l'organisation automatique des imports, etc... Bref, ca change la vie! Associé à la console SOS (des développeurs de FDT), on se retrouve avec tous les outils permettant d'augmenter sa productivité d'une manière incroyable... Je regrette juste que SOS ne soit pas un pugin eclipse, le tout-intégré c'est plus pratique quand-même!

Enfin bref, la conclusion de ces aventures est donc que je vous conseille vivement FDT. Certes, ce n'est pas gratuit (moi-même, je suis encore en Trial), mais les 200 euros demandés sont largement justifiés...:D

vendredi, décembre 9 2005

Bug du compilateur Flash 8 (...et moins?)

Le compilateur de Flash 8 semble contenir un bug qui, s'il est mineur, peut provoquer quelques arrachages de cheveux. En fait, lorsque l'on hérite d'une classe en précisant son chemin complet (donc sans import), le compilo va la considérer comme importée, mais ce n'est pas le cas à l'éxecution. La où l'on s'attend donc à obtenir une erreur de compilation, tout se passe bien, et on comprend donc mal où est l'erreur... :\

Petit exemple :class com.lalex.myappli.CustomSocket extends com.lalex.net.ExtendedSocket {
   function CustomSocket() {
      /**
      * ExtendedSocket.CONNECT_FAILED sera 'undefined'
      * car on a pas importé com.lalex.net.ExtendedSocket
      * Pourtant, le compilo laisse passer
      */

      addEventListener(ExtendedSocket.CONNECT_FAILED, this, handleConnectionFail);
   }
   private function handleConnectionFail(o) {
      trace("Connection failed");
   }
}

Bon, je vous l'accorde, on pourrait dire "Ben il n'avait qu'à importer la classe", ou "Il n'avait qu'à donner le chemin complet de la classe!"... mais le compilateur n'est-il pas là pour nous signaler ce genre d'oublis? :o

Flash Media Server 2 revoit sa politique tarifaire

Ca y est, c'est fait! Macromedia, face à la grogne des développeurs et hébergeurs a revu sa copie concernant le pricing de Flash Media Server 2.

En attendant que tout le système de licence soit ré-implémenté, Macromedia propose une licence "Interim", qui permet pendant 90 jours de profiter de 2500 connexions simultanées pour une bande passante limitée à 25Mbps. Cette licence sera ensuite renouvelable définitivement. Une trés bonne nouvelle pour les développeurs d'applications "data", qui préfèrent utiliser FMS2 à un serveur de socket XML, pour des applications telles que des jeux multi-utilisateurs ou de la messagerie instantanée.

Ca fait plaisir de voir que Macromedia écoute ses utilisateurs... Pourvu que Adobe en fasse de même... :o

mercredi, novembre 16 2005

Flash Media Server 2 disponible!

Flash Media Server 2 est enfin disponible! Plein de choses qu'elles sont bien, comme les connections côté serveur a des XMLSocket, XML et autre LoadVars. Pour moi, il s'agit également d'une découverte des fonctionnalités de base de FCS. J'apprécie beaucoup la simplicité avec laquelle on peut créer des applications multi-utilisateurs, ou des échanges de flux audio/video! 8) Bon, ils auraient quand-même pu faire l'effort de l'AS2, surtout que le compilo AS1->AS2 existe déjà... :P

Seulement voilà, le débat fait rage. Le changement de nom de Flash Communication Server en Flash Media Server influe énormément sur les différentes licences proposées. En effet:


  • les licences FCS étaient plus orientées sur les applications "data" (chat, jeux multi-user) qui nécessitaient de nombreuses connexions avec peu de bande passante. Elle pouvaient tourner sans problème sur une licence pro, offrant 2500 connexions simultanées pour une limite de 10Mbps, ce qui est largement suffisant pour de l'échange de données brutes.
  • les licences FMS, elles, sont orientées sur les applications "media", avec un nombre de connexions assez limité mais sans limite de bande passante, ce qui est idéal pour la diffusion de contenus multimedia. Ainsi, la licence pro permet 100 connexions simultanées. Le problème étant que les applications "data" se retrouvent pénalisées, car pour avoir 2500 connexions simultanées, on se retrouve a devoir acheter 25 licences. Pour exemple, un provider qui voulait acheter pour 250.000$ de licences FCS se retrouve maintenant avec un investissement de 5.625.000$ à faire en licences FMS pour les mêmes capacités! En fait, il lui est possible de ne payer "que" 1.125.000$ en utilisant les licences Origin, mais ca fait quand-même du 450% d'augmentation! 8O

Cela pose un énorme problème, surtout qu'avec la sortie de FMS2, FCS n'est plus du tout vendu, et donc son système de licence n'est plus disponible... :( De nombreux développeurs de multi-user vont donc probablement se tourner vers des solutions de type SocketServer, ou pourquoi pas vers le trés prometteur Red 5 qui se pose aujourd'hui comme la seule alternative OpenSource à FCS/FMS avec de nombreuses features supplémentaires!

Un trés mauvais point pour Macromedia, qui devrait perdre du coup un grand nombre de développeurs, et donc de clients (car n'oublions pas que les développeurs sont quand-même les premiers commerciaux de Macromedia)! :\

PS: La solution de Macromedia en terme d'échange de données temps-réel nous viendrait peut-être de Flex, avec les Data Services de Flex Enterprise Services 2 qui peuvent, entre autres, utiliser le protocole RTMP.

mardi, novembre 15 2005

Typage :Object, le retour

Eh oui, ce détail anodin du compilateur qui nous empêchait de typer avec Object est enfin résolu dans Flash 8. Je trouve ca bien, ca permet de spécifier explicitement que n'importe quel objet peut être transmis en paramètre ou affecté à une variable, et cela fait aussi bien la différence aussi entre une méthode qui ne retourne rien (Void) et un objet quelconque (Object)... 8)

PS: Je suis en plein dans les entrailles de la communication temps réel actuellement: Flash Media Server 2 et connexions XMLSocket... Je devrais avoir de la matière sur ce blog prochainement! ;)

lundi, octobre 24 2005

Pas le temps... mais pourquoi ?

Eh oui, je viens de le dire, je n'ai pas beaucoup de temps pour faire de la veille technologique en ce moment... En fait, il s'agit surtout de finir mes projets actuels, afin de prendre un nouveau départ!!!

En fait, je quite bientôt mon employeur actuel (avec une petite larme à l'oeil, CTC va me manquer quand-même :(), pour rejoindre l'équipe de Centile (avec la banane aux lèvres :D) pour un projet passionnant! Au coeur de ce que l'on peut appeler un "paradis pour développeurs" (y a que ca là-bas) dans ce qui semble être une super ambiance, ca va coder dur, et surtout en ActionScript (ben oui, malgré les nombreuses années depuis lesquelles je code en AS, c'est quand-même la première fois que c'est un travail a plein-temps, non freelance :P). Une nouvelle compétence chez eux, qui utilisaient plutôt des langages plus "institutionnels" (Visual, Java, ...). Bon, il faut avouer que celui qui a fait la première maquette est carrément balaise quand-même! 8)

Au programme, connexion serveur temps réel et applications "standalone" de type mProjector... Je boût d'impatience! :mrgreen:

Pas le temps ! Pas le temps !

Argh... Que de nouveautés... Je vous passerai l'annonce de la sortie de AS3 avec l'alpha1 de Flex 2 avec quatre train de retards... :$ Pensez aussi que MySQL5 vient de sortir, tout en entrant dans la cours des grands avec triggers et procédures stockées, de quoi s'assurer de modèles de données robustes...

Bon, j'espère que je trouverai bientôt un peu de temps aprés avoir fini le TAF en cours pour me lancer dans l'AS3 (j'en suis encore au stade de dessiner un carré, vive drawRect() :mrgreen:)...

- page 3 de 15 -