Blog d'un développeur multi-support

[DIM] pour les intimes :)

phpFlickr & Flex

Pour un cours de Flex, il nous avait été demandé de créer une application très simple constitué de deux écrans pour nous apprendre à manipuler les « states », les composants personnalisés, le « data binding » etc.

Le sujet de l’application était d’afficher des images en fonction d’une ville – en vue de faire du data binding sur un XML « statique » de villes – et de récupérer des images issues d’un XML dynamique via l’objet HTTPService.

Alors quitte à faire du dynamique, autant interroger directement un web service existant en vue de récupérer pleins d’images sans se prendre la tête. Et là j’ai pensé à FlickR et sa monstrueuse API. Après 5mn montre en main j’ai eu ma clé pour accèder à l’API et 4mn après je découvrait phpFlickR.

Upload de la librairie et voici mon bout de script qui me renvoit suivant deux paramètres en $_GET un joli XML près à être utilisé en .

  • $_GET['town'] est le terme rechercher dans l’api FlickR sur les tags et le text qui commente une photo.
  • $_GET['max'] est le nombre de photos qu’il faudra retourner.
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
require_once("phpFlickr.php");
$flickR = new phpFlickr("ta_cle_de_connection_flickR");
 
// 10 résultat par défaut ..
if(isset($_GET['max']))
$max = $_GET['max'];
else $max=10;
 
$search = array("tags"=>$_GET['town'],'per_page'=>$max, "tag_mode"=>"any",'text' => $_GET['town']);
$tab = $flickR->photos_search($search);
 
// On renvoit un XML à Flex
header("content-type: application/xml");
 
// La balise qui va bien
echo "<?xml version="1.0" encoding="utf-8" ?>";
 
for ($i = 0; $i != $max; $i++)
{
        // on s'assure d'avoir des photos valides
	if($tab['photo'][$i]['id'] != "")
	{
	// Simple de créer des urls FlickR non ?
	$url = $flickR->buildPhotoURL($tab['photo'][$i],"thumbnail");
	$link = $flickR->buildPhotoURL($tab['photo'][$i],"medium");
 
	echo "<image><url>".$url."</url><urlLarge>".$link."</urlLarge></image>";
	}
}

La partie Flex est tout aussi simple, voici la partie essentielle qui nous intéresse :

?View Code ACTIONSCRIPT
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
43
44
45
46
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="searchPhoto('france',20)">
 
<mx:Script>
<![CDATA[
import mx.rpc.http.HTTPService;
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;
 
[Bindable]
private var servicePhoto:ArrayCollection = new ArrayCollection(); 
 
 
private function searchPhoto(search:String,max:int):void
{
	var modService:HTTPService = new HTTPService();
	modService.method = "get";
	modService.url = "http://oni-ecchi.info/labo/FlexPhotos/service.php";
 
	var parameters:Object = new Object();
	parameters.town = search;
	parameters.max = max;
	modService.request = parameters;                
	modService.send();
	modService.addEventListener(ResultEvent.RESULT,onDataCharged);                
}
 
private function onDataCharged(e:ResultEvent):void
{
	servicePhoto = new ArrayCollection();
	servicePhoto = e.result.root.image as ArrayCollection;		
	vignettes.dataProvider = e.result.root.image as ArrayCollection;
}
 
]]>
</mx:Script>
<mx:TileList id="vignettes" dataProvider="{servicePhoto}" width="481" height="279" columnWidth="110" rowHeight="110" columnCount="4" horizontalCenter="0" paddingRight="5" verticalCenter="0">
    <mx:itemRenderer>
   		<mx:Component>
   			<mx:Image  source="{data.url}" verticalAlign="middle" horizontalAlign="center" />
   		</mx:Component>
    </mx:itemRenderer>       
</mx:TileList>
 
 
</mx:Application>

Ce n’est qu’un exemple très simple. Dans le fichier source qui va suivre, j’ai un peu plus travaillé la chose en utilisant un composant de chargement d’image sympathique, un spinner de chargement 2.0 et enfin la gestion des states (très simple).

Voilà, c’est tout pour aujourd’hui

Tags : , , ,

Tutoriel Iphone

Bonjour,

Connaissez vous Weecast.fr ? Mais si voyons, le tout nouveau  service d’earling d’emob !

Je parcourais un peu le site pour voir si il y avait des tutoriaux vidéos pour programmeur, et hormis les vidéos de video2brain sur Flex qui sont intéressante il y a peu de choses qui m’interpellait. Et c’est là que je voix « Xcode » dans leurs menu avec trois tutoriaux d’objective-c dont un parlais directement de l’iphone.

Il est disponible à cette adresse et vous apprendrez autant que sur le sur developpez.com à savoir :

  • Cliquer sur un bouton pour déclencher une méthode classe

A la différence d’un énième hello world pour l’. Il y a cependant un petit truc d’interessant c’est la gestion du clavier virtuel. Au final on passe 15 mn pour apprendre à gérer correctement le clavier, c’est bon à prendre.

Je regrette simplement que sur la le commentateur ne commente pas les choses vraiment utile. On s’en fou qu’il faut mettre un point virgule ou qu’il est en train d’ouvrir une accolade non ?

Je pense qu’il aurait mieux fait de dire, par exemple, pourquoi il doit écrire du @property (retain, nonatomic) UILabel *monChamp dans l’entete de la classe (fichier .h) et @synthesize monChamp; dans l’implémentation effective de la classe (fichier .m). Enfin bon rien ne remplace de la bonne documentation pour ce genre de question. Et pendant que j’y suis il aurait pu dire deux mots sur les delagate qu’il utilise pour le clavier. Là on dirait que tout sort d’un chapeau de magicien.

Donc oui les tutoriaux vidéos c’est cool, c’est mode, et ca fait gagné du temps mais quitte à en faire un soyez le plus explicites possibles !

En tout ca, merci apple pour la documentation textuels dg vidéos de qualité.

ps : Si vous voulez suivre mes « découvertes » iphone,  mon flux delicious est constamment mis à jour ! http://delicious.com/onishinji/iphone

Tags : , , ,

Slick en détail

Bonjour,

Cette semaine j’ai du rendre pour l’école des gobelins le que j’ai fait avec un framework java. Comme ce projet est fini, et que je ne pense pas que je vais en faire grand chose de mon coté, je vais vous en expliquer le fonctionnement. Peut être que ça vous sera utile.

I) Installation

L’installation de dans un projet eclipse est assez déroutante pour un newbie (j’y ai passé une demi journée de cours ^^) même avec un très bon (l’unique ?) tutoriel d’installation. Faites bien attention au dernier point, c’est important.

En fait Slick est basé sur un autre nommée lwgl, il y a donc deux librairies pour le prix d’une. Vive la réutilisation ! Slick étant un framework dédié aux un jeux 2D, il fait le ménage dans lwgl des choses non indispensables et rajoute tout ce qui va bien pour la 2D.

Passons au !

II) Premier Exemple

Je pars du principe que votre installation est fonctionnelle. Voici le code de mon premier test slick. Il s’agissait d’afficher une image, un test, et grâce au clavier de faire pivoter cette image. Le principe de base est le même pour le jeux final.

J’ai commenter tout le code pour vous expliquer pas à pas ce qu’il se passe.

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.util.Log;
 
//Il faut étendre la classe BasicGame
public class SimpleTest extends BasicGame {
 
	// L'image tourne, il faut un petit angle non ?
	// En fait il en faut un pour se souvenir d'un FPS à l'autre de combien il
	// faut tourner l'image.
	public Integer angle_image = 0;
	public Image imgToTurn;
 
	// Il faut un constructeur de base.
	// Vous noterez que toutes les erreurs seront catchés au moment de
	// l'exécution. (c'est à dire, dans le main)
	public SimpleTest() throws SlickException {
		// Initialise le nom de la fenetre ..
		super("SimpleTest");
		// Très pratique pour débuger l'application. Remplace le
		// System.out.println .. et plus si affinié
		Log.info("je viens d'être initialisé");
	}
 
	// Initialise mes objets. Exécuté au lancement du jeux.
	@Override
	public void init(GameContainer container) throws SlickException {
 
		// J'ai besoin d'une image.
		imgToTurn = new Image("ressources/images/woman.jpg");
 
	}
 
	// Méthode appelé en boucle. C'est ici que l'on fait vivre nos objets
	// "non graphique" comme la gestion des touches, de nos propriétés (comme
	// angle) etc
	@Override
	public void update(GameContainer container, int delta)
			throws SlickException {
 
		// Si on appuie sur la fleche Haut
		if (container.getInput().isKeyDown((Input.KEY_UP))) {
			angle_image++;
		}
		// Si on appuie sur la fleche Bas
		if (container.getInput().isKeyDown(Input.KEY_DOWN)) {
			angle_image--;
		}
 
		// On fait en sorte que notre angle "tourne en rond" ^^
		if (angle_image &amp;gt; 360)
			angle_image = 0;
	}
 
	// Méthode appelé en boucle. C'est ici qu'on gére l'affichage.
	@Override
	public void render(GameContainer container, Graphics g)
			throws SlickException {
 
		// Affiche un hello world en x:0 et y:100
		g.drawString("Hello, Slick world!", 0, 100);
		g.drawString("coucou", 0, 150);
 
		// Je fais tourner l'image
		imgToTurn.setRotation(angle_image);
 
		// Et je la rajoute à ma fenetre
		g.drawImage(imgToTurn, 200, 0);
 
	}
 
	public static void main(String[] args) {
		try {
			// Démarre un jeux à partir de ma classe
			AppGameContainer app = new AppGameContainer(new SimpleTest());
			app.setTargetFrameRate(500);
			app.start();
 
		} catch (SlickException e) {
			// Et c'est ici que je catch les erreurs de toutes mes méthodes.
			e.printStackTrace();
		}
	}
}

Wahou non ? on a fait un jeux à partir de 5 fonctions, dans l’ordre :

  1. constructeur() – Spécifie la fenetre de jeux (icone, intitulé de fenetre ..)
  2. init()  – Initialise tout nos objets
  3. update() – Gestion du clavier et mis à jours d’objet non graphique
  4. render() – Gestion de l’affichage, c’est là qu’on affiche ou non des éléments graphiques (image, texte, animation, etc)
  5. main() – Il faut bien un point d’entré non ? On peut aussi s’en servir comme point de récupération des erreurs.

Bon ca casse pas trois pattes à un canard, mais en moins de 100 lignes de codes avec les commentaires on s’en sort plutôt pas mal non ?

SimpleTest SimpleTest-2

Lire la Suite

Tags : , , , ,

Découverte Flex : new NumberFormatter();

Pour mon application (cf le post juste en dessous) j’ai eu besoin d’arrondir mes statistiques à l’entier supérieur/inférieur et les mettre en forme pour ne garder que deux décimal après la virgule. N’étant pas du tout expert en Flash/, j’ai commencé à faire un de bourrin comme splitter mon float selon la virgule, slicer ensuite pour ne garder que deux décimal etc … Bref, un truc vraiment crade pour me dépanner vite fait.

Je suis revenu quelque jours après sur ce bout de code pour le cleaner un peu et pour trouver une solution vraiment propre et voici ma « découverte » : NumberFormatter ! D’après une recherche google de 45s, il apparait que cette classe n’est disponible que pour Flex ..

Voici comment l’utiliser en AS3 seulement. Je n’ai pas pris le temps de l’essayer en MXML.

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// L'objet magique
var oFormat:NumberFormatter = new NumberFormatter();
 
// Arrondis à l'entier le plus proche
oFormat.rounding = NumberBaseRoundType.NEAREST;
 
// Et on l'utilise
trace(oFormat.format(1.51)); // Affiche 2
trace(oFormat.format(1.49)); // Affiche 1
 
// Précision à 2 décimal
// D'abord on n'arrondis plus
oFormat.rounding = NumberBaseRoundType.NONE;
// On définit le nb max de décimal
oFormat.precision = "2";
 
// Et on l'utilise
trace(oFormat.format(1.544541511)); // Affiche 1.54
trace(oFormat.format(1.1)); // Affiche1.10 - note : rajout du 0 !

Et bien sur, rien ne vaut un coup d’oeil sur la documentation Adobe !
Et voilà, c’est tout pour aujourd’hui.

Tags : , , , ,

Flex c’est cool

Ouaip avec le rameur que j’ai eu ce noel, j’en fais des … Bon passons ce de mot pourri. En fait je me suis remis à et plus particulierement à ce week end en vue de prendre un peu d’avance sur le cours gobelins que j’allais avoir.

L’idée était de créer une application toute simple qui me permette de suivre l’évolution de mon entrainement au rameur. Donc en gros, affichage de graphique, modification d’un XML via datagrid puis passage à pour la manipulation de l’XML..

Vous pouvez la tester via http://oni-ecchi.info/labo/TrainingFlex/ et c’est app2.air qu’il vous faudra installer.

Au final, j’ai utilisé ces adresses internet http://delicious.com/onishinji/flex et le dvd de video2brain de Flex par Herve Girolet (mon ancien prof de Flash à l’IUT).

Je reviendrais peut etre plus en détail sur cette réalisation vu qu’actuellement le source est moche :)

Tags : , , ,

Framework Java pour le jeux

Introduction

Dans le cadre de ma formation « développeur informatique multi-support » on nous a demandé de créer un en en 2D de type « mario » ou plutôt de modifier un jeux existant en vue d’apprendre par nous même le et d’en voir un coté plus sexy que les habituelles programmes en ligne de commande.

Voici l’url que l’on nous a donné : http://fivedots.coe.psu.ac.th/~ad/jg/ch062/index.html. Ce chapitre est un extrait du livre Killer Game Programming in Java présenté par son auteur sur le site http://fivedots.coe.psu.ac.th/~ad/jg. Sur ce dernier vous trouverez d’autres jeux et d’autres chapitres intéressant.

Seulement je n’ai pas pour habitude d’apprendre en traficotant des exemples de . Je le faisais quand je débutais en programmation, mais maintenant je pense être capable d’apprendre par même et de partir sur une base propre. Comme un par exemple !!

Les Frameworks Java

L’idée d’utiliser un framework java et capitaliser le temps des cours en une expérience riche m’est venu en regardant l’écran de Clément Biron et Romain pouclet qui s’intéressaient tout deux aux frameworks « processing » et à  « PulpCore ». (Il faut toujours cité ses sources :))

Alors pour maximiser nos découvertes je suis parti dans la découverte d’un troisième framework nommé Slick. Voila un bref apercu de ces frameworks après une journé à les regarder.

Processing

En un mot : Enorme. Le couteau suisse par exellence, ce framework s’adresse à tout le monde :

 » for people who want to program images, animation, and interactions. It is used by students, artists, designers, researchers, and hobbyists for learning, prototyping, and production. »

Personnellement, j’ai été bluffé par Processing quand j’ai vu cette :

http://bricktable.wordpress.com/about/what-is-roots/ Du java rapide O_o wahou !

Bien sur cela ne se limite pas qu’à ça :) Il y a quand même 6 livres qui sont sorties sur ce framework ! « Ça envoie du lourd » comme dirait certains :)

Pulpcore

Pulpcore je le vois plutôt comme un moyen d’embarquer du java dans des pages web de façon transparente et se rapproche plus de Flash. Exemple ici et un autre exemple là.

Bien que jeune, ce framework  tant à se faire connaitre avec son slogan provocateurs « Applets are back » :)

A la base, on nous a demandé de faire un jeux. Processing étant quand même énorme, et pulcore un peu trop limitatif, il fallait que je trouve un framework « médiant ». Hors Slick se positionne exclusivement comme étant LE framework dédié aux jeux 2D en java.  Great !

En gros, il fournit tout ce qu’on a besoin pour un jeux : gestion du clavier, gestion des collisions, gestion des cartes via Tiled

Tiled, Le Map editor supporté par Slick

Je reviendrais en détail sur ce framework en expliquant comment créer un jeux, ou du moins je mettrais le code source à disposition. Mais vous pouvez voir un exemple de code source ici : Un tank se déplacement sur une carte avec gestions des collisions !

Et vous ?

Si on vous demandez de faire un jeux Java en 2D, vous partiriez sur quoi ?

Tags : , , , ,

Et un framework un !

Aller sur http://blog.jaysalvat.com/articles/model-baker-une-interface-graphique-a-la-creation-dapplications-cakephp.php ou regarder simplement son screencast :

Model Baker in action from Jay Salvat on Vimeo.

Ca a l’ génial :) Dommage que ça soit seulement pour mac pour l’instant, mais c’est très prometteurs ! Apres un tour sur Symfony, sur Zend, faudrait que j’aille voir CakePHP donc :)

Tags : , , , ,

Utiliser une procédure stocké mysql avec Zend !

Dans un article précédent, je créais la « import », voilà comment je l’utilise dans Zend.

Je n’invente rien, j’ai trouvé la manip sur http://www.ericmery.fr/blog/zend_db-sql-server-procedure-stockee.

1
2
3
4
5
6
7
8
9
10
$registry = Zend_Registry::getInstance();
$config = $registry->get("config");
 
$db = Zend_Db::factory($config->db);
 
$stmt = $db->prepare("call import(?,?,?);");
$stmt->bindParam(1, $param1, PDO::PARAM_STR,1000);
$stmt->;bindParam(2, $param2, PDO::PARAM_STR, 255);
$stmt->bindParam(3, $param3, PDO::PARAM_STR, 255);
$res = $stmt->execute();

Magie, c’est la même chose. On remercie PDO et son abstracteur de base de donnée utilisé !

Tags : , , , ,

[Mysql] Procédure Stocké

Pour un projet d’annuaire de Flux RSS, j’ai du faire en sorte que l’on puisse importer ses Flux dans l’annuaire via un fichier XML opml que tout bon agrégateur (google reader, netvibes) fournit. Donc admettons que l’on a 100 flux RSS à importer il faut pour chaque flux vérifier si le flux n’existe pas déjà sinon le créer en base. Donc il faut prévoir un maximum de 200 requêtes SQL.

Seulement voilà, si on fait les instructions de test d’existence et d’insertion au niveau , cela fait 200 aller retour entre et la base . Hors ce qui plombe un script c’est souvent ces aller retour incessants .. Un moyen d’optimiser ce traitement a été de créer une qui prend en paramètre le fichier XML (où plutôt une représentation épuré plus strict), et de faire exécuter les 200 requêtes DANS . Chouette non ? Plus rapide, plus stable, plus optimisé .. que du bonheur.

Procédure Stocké en Mysql

Vous allez rire, mais d’après mes recherches googlidiennes très peu de personnes font des procédures en Mysql. Cela vient sans doute du fait qu’elles sont apparru avec mysql 5 et que c’est encore « neuf ».

Tous les exemples que l’on trouve sur le sujet sont pour SQL serveur PRo, donc du transact-SQL. Et le souci c’est qu’il n’y pas forcement d’équivalence entre les fonctions transact-SQL et les fonctions mysql. La synthaxe n’est décidement pas la même.

Outil utilisé

Mysql query browser !

L’exemple que je donne n’est valable qu’a travers sont interface .. zarb.. m’enfin c’est un très bon outil quand même, rien à voir avec un phpMyAdmin tout POURRI !

Création de la requête

Voilà la précédure allégé que j’ai crée (je fais d’autres test en version un peu plus lourde). Je vais essayer de la commenter au mieux.

La procédure s’appelle import, elle est dans la base de donné nommé « Fluxe » et on l’appelle et l’utilise comme ceci

1
2
3
4
call import(
"premier flux|http://monsite|http://monsite/fluxrss|description;
deuxieme flix|http://monsite2|http://www.google.fr/bidule.xml|autre description;
troisieme|http://monsite3|http://monsite2/rss.xml|description;",3);

Le premier paramètre est la chaine retravaillé coté PHP qui correspond à chaque ligne de l’XML, et le deuxième paramètre est le nombre de flux. Une entré se fini via un « ; » et chaque colonne est séparé via un  » | « . Bon je sais, mes délimiteurs ne sont pas assez complexe dans cet exemple et cela serait risque de bug si une description ou url comporterait des points virgules et des pipes…

Voici la requête :

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
43
44
45
DELIMITER $$  -- pas trop compris l'interet O_o
DROP PROCEDURE IF EXISTS `fluxe`.`import` $$
-- Supprime la procédure si elle existe (je suis fort en anglais hein ? ^^) 
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `import`(In myCsv Text, In nbElement Int)
-- crée la procédure avec deux paramètres "IN" de type Text et Int. C'est à dire que c'est deux paramètres obligatoires pour exécuter la requête.  
 
BEGIN -- Debut de la procédure
 
-- Declare mes variables correspondant aux colonnes de ma table Flux
DECLARE nom varchar(255);
DECLARE urlSite varchar(255);
DECLARE myurlFlux varchar(255);
DECLARE description text;
DECLARE  ligne_flux VARCHAR(1000); -- correspondra à une ligne de Flux
DECLARE cpt int; -- un petit compteur pour faire une jolie boucle While
 
set cpt = nbElement;  -- / !  Voilà comment on définit une variable SET var = valeur; 
 
WHILE cpt <= nbElement and cpt > 0 do  -- j'aurais pu utiliser une boucle Loop aussi.
 
  select replace(substring(substring_index(myCsv, ';', cpt), length(substring_index(myCsv, ';', cpt - 1)) + 1), ';', '') as ligne into ligne_flux;
 
  -- Outch "KEKECER ?" vous devez vous pausez comme question :)
  -- c'est simple, je découpe le premier paramètre In pour en extraire la 1er ligne trouvé.
  -- Les fonctions appellés ne sont pas du php mais bien du SQL ! Puissant non ?
  -- l'idée de récupèrer la 1er ligne DANS une variable "ligne_flux", d'où le "select ... INTO variable" 
 
  -- Parsage de la chaine "ligne_flux" pour en extraire les colonnes, rebelote quoi ..
  select  replace(substring(substring_index(ligne_flux, '|', 1), length(substring_index(ligne_flux, '|', 1 - 1)) + 1), '|', '') into nom;
  select  replace(substring(substring_index(ligne_flux, '|', 2), length(substring_index(ligne_flux, '|', 2 - 1)) + 1), '|', '') into urlSite;
  select  replace(substring(substring_index(ligne_flux, '|', 3), length(substring_index(ligne_flux, '|', 3 - 1)) + 1), '|', '') into myurlFlux;
  select  replace(substring(substring_index(ligne_flux, '|', 4), length(substring_index(ligne_flux, '|', 4 - 1)) + 1), '|', '') into description;
 
  -- Insertion que si la ligne n'existe pas. Le critère est l'url du flux.
  if(NOT EXISTS (select * from flux where urlFlux = myurlFlux)) THEN
       insert into flux (nom,urlSite,urlFlux,description) values (nom,urlSite,myurlFlux,description);
   end if;
 
 -- on décrémente le compteur
 set cpt = cpt - 1;
end while;
 
END $$
DELIMITER ;

Et voilà c’est fini !

Lien de référence

La base :http://dev.mysql.com/doc/refman/5.0/fr/stored-procedure-syntax.html

les variables : http://dev.mysql.com/doc/refman/5.0/fr/variables-in-stored-procedures.html
If, while, case, et tous les contrôles : http://dev.mysql.com/doc/refman/5.0/fr/flow-control-constructs.html

Mis à part la documentation officiel, j’ai rien trouvé d’autres à me mettre sous la dent ..

Tags : , , , ,

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 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 : , , ,