• Billet écrit dans : APE Project 28.01.2010 2 Réactions !!

    Depuis quelques semaines je travaille sur la création d’un chat conçu sur APE Project (http://www.ape-project.org/ajax-push.html).

    Pour faire simple c’est un serveur temps réel conçu pour fonctionner simplement avec du Javascript. En gros on code le serveur et le client directement en Javascript, le moteur se chargeant de transformer notre code serveur en instruction C. Du coup ça pulse et c’est léger.

    En fait tout le fonctionnement est à base d’événement, comme on pourrait le faire en Flash avec Red5 ou autre. C’est à dire que le serveur envoie des évent (appelé raw), le client les reçoit, en renvoie – on peut créer nos propres évènements (appelé commande).

    Le système est souple et au final on n’a pas besoin de serveur Flash ou de client Flash pour des besoins simple (comme un tchat). Je vous l’accorde, les serveurs Flash son bien plus complet (vidéo notamment), mais pour ce genre de besoin,pas la peine de prendre le marteau pour écraser la mouche.

    Au final il est assez simple a prendre en main bien qu’il faut avoir le déclic à un moment pour synthétiser toute leur doc assez disparate. En effet la doc est sur le google group, le wiki, sur une page doc, sur les channels IRC .. Bref pas évident de s’y retrouver au début.

    Loin de moi l’idée de faire des tutoriels pour le prendre en main, mais je vais essayer de faire des articles sur des points précis concernant des fonctionnalités que j’ai développé et des soucis que j’ai rencontré.

    Billet écrit dans : APE Project 28.01.2010 2 Réactions !!
  • Billet écrit dans : Découverte PHP, Symfony 03.10.2009 4 Réactions !!

    J’ai (re)découvert un truc vraiment sympathique au boulot c’est le système de behavior doctrine intégré à symfony.

    Hein ? Mais à quoi ça sert ?

    Ce que j’en retiens c’est que cela peut permettre d’automatiser certaines actions (répétitives) à l’enregistrement en base, et donc d’enrichir son modèle et deux coup de cuillère à pot.

    Prenons un exemple, vous devez faire un site basé sur la créations de contenus par vos utilisateurs. Ils peuvent écrire des billets, commenter, s’envoyer des messages privés, gérer un annuaire .. bref un site où l’on doit quasiment tout relié à un utilisateur. Chaques tables auraient donc au moins un « user_id » comme clée étrangère ce qui implique dans vos actions d’associer l’utilisateur courant à l’objet pour le sauvegarder .. et ce pour chaque table … lourd non ?

    Hé bien grâce aux behaviors vous pouvez sortir ce comportement générique dans des classes et avec seulement de la configuration au niveau de votre schéma, vous pouvez associer ce comportement à n’importe quel table. L’exemple que j’ai pris est tiré du behavior « Signable » du plugin sfDoctrineActAsSignablePlugin.

    Configuration

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Item:
      actAs:
        Signable:
      columns:
        id:
          type:             integer
          primary:          true
          autoincrement:    true
        champ1:             string(255

    Comment ça marche ?

    Donc si on résume, il faut dire à Doctrineque l’on va rajouter des colonnes .. et que l’on veut être prévénu lors de l’insertion en base pour associé nos actions. Donc avec seulement 2 classes, une de définition et une d’écoute, on peut s’en sortir et crée notre behavior.

    Lors de la configuration, en rajoutant « actAs : Signable », Doctrine va chercher une classe de définition qui ira  étendre une classe Doctrine_Template. Par convention il ira chercher une classe nommé Doctrine_Template_Signable. Le rôle de cette classe est de déclarer ses colonnes et de rajouter une écoute, un listener, vers l’autre classe d’actions.

    Pour mon exemple, je vais volontairement raccourcir les classes du sfDoctrineActAsSignablePlugin et prendre pour acquis que vos utilisateurs sont gérés via sfGuardDoctrinePlugin.

    Doctrine_Template

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    class Doctrine_Template_Signable extends Doctrine_Template {
     
      // Définitions des relations
      public function setUp() {
      // Bim rajoute une clée étrangère sur sfGuard
      $this->hasOne('sfGuardUser as Author', array(
                'local' => 'created_by',
                'foreign' => 'id'
                )
                );
      }
     
     public function setTableDefinition() {
     
      // Bim une colonne en plus
      $this->hasColumn('created_by', 'integer', 4, array(
              'type' => 'integer',
              'length' => '4',
         ));
     
      // Lien avec notre 2eme classe .. on passe le nom de la colonnette rajouté
      $this->addListener(new Doctrine_Template_Listener_Signable('created_by));
      }
    }

    Là pour l’exemple aucune configuration au niveau du schéma n’est possible mais c’est facile à rajouter via d’un tableau d’options et le constructeur suivant :

    1
    2
    3
    
      public function __construct(array $options = array()) {
        $this->_options = Doctrine_Lib::arrayDeepMerge($this->_options, $options);
      }

    Doctrine_Template_Listener

    Nous avons vu que notre Template rajoute un listener vers notre 2e classe en lui passant la colonne à surveiller (dans la vrai vie, un tableau d’options ..). Le rôle de notre listener de pouvoir agir avant/après l’insertion/édition d’un objet .. facile :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    class Doctrine_Template_Listener_Signable extends Doctrine_Record_Listener {
     
      protected $_colonette = "created_by";
     
      public function __construct($colonne) {
        $this->_colonette = $colonne;
      }
     
      public function preInsert(Doctrine_Event $event) {
          $createdName = $this->_colonette;
     
          // recupère l'objet appellant :
          $objet = $event->getInvoker();
     
          // Affectation de valeur
           $objet->$createdName = $this->getUserId();
      }
     
      public function getUserId() {
         // Echappe le mode cli
         if (0 != strncasecmp(PHP_SAPI, 'cli', 3)) {
           // L'user courant
           return sfContext::getInstance()->getUser()->getAttribute('user_id', null, 'sfGuardSecurityUser');
         } else {
          return null;
         }
      }
     
      public function preUpdate(Doctrine_Event $event) {
      }
     
      public function postUpdate(Doctrine_Event $event) {
      }
     
      public function postInsert(Doctrine_Event $event) {
      }
     
      // A tester : public function Delete(Doctrine_Event $event) ..
    }

    Vous n’avez plus qu’a rebuilder votre model et magie ça doit marcher !!

    Vu que l’on a fait une relation de type One-to-many sur sfGuard vous pouvez accéder à l’utilisateur sfGuard via la propriété Author sur n’importr quel table marqué comme « Signable »

    1
    
      echo $objet->Author->id;

    Voilà .. simple au final non ? Ah vous de créez le votre, :p

    Comme on dirait au boulot « Amaaziiiing !! »

    Billet écrit dans : Découverte PHP, Symfony 03.10.2009 4 Réactions !!
  • Billet écrit dans : Mobile, iPhone 16.09.2008 15 Réactions !!

    Mise à jour 29/07/09 : Cet article date d’un peu .. sa version raccourci et plus clair est disponible sur Débuter sur le développement iPhone ! Have Fun :p

    Cet article a pour but de vous expliquer comment créer une application Iphone.
    Afin d’éviter un abus de langage, nous différencions deux types d’applications potentiels :

    •    Les applications web : ouvert via Safari et qui ne sont ni plus ni moins un site dédié au format de l’iphone.
    •    Les applications embarqués : Application directement téléchargé sur le iphone store (gratuitement ou pas) pour lequel l’utilisateur doit donner son mot de passe pour l’installer.

    Cet article traitera principalement du 2e type d’application.

    Application Web

    Afin de créer une application web iphone, la règle constatée est d’avoir un look Apple et celui suffit.
    Pour ce faire il peut être intéressant d’utiliser :

    •    iUI – pour User Interface (UI) Library for Safari development on iPhone qui est disponible sur http://code.google.com/p/iui/
    Cela fournit des images, un CSS et une bibliothèque Javascript permettant de simuler une navigation sur une application Iphone « embarqué ». Deux exemples sont disponibles :

    •    Un tutorial expliquant comment créer le css, et le javascript pour profiter, détecter et se servir de la « rotation » de l’iphone

    •    Un plugin Firefox pour « émuler » l’affichage dans un iphone

    •    Une application AIR pour emuler l’iphone sur PC. Attention ce n’est qu’une beta.

    •    Un site web pour tester les applications web est disponible : http://www.testiphone.com/

    Ces pistes de réflexions devraient vous aider à concevoir un site spécial iphone.

    Rappel : The vertical view dimensions are 320×365 pixels while the horizontal view dimensions are 480×200 pixels.
    Note : De nombreux sites proposent une version iphone et parlent de leur « application iphone », d’où l’existence d’un certain abus de langage sur le terme « application »

    Application embarqué

    La création d’application pour Iphone permet ainsi d’avoir une application « hors ligne ». Idéal pour les jeux commerciaux, les utilitaires etc.

    Le kit de développement (SDK) est fourni gracieusement par Apple, nous pouvons donc développé des applications qui fonctionneront dans l’émulateur fourni.

    Cependant il faut payer une licence pour pouvoir mettre son application sur un vrai téléphone et être disponible sur l’apple store.
    •    99$ pour un particulier.
    •    300$ pour une entreprise.

    Le fait d’avoir cette licence nous donne accès à « l’Iphone Developer Program » (http://developer.apple.com/iphone/program/).  Un résumé des étapes pour faire partie du programme est disponible sur http://forum.frenchiphone.com/index.php/topic,18561.0.html.

    Une fois sur l’apple store notre application est hébergé directement chez Apple, ils ont à leurs charges les coût d’hébergements, fournissent une plateforme de téléchargement etc.

    Lors de la « mise en ligne » de notre application nous pouvons la distribuer :
    •    Gratuitement. Apple prend en charge la totalité des coûts.
    •    Commercialement. 70% du prix de l’application nous revient et apple prend les 30% restant pour frais d’entretiens.

    Contraintes de fonctionnements :

    Pour développer grâce à leur SDK nous devons avoir un mac OS X (version 10.5.3 ou supérieur).

    Et notre application ne fonctionnera que sur les iphone possédant le firmware 2.1. Celui-ci est sorti le 13 septembre 2008.

    Le simulateur intégré au SDK ne permet pas de :
    •    Simuler l’accéléromètre
    •    D’utiliser l’appareil photo de l’iphone. Au passage, nous ne pouvons enregistré de vidéo via l’appareil photo.
    •    D’accéder à certaines librairies des frameworks (souvent lorsqu’on récupère du code « iphone », il ne peut être porté directement dans le SDK vu que certains utilisent une version non officiel du SDK d’Apple où nativement il a plus de librairies).

    Une contrainte d’Apple est que chaque application « vie » dans un bureau cloisonné. Nous ne pouvons accéder aux ressources d’autres applications (comme les mp3 et vidéo stocker sur le téléphone).

    Plus d’information sur : http://www.gizmodo.fr/2008/08/05/lindispensable-marche-noir-des-applications-pour-iphone.html

    Programmer sur Iphone :

    L’API de l’iphone est quasiment la même que pour développer sous mac.
    Il faut utiliser « Cocoa »(L’iphone a sa version de Cocoa nommé « Cocoa Touch »). http://fr.wikipedia.org/wiki/Cocoa_(Apple) .

    Cocoa est l’API native d’Apple pour le développement orienté objet sur son système d’exploitation Mac OS X. C’est l’une des 5 API majeur disponible pour Mac OS X,

    Pour utiliser cette API sur l’Iphone, nous sommes contraint d’utiliser les environnements de développements suivants
    •    Xcode (anciennement Project Builder) : compile et lance l’émulateur de l’iphone.
    •    Interface Builder : Permet d’agir graphiquement sur les vues et permet un développement rapide de l’application d’un point de vue graphique.

    Le langage de programmation utilisé est Objective-C.

    Wikipédia : L’Objective-C est un langage de programmation orienté objet réflexif. C’est une extension du C ANSI comme le C++ mais se distingue de ce dernier par sa distribution dynamique des messages, son typage dynamique et son chargement dynamique. Contrairement au C++, il ne permet pas l’héritage multiple mais il existe toutefois des moyens de combiner les avantages de C++ et d’Objective-C.

    Ressources

    Voici une liste de ressources disponibles pour

    •    Apprendre à utiliser Cocoa et Objective-C

    o    Un cours pour débutant est disponible dans le thread de ce forum.

    o    Débuter avec Cocoa en utilisant Objective-C

    o    Un cours est disponible sur le site du zéro pour Objective-C :

    o    Un livre « biblique » selon les développeurs Mac peut être acheter pour 36.10€

    L’objective-C a une notation et une utilisation de la programmation objet quelque peu déroutante si l’on vient du monde « Java, PHP5, C# ». Le cours du site du zéro est très précis pour comprendre la syntaxe et la notation.

    •    Tutoriaux pour crée des applications iphone

    o    Un pdf, des exemples, et des templates de code sont disponibles dans cet article

    o    Tutorial pour la création d’interface « dynamique »

    o    Tutorial pour créer un lecteur RSS pour Iphone :

    o    Utiliser les évènements, les contrôleurs et les vues

    o    Des Tutoriaux Vidéos sont disponibles sur

    o    Avoir le look and feel d’apple

    o    Forum d’entre-aide

    Sans oublier tous mes liens concernant l’iphone : http://delicious.com/onishinji/iphone

    Billet écrit dans : Mobile, iPhone 16.09.2008 15 Réactions !!
CV Guillaume chave