Blog d'un développeur multi-support

[DIM] pour les intimes :)

Nokia share online

Bonjour,

Pendant quasiment un mois j’ai codé une application permettant de mettre à jour son blog via son téléphone. D’où l’absence de post sur ce blog.

Enfin, dire « codé une application » c’est un peu exagéré. En fait dans les téléphones Nokia il existe une application nommé « Nokia Share online » / « Partager en ligne » qui permet d’uploader des images/vidéos sur Flickr, Ovi (le service de nokia) , Vox et c’est tout…

Là où je suis intervenu ça a été de créer un 4e service, complètement personnalisé, pour mettre à jour un blog communautaire. Une image valant tous les discours.

User case sans doute faux :)

User case sans doute faux :)

Si vous voulez faire la même chose je ne peux vous donner mon code source malheuresement, mais vous aiguillez sur la façon de le faire.

Comment faire ? Ou allez ? Kezako ?

Déjà la création du service sur le téléphone. En fait c’est un fichier xml de configuration (un isf plus exactement) qu’il faut écrire. Un petit lien qui explique tout bien http://www.teknograd.no/development/online_sharing_config.php.

Wahou mon service est dans le téléphone, mais il se passe quoi quand je post images, textes, et vidéos ? En fait c’est là où vous bossez un peu, il faut pouvoir exploiter coté serveur les données réçu : authentification,  et médias.

Bon se tappez le petit livre blanc de nokia peut être une bonne idée pour commencer http://pookey.co.uk/files/lifeblog_posting_protocol_specification_1.0.pdf. Vous y apprendrez que la méthode d’authentification de l’utilisateur passe par le protocole WSSE, que les item que vous envoyez sur votre serveur sont encapsulé dans XML (en brut dans le corps de la requete – a parser pour récupérer les informations.) Et que chaque item (texte, image, vidéos) sont postés séparement.

Pour l’authentification et la gestion du cryptage, rien ne vaut la lecture de http://www.xml.com/pub/a/2003/12/17/dive.html au cas où.

Enfin pour les feignants, vous pouvez aussi reprendre ce projet .. y a tout … authentification, gestion des items etc http://randysimons.com/pagina_140_NL.xhtml

Si vous avez des questions, je pourrais vous repondre :)

Note : pensez à ré encoder les vidéos cotés serveur pour les réafficher dans un flash player, et oui le téléphone ne les convertit pas en flv :D

Tags : , , ,

Zend Framework !

Depuis quelques jours, (2 semaines pour être exactes), je m’essai à Zend . Et je le trouve pas mal.

Loin de l’idée de faire un , mais voilà mon opinion entre Zend et mon coeur balance ^^

Symfony
Documentation Un bouquin papier pas à jour peut être fatal. Mais un bouquin dans les mains c’est bien ! Un livre sort en novembre, mais pour l’instant on reste à lire de long manuel sur écran.
Prise en main Rapide avec un bouquin :) Lente, le manuel Zend est fait pour ceux qui connaissent ou ont l’habitude de le parcourir. Ce n’est pas une écriture didactique comme Symfony je trouve.
Utilisation quotidienne J’aime me concentrer seulement sur la logique applicative, j’aime tous les outils donnés en ligne de commande. Le lego, une deuxième passion. Tout refaire, c’est flatteur pour l’égo et se dire « Ouais, j’ai tout compris ».
Rapidité d’exécution pour un projet simpe Ouais ben ca rame un peu vu le nombre d’inclusion qu’il y a, mais c’est la rançon du succès.
« Plus d’aide tu donneras, plus lent tu seras. »
I have the controll. Pardonner mon anglais déplorable, mais tout géré donne l’illusion de rapidité etc. C’est vrai et c’est faux. Ca dépend du développeur derrière :)

Merde, c’est un comparatif très objectif. Tans pis. Vous noterez que je préfère symfony (c’est mon 1er framework alors bon c’est normal ^^).

Mais comme dirais un Romain … « le framework dépend du projet, desfois c’est mieux sans » :)

Sur ceux, bonne journée

Tags : , ,

Hébergement de BOT

Dans un article précédent, nous avions vu comment créer un bot en . Seulement assurer la connexion du bot sur le salon était assez laborieux. Un processus par bot qui tourne sur votre machine, c’est pas folichon.

Mais grâce à http://new.imified.com, ce souci n’en est plus un ! Ce service web permet de connecter un bot à MSN, IRC, Gtalk etc et ce bot demandera à votre page PHP ce qu’il doit faire.

Au final nous n’avons plus qu’a se consacrer sur les réponses et les traitements à faire en fonction du dialogue de l’utilisateur (donnée récupérer sous forme de $_GET). Fini le parsage du stream pour détecter la bonne ligne ^^

Je vous avouerais, j’ai pas encore tester. Mais je compte le faire un de ces quatres :) Je pense que c’est LA solution pour créer rapidement un compagnon virtuel … Imaginer un bot de ce style qui pilote votre twitter, facebook etc. Vous lui parlez, il s’occupe du reste :)

Vu sur le channel #-fr (irc.freenode.com) grâce à [MA]Pascal.
Il a crée un bot qui relaie ce que vous lui dites sur un site donné. (Système de prise de notes rapide)
Ajouter paste@bot.im à votre compte Gtalk et parler lui. Enfin, cela reste surtout un bot de test, réalisé avec Symfony 1.2 et Doctrine (un ORM comme propel)

Tags : , ,

Créer des applications Iphone

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 .
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.

Lire la Suite

Tags : , , ,

Validé un formulaire en Ajax avec Symfony 1.1

Dans ce billet nous allons voir comment utiliser Ajax pour valider champ par champ un formulaire constuit avec sfForm de 1.1.

Je prend pour acquis que vous ayez lu / que vous connaissez la validatation de formulaire « classique » offert par sfForm. Tout est expliqué et surtout .

En fait le souci avec les validateurs symfony 1.1 est qu’ils ne possèdent pas la méthode isValid() contraitement aux validateurs symfony 1.0. Du coup, quand on fait de l’ajax, nous sommes obligés de passer d’un type de validateur à un autre.

Cette exemple illuste le fait avec le validateur sfValidatorEmail (sf 1.1) et sfEmailValidator (sf 1.0). L’idée est de définir les paramêtres du validateur (les messages d’erreurs dans notre cas) qu’à un seul endroid afin de respecter le concept Dry (Don’t Repeat Yourself).

Voilà les étapes nécessaires pour mettre en place une validation de formulaire classique et « Ajaxé » :

  1. Vous créez vos widgets dans lib/form/MaClasseForm.class.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    class MaClasseForm extends BaseMaClassForm
    {
    	public function configure()
    	{
    		$this->setWidgets(array(
    		'id'         => new sfWidgetFormInputHidden(),
    		'FirstName' => new sfWidgetFormInput(),
    		'LastName'  => new sfWidgetFormInput(),
    		'Email'      => new sfWidgetFormInput(),
    		'password_repeat'      => new sfWidgetFormInput(),
    		'password'      => new sfWidgetFormInput()
    		));
     
                    // On peut modifier les labels si besoin est ...
    		$this->widgetSchema->setLabels(array(
    		'FirstName'    => 'Prenom',
    		'Email'   => 'addresse Email ',
    		'LastName' => 'Nom',
    		));
            }
    }
  2. Vous définissez vos validateurs dans lib/form/MaClasseForm.class.php à la suite de la méthode configure()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
     
     $this->setValidators(array(
    'id'         => new sfValidatorPropelChoice(array('model' => 'Utilisateurs', 'column' => 'id', 'required' => false)),
    'FirstName' => new sfValidatorString(array('max_length' => 20, 'required' => false)),
    'LastName'  => new sfValidatorString(array('max_length' => 20, 'required' => false)),
    'password'      => new sfValidatorString(array('max_length' => 40, 'required' => false)),
    'password_repeat' => new sfValidatorString(array('max_length' => 40, 'required' => false)),
    'Email'      => new sfValidatorEmail(array('required' => true)),
    'Birthday'   => new sfValidatorDate(array('required' => false)),
    ));
     
    // J'en profite pour definir un nom formater des champs pour avoir $_POST['utilisateurs['email']] etc
    $this->widgetSchema->setNameFormat('utilisateurs[%s]');
  3. Normallement à ce stade vous pouvez utiliser la classe de formulaire dans votre fichier apps/MonApp/MonModule/actions/actions.class.php
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public function executeMonAction() {
     
       $this->formInscription = new MaClasseForm();
       if ($this->request->isMethod('post'))
       {
          // récupère les champs du formulaire sous forme de tableau.
         $array_champ = $this->getRequest()->getParameter("utilisateurs");
         $this->formInscription->bind($array_champ);
         if ($this->formInscription->isValid())
    	{
           // Formulaire valide.
           }
    }
  4. Voilà la validation « classique » et faite. Et l’ajax dans tout ça ? On y vient ^^ Alors au lieu d’afficher le formulaire de manière classique (via le template adéquate apps/MonApp/MonModule/templates/MonActionSuccess.php)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    // Au lieu de
    echo $form;
     
    // On va rendre le template comme on le souhaite
    // Par souci de flemme je ne fait que le champ Email
    <table>
      <tr>
        <td><?php echo $form['Email ']->renderLabel() ?>:</td>
        <td><?php echo $form['Email '] ?></td>
       <td><span id="error_for_email ">
                    <?php if ($form['Email ']->hasError()): ?>
    		<ul class="error_list">
    		<?php foreach ($form['Email ']-<getError() as $error): ?>
    			<li class="error_for"><?php echo $error ?></li>
    			<?php endforeach; ?>
    		</ul>
    		<?php endif; ?> </span></td>
      </tr>
    </table>
  5. Et maintenant on va jouer avec l’ajax pour vérifier ce champ email lors de la saisie.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    /************** Ajax Time :) *****************/
    // Dans le template on met :
    <?php
    // Crée l'observateur pour le champ utilisateurs_email du formulaire.
    echo observe_field("utilisateurs_email",array(
    'update' => "error_for_email",
    'url' => "MonModule/VerifierEmail",
    'with' => "'email='+ value",
    ));
    ?>
  6. On rajoute l’action VerifierEmail() dans le fichier d’actions.
    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
    40
    
     
    public function executeVerifierEmail()
    	{
    	 // Initialisation des variables internes
    	 $chaine_a_verifier = $this->getRequestParameter("email");
    	 $array_erreur = array();
     
    	 // Récupère le validateur d'email définit dans lib/form/MaClasseForm.class.php
    	 $form = new MaClasseForm();
    	 $validateur_form = $form->getValidatorSchema();
    	 $all_validateurs_field = $validateur_form->getFields();
    	 $email = $all_validateurs_field["email"];
     
    	 // Récupere le bon code d'erreur
    	 if($chaine_a_verifier == "")
    	 {
    	 	$array_erreur =	array('email_error' => $email->getMessage("required"));
    	 }
    	 else
    	 {
    	 	$array_erreur =	array('email_error' => $email->getMessage("invalid"));
    	 }
     
    	 // Crée un validateur d'email hérité de Symfony 1.0
    	 $validateur_email = new sfEmailValidator($this->getContext());
     
             // Un peu de Dry (Don't Repeat Yourself) afin d'éviter d'avoir des messages d'erreurs définit à deux endroits différents.
    	 $validateur_email->initialize($this->getContext(), $array_erreur  );
    	 // Dispatcheur vers le bon templates
    	 if($validateur_email->execute($chaine_a_verifier,$message_retour))
    	 {
    	 	$message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>true));
    	 }
    	 else
    	 {
    	 	$message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>false));
    	 }
     
    	 return $this->renderText($message_a_afficher);
    	}
  7. Donc en fait on met à jour le « span » error_for_email avec le résultat de l’appel de la méthode VerifierEmail(). J’ai utilisé un template partial car le but est de le réutiliser pour tous les appels en Ajax. Celui ci n’est pas bien compliqué
    1
    2
    3
    4
    
    <ul>
        <li class="<?php if($reussi) echo "accept_for"; else echo "error_for"; ?>">&amp;nbsp;<?php echo $message; ?>
        </li>
    </ul>
  8. Et voilà, le formulaire fonctionne classiquement et dispose de vérifications en Ajax aussi.

Nous venons de voir le validateur d’Email, mais tous fonctionnent sur le même principe. Voici la méthode pour utiliser le validateur de Sting qui diffère un peu.

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
40
41
42
   public function executeVerifierPseudo()
   {
     // Initialisation des variables internes
    $chaine_a_verifier = trim($this->getRequestParameter("pseudo"));
 
    // Récupère le validateur de pseudo
    $form = new MaClasseForm();
    $validateur_form = $form->getValidatorSchema();
    $all_validateurs_field = $validateur_form->getFields();
    $validateurs = $all_validateurs_field["FirstName"];
    $pseudo = $validateurs->getValidators();
    $pseudo = $pseudo[0];
 
    // Crée un validateur de String sf1.0
    $validateur_pseudo = new sfStringValidator($this->getContext());
    $validateur_pseudo->initialize($this->getContext(), array(
    'min' => $pseudo->getOption("min_length"),
    'min_error' => $pseudo->getMessage("min_length"),
    'max' =>$pseudo->getOption("max_length"),
    'max_error' => $pseudo->getMessage("max_length"),
    'required' => $pseudo->getMessage("required"),
    ));
    // Dispatcheur vers le bon templates
    if($validateur_pseudo->execute($chaine_a_verifier,$message_retour) &amp;&amp; $chaine_a_verifier != "")
    {
       $message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>$bool));
    }
    else
    {
     if($chaine_a_verifier == "") $test = $pseudo->getMessage("required");
 
     // Remplace les jokers des messages d'erreurs.
     $min = $pseudo->getOption("min_length");
     $max = $pseudo->getOption("max_length");
     $message_retour=    preg_replace("#%value%#",$chaine_a_verifier,$message_retour);
     $message_retour=    preg_replace("#%min_length%#",$min,$message_retour);
     $message_retour=    preg_replace("#%max_length%#",$max,$message_retour);
     $message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>false));
   }
 
   return $this->renderText($message_a_afficher);
}

Et voilà c’est fini :)

Tags : , , , ,

Qu’est ce qu’il faut pour commencer sur Android ?

Petit rappel sur (mais est ce bien la peine ?) :

Android est un système d’exploitation pour téléphone portable.

Crée par google et open-source il ouvre une voie vers les téléphones mobiles enfin personnalisables à souhait pour les geek que nous sommes :)

Bon, pour en savoir vraiment quelque chose, rien ne vaut un petit wikipedia. Pour l’instant aucun téléphone ne l’embarque mais c’est en cours d’arrivé ( Cf Techcrunch & cf Techcrund). Enfin là n’est pas mon discours.

Je me dit juste qu’après avoir vu cette vidéo prise sur Techcrunch (ouais je l’aime ce site ^^) vous voudriez peut être avoir les bases pour commencer.

Mise en bouche

Présentation d’android – via Techcrunch

Les bonnes adresses

Pour commencer à développer sur Android voici trois liens à conserver précieusement :

  1. Le site officiel, logique. Même si je trouve les tutoriels un peu long à lire et pénible, ça reste la référence :)
  2. L’ebook de Nicolas Gramlich pour commencer ses premières applications. J’en suis tombé amoureux ^^ c’est court mais précis. Parfait pour quelqu’un ayant des bases en développement, c’est le condensé le plus agréable à lire.
  3. Le forum Anddev : Rempli de tutoriaux et d’aides, c’est idéal pour s’instruire. En plus y a plein d’images dans les tutoriaux, wahouu :)

Vous remarquerez que tous ces liens sont en anglais. Et oui, en langue française y a bien quelques blogs/sites qui parlent de l’actualité d’Android, mais rien de bien sérieux pour les développeurs. Sans doute cela doit exister, mais je ne les ai jamais trouvé jusqu’à présent ..

J’allai oublier un lien, francais cette fois, bien utile pour commencer http://java.developpez.com/cours/ Et ouais, Android c’est du java traficoté ^^

Logiciels et SDK

Pas de miracle, on fait du Java, on est open-source et on va télécharger Eclipse et son plugin Android ^^

http://code.google.com/android/intro/installing.html

Et on tente de comprendre l’anglais ^^

Et ensuite ?

Bientôt des traductions de tutoriels existants (es ce bien utile ?), et des petites découvertes de code sur Android (j’espère en trouver ^^)

Tags : , , ,

Découverte : BOT IRC

Bonjour, j’ai pu découvrir comment créer un bot en grâce à la communauté IRCienne de . (Qu’est ce qu’IRC ? Qu’est ce qu’un Bot ?). Tout est expliqué sur cette page.

Squattant en ce moment le chan (salon de discutions) de symfony-fr, je passe mon temps à remercier les uns les autres. Depuis peu même j’arrive à aider les nouveaux ^^. Je me suis donc dit que ca serait bien d’avoir un système pour compatibiliser le nombre de « merci » par personnes et d’en sortir quelques statistiques.

Ainsi est née le bot qui sert à avoir une système à points. Chacun peut donc donner, ou enlever un point, et le robot fera le compte.

Fonctionnement

Après quelques discutions sur le channel de symfony, j’ai mis au point 4 petites commandes que le bot va interpréter :

!point guillaume
!malus guillaume
!bonus guillaume
!total

Comment ca marche ?

Le bot est écrit en PHP 5 et se lance via une ligne de commande du style :

php -f utilisation.php

Il n’y a que peu de classes pour le faire fonctionner :

  1. Une classe de connexion qui s’occupe de créer un flux de donnée (une socket via fsockopen), de se connecter à un channel irc,  de pouvoir transmettre des commandes IRC et de récupérer ligne par ligne ce qui se passe sur le channel.
  2. Une classe principal qui permet de garder le flux de donné ouvert (et donc fait en sorte que le bot reste sur le channel IRC), et qui permet de lancer des Plugins. Son rôle tient plus d’un controlleur PHP que d’une classe à mon sens.
  3. Une interface et une classe de base pour la gestion des Plugins. En fait un plugin est une classe qui contient le coeur d’un programme et permet de réagir vis à vis d’un évènement sur le channel. Un plugin fait donc office d’observateur puisqu’il permet d’écouter des évènements mais il s’obverse lui même vu qu’il traite ces évènements et y répond.

J’ai donc créer un plugin et modifier un temps soit peu la classe principal pour avoir à tout moment la liste des utilisateurs du channel. Au final le code n’est pas bien compliquer et bien long (330 lignes à tout casser). Les points sont stocker dans une base de données local (voui, pas besoin de serveur en ligne vu que l’on lance le bot en local on peut accèder à une base en local ^^). Quelques random rendent le bot sympathiques pour avoir des phrases de réponses un peu plus humaine.

Je ne vous donne pas le code source de cette petite application car je le juge « pas très propre » et je pense y faire encore pas mal de modifications dessus :)

Pour la suite

Je prévois de faire une application symfony pour ajouter/modifier des phrases de réponses clées. Faire des graphiques de statistiques, et ré-initalisé la base de données à souhait. Tout n’est pas encore fixé, mais j’aimerais bien une console d’administration du bot à distance sympathique :)

Voilà voilà

Tags : , , ,

Pourquoi ce site ?

Bonjour,

J’ouvre ce blog pour deux raisons :

  1. Demain j’attaque le boulot dans mon entreprise d’accueil pour cet année d’alternance. J’aimerais donc avoir un endroit où je pourrais partager mes découvertes de cette année.
  2. J’ai déjà crée un système de blog http://www.oni-ecchi.info/labo/portefolio mais même si le système fonctionne, je ne l’aime plus vraiment. Et pis je ne voulais pas me prendre la tête, alors un bon wordpress, un joli template et hop c’est réglé comme du papier à musique.

Je vais essayer d’avoir un rythme de pulication régulier. Pour en savoir plus sur y a une rubrique qui existe. Alors je ne vais pas m’éterniser ici :)

Tags : ,

Mes réalisations

Commencer un blog sans montrer quelques réalisations çà se fait pas :) Tant qu’à faire, autant vous présenter mes derniers projets, les sites html 4.0 tout moisi vous devez vous en foutre ^^


Décembre 2007-Janvier 2008 http://meta-blog.oni-ecchi.info

Ce projet a été fait décembre 2007-janvier 2008 pour avoir une réalisation alliant à la fois graphisme et développement pour montrer lors de ma recherche de stage. Le principe est qu’une inscription suffisent pour pouvoir bloguer dessus, et il y a une gestion de partage de billet avec les membres pour pouvoir des co-auteurs.

Technologie utilisé : 5 / Ajax (prototype et scriptaculous)

Janvier 2008-Fevrier 2008 http://www.rad-yoh.fr

Quelques semaines après ce blog collaboratif, j’ai pu décliner l’architecture MVC que j’avais mis en place afub de créer une plateforme (modeste) de blog ainsi qu’un site entièrement administrable.

C’est la 1er fois que je travaillais de pair avec un graphiste/intégrateur HTML/Flasheurs (rien que ça ^^). Au final l’architecture et le code PHP utilisé sont assez moyen j’avouerais.

Technologie utilisé : PHP 5 / Ajax (prototype et scriptaculous)

Mars 2008 – Mai 2008 : L’intranet de mon DUT

Projet collaboratif dans le cadre d’un projet tutorer. Je me suis occupé de la BDD, de l’architecture, du code PHP et de l’intégration final du design.

Un dossier de conception sera disponible en téléchargement dans quelques temps. (le temps de le retrouver :))

En gros le principe c’est de donner à des élèves un outil pour effectuer des voeux d’affectations à des projets souhaité (ceux ci sont définit par l’administrateur ou par un professeur). L’admin dispose d’un outil d’affectation (ajax / JS) pour définir les affectations. En parralle ce site sert aussi d’espace d’échange (news, documents, etc) entre professeurs et élèves.

Pour le tester :

  • login : utilisateur_15 passe : pass pour un compte « élève ».
  • Le compte « prof » : login : prof passe : pass
  • Le compte admin n’est donné que sur demande :)
Technologie utilisé : PHP 5 / Ajax (prototype et scriptaculous)

Mai 2008 – Juillet 2008 : Intranet Client

Création de l’intranet Client d’une agence web de Lyon. Refonte complète de l’existant.

Au programme :

  • Mise en place de statistique ( Piwik )
  • Création de script de tracking email / visite pour chacun des clients.
  • J’ai du interfacé avec des rendus HTML de logiciels de réferencements.
  • L’Intranet est completement multi-langue (1er fois ^^)
  • Interface au maximum Ajaxé
  • Programme de création de newsletter et d’envoi différé. (Chouette les gabarits d’emails à parser ..)

Un dossier de conception est disponible sur demande.

Technologie utilisé : PHP 5 / Ajax (Jquery)
Tags : ,