insideIT.fr : le blog des architectes IT de SFEIR

Aller au contenu | Aller au menu | Aller à la recherche

lundi 12 juillet 2010

Sophiaconf - Ruby On Rails

En tant que développeur java, il est important de regarder de temps à autre ce qui se fait chez les voisins afin de ne pas rester sur une certaine vision, voir comment une problèmatique se résoud dans une autre communauté.
Rails aura 2 conférences, une pas technique et l'autre technique.

Pourquoi Rails est génial ?

La première partie est faite par Camille Roux, jeune développeur qui pratique le développement Ruby depuis 1 an et a 3 ans de développement web derrrière lui. Pour les plus curieux, son site perso : http://www.camilleroux.com
Une question importante de se poser avant tout est : Qu'est ce qu'un bon framework ?
Camille nous présente un nuage important de critères, parmis eux : pas cher, rapide à développer, utilisé par beaucoup de monde, sécurisé, ...
Rails répond à tout ces critères.
Le langage à la base de Rails est Ruby, un langage interprété, multiparadigme (aussi bien object que procédural). Ruby a été crée pour être "un langage pour les hommes, pas pour les machines". En plus d'être multiplateforme, il est aussi multi-implémentation :
  • Ruby, la plateforme de base
  • JRuby, pour nous les développeurs java qui voulons réutiliser toutes nos bibliothèques
  • Rubinus, plateforme très prometteuse
Quelques chiffres sur Ruby :
  • 14 000 gem (librairies pacakgé et facile à utiliser)
  • 185 000 projet sur github
  • 10 ème langage le plus utilisé
Ruby est assurement un langage incontournable.
Ruby On Rails est un framework basé sur ce langage. On peut l'appeler ROR ou Rails pour les intimes. Ce framework a été initié par un développeur au nom imprononcavle que toute la communauté nomme DHH.
Rails posséde une philosophie basé sur le fameux "convention over configuration". On ne veut pas passer du temps du temps sur la config de divers fichiers (parce que c'est assez chiant à faire), on préfère obéir à des conventions comme nommer sa table de la même façon que son objet par exemple. Un point de cette philosophie est l'agilité : on aime le déploiement facile, et l'abondance de test.
Qu'est ce qui est si génial en Rails ?
  • Projet construit : on ne se casse pas la tête. Un autre avantage est qu'il sera plus facile à intégrer un nouveau developpeur car il connait déjà les conventions.
  • Migration : on créer un classe qui décrit les tranformations
  • Active record : les méthodes d'opérations comme save sont appelées sur l'objet lui même
  • Scafolding : Génération de code MVC. Très pratique pour une développer rapidement et facilement une interface d'admin
  • Environnement : Rails permet d'en définir facilement plusieurs : test, dev, prod, autant qu'on veut... On peut aussi avoir des gems spéciaux pour un env (test par exemple, log différents, base différente bien sûr, ...)
  • Sécurité : il est facile d'ajouter de la sécurité à son application rails
  • Javascript : Prototype est disponible. Rails donne une certaine abstraction dans l'utilisation de javascript, il est pa exemple possible de faire un bouton de rafraichissement sans faire de javascript, rails le gère pour nous.
  • Test : Avec Rails la partie test est très importante et fait parti du projet. Une partie des tests sont générés à la création du projet. Rails permets d'avoir du code testable tout au long du projet.
D'ici environ un mois, sortira Rails 3 :
Rails 3, c'est la fusion de Rails 2 et de Merb
Cette fusion des 2 projets donne un résultat très confortable au développement.
Au programme de cette 3 ème version :
  • Modularité
  • Bundles
  • Performance
  • Support du html 5
Certains reprochent à Ruby d'être lent. Qu'en est il vraiment ?
Il faut d'abord savoir qu'il y a beaucoup de benchmark qui disent beaucoup de choses, et sont parfois contradictoire. Selon de bons benchmark, il serait à la hauteur de python et de php.
Mais les performances sont elles vraiment si importantes ?
Après tout, ce qui est le plus important, c'est la vitesse de développement, la fiabilité, la facilité de maintenance. De plus, Ruby est soutenu par une communauté. On peut ainsi trouver un gem pour chacun de ses développement.
La forte présence de cette communauté permet un appentissage facilité par des forms, des tutoriaux, des screencast, des conférences comme celle çi, et bien sûr des livres
Qui utilise Rails ?
Beaucoup de sites, dont Yellow Pages (les pages jaunes américaines), White Pages, Brightlite, Github, ....
Notons que la plupart de ces sites, sont à fort traffic et que rails tient la charge.
Il y aussi des entreprises comme Amazon qui dont du ruby, même si on ne sait pas vraiment ce qu'il en font.
Au niveau hébergement, il y a aussi de bons services cloud :
  • Engine Yard : Permet de déployer sur Amazon EC2 et S3, de redimensionner à chaud le volume de machine. Pour déployer, il suffit de lui indiquer où est le repository github du code. Il permet aussi de faire le suivi de l'activité et de faire des backup
  • Heroku : 2 lignes de commandes suffisent à déployer gratuitement. Lors du déploiement, il s'occupera de télécharger les gems et leur dépendances. On pourra aussi régler le volume de machines ou s'occuper de la configuration des machines. Bien sûr, toutes les possibilités ne sont pas toutes gratuites.
Et pour le suivi de votre application, New Relic s'occupe du monitoring.
Exemple d'un succès de Rails :
Yellow Pages, un site web à très fort traffic : 1500 req/sec.
Il y a quelques années, ils étaient en JavaEE avec des EJB et connaissait des problèmes de design et de scalabilité. Le code était de 125 000 lignes et ne contenait aucuns tests.
En 2007, ils ont adopté Rails et ont refait entèrement leur site avec.
Pour des performances égales, leur code est passé à 20 000 lignes en comptant les tests.
Cette refonte, a pris 3 mois avec une équipe de 5 développeurs.
Rails est un framework qui plait, c'est d'ailleurs pour celà qu'il est copié : Grails ou Play!
Dans la salle quelques retours disent qu'ils n'est pas facile de faire du Ruby/Rails sur Windows. Git ne facilite pas non plus le problème.
Camille nous dira que Git n'est pas tout obligatoire, mais qu'il s'agit d'un produit que la communauté ruby adore.
Et pour finir, selon Camille, être développeur Ruby, c'est comme être un guerrier avec un sabre laser : ce sont des passionnés qui en font et qui font vivre.

Acte 2

Pour la 2ème partie de double présentation, c'est au tour de Maxime Menant de s'y coller. Jeune aussi, développeur de 25 ans et qui travaille avec Camille. Il nous fait aussi part de l'adresse de son blog : http://blog.maximemenant.fr
"On vous a dit pourquoi c'est génial, maintenant on va vous le montrer"
Ruby qu'est ce que c'est ?
  • Libre
  • 100% objet
  • Interprété
  • Multii-Paradgime
  • Syntaxe proche langage naturel
  • Code compact
  • Méta programmation et c'est surtout ce qui fait sa puissance
Nous voyons d'abord les bases du langages : variables, contantes, accesseurs, boucles, condition, symboles, tableau, hashmaps, définition de classe, mixins.
Je ne rentrerai pas dans les détails sur ces derniers points. Ruby offre un certain confort d'écriture.
Comme il l'a été dit, il existe plusieurs implémentations :
  • JRuby
  • IronRuby : pour .net
  • MacRuby : Objective C , maintenu directement par Apple
  • Rubinus, la nouvelle jvm ruby.
Nous voyons un exemple de Jruby de création d'une frame et de son affichage. Le code mélange de Java et Ruby. Dans ce seule l'instantiation change :
frame = java.swinf.JFrame.new()
Le reste sera comme en java.
Zoom sur les Gems.
C'est un peu comme des .deb : ça s'installe facilement (gem install XXX) et ça installe aussi les dépendances. Bien qu'il existe beaucoup dendroits où en trouver, la référence est http://www.rubygems.org
Rails s'appuie sur 2 principes :
  • DRY : Don't Repeat Yourself
  • Convention Over Configuration
Au niveau architecture, on s'appuie sur les principes de REST et de MVC.
S'en suit, un coding live, où Maxime développera une application de gestion de tâches pour d'un projet.
Le code sera bien sûr codé sous Rails 3 dont la release finale verra bientôt le jour.
Difficile de
En ligne de commande, le projet est crée avec toutes sa structure.
Une autre ligne suffira à créer une entitée Projet avec son interface d'administration et ses tests.
Bien sûr, par défaut, il n'y a pas de validation. Ces régles se définissent facilement et rapidement dans le code. Des "validates" seront ainsi posé sur la présence ou la taille de certains champs.
Et pour sécuriser ? 2 lignes suffiront.
Cette présentation est assez convaincante de la puissance de Rails. On voit aussi, que Play! S'en inspire beaucoup et en tire ce qu'il y a de bon. Ce dernier était d'ailleurs lui aussi à la sophiaconf, présenté par Nicolas Leroux, mais malheureusement en parrallèle de cette session.

Sophiaconf - Keynote du grand vendredi

Comme toute journée de conférence, cette journée commence par une keynote animée par les 2 organisateurs de cette journée : Stéphane Epardaud et Nicolas Leroux, tous deux leaders du Riviera JUG.
Un rappel sur l'organisation, ces journées de conférence ont étés organisées en partenariat entre :
  • Barcamp
  • Opencoffee
  • Inria
  • Riviera Jug
  • Telecom valley
Aujourd'hui, 12 conf et barcamp où il y aura des ateliers. Le programme ne se veut pas seulement java, il y a la présence de Rails par exemple. Durant ces 5 journées de conférences, ce sera un total de 900 (dont 434 uniques) seront venues. Petite blague, sur nos conférences à Paris : "Ne comparons pas avec eux, ils sont nous sommes minimum 200 à chaques fois".
Rappel aussi sur le RivieraJUG, né en 2009 et celà grace à Antonio Goncalves qui avec le Paris JUG a montré que c'était possible. Aujourd'hui c'est déjà 12 soirées qui ont organisées.
Cette keynote aura un intervenant spécial : Patrice Coste de Red Hat. C'est en effet eux qui nous offre le buffet du midi, ce qui nous évite des sandwichs fait par Stéphane et Nicolas. C'est coiffé d'un chapeau rouge que Patrice fera sont intervention et nous présentera Red Hat et son activité. Red Hat est un gros contributeur à l'Open Source, entre autre par JBoss.
Et pour finir, Stéphane et Nicolas adressse un merci à tout le monde aussi bien aux sponsors, qu'aux intervenants mais aussi aux simples participants.

samedi 10 juillet 2010

Sophiaconf - Scrum

Pour cette conférence sur Scrum, c'est Claude Aubry qui vient nous en parler. Claude Aubry est consultant Scrum et méthodes agiles, enseignant en méthodes agiles à Toulouse; et aussi "product owner" de IceScrum, un outil scrum open source. Il est l'auteur de "SCRUM : Le guide pratique de la méthode agile la plus populaire" dont 2 exemplaires seront à gagner.

Qu'est ce que Scrum ?

L'approche scrum préconise de faire un backlog, c'est à dire de lister des choses faire, chacunes d'entre elles ont une priorité et une difficulté. Dans les estimations que l'on fera, nous ne les exprimerons pas en jour homme mais en points. Une pratique scrum possible de cette estimation est le planning poker.
En scrum, au centre, il y l'équipe. Dans cette équipe, 2 rôles spéciaux sont définis :
  • Scrum master, personne qui fait appliquer Scrum. Ce n'est pas un nouveau nom pour un chef de projet, le role et différent
  • product owner qui est le repésesentant du client.
Intéressons nous à la signification se Scrum. Scrum signifie mélée, au même sens qu'au rugby.
Pourquoi donc ? L'origine du terme vient d'un article écrit pas un japonaus qui disait que le développement de système complexe ressemble plus à une effort collectif qu'à une course de témoin.
Sprint = période de temps, c'est un équivalent à un partie du backlog et va le transformer en produit.
Le backlog est une boite de temps qui ne déborde pas. En scrum, on ne déborde pas sur le planning, la date de fin de sprint ne se réajuste pas.
Chaque sprint se déroule de la même façon, il a son cérémonial.
On commence par une réunion de backlog, qui consiste à identifier ce qui sera réalisé pendant le sprint. C'est la réunion la plus longue de l'itération.
Il y aussi la réunion quotidienne, appelée "Scrum meeting". Son objectif est d'être rapide, c'est pourquoi elle est faite debout (à la machine à café par exemple). On y suit l'avancement du sprint, ce qui permet de suit l'avancement, voir si l'équipe est en avance ou en retard (avec éventuellement une révision du backlog), identifier les problèmes.
Une des dernière réunion est celle de démo, ou on démontre ce qui à été réalisé.
Et pour finir, une réunion de rétrospective, elle sert à analyser le sprint et d'en tirer des conclusions afin d'améliorer la façon de travailler.

IceScrum, un outil pour faire du Scrum

Claude, nous fait maintenant, un présentation de IceScrum. En sa qualité d'enseignant en méthodes agiles, il suit ce projet réalisé par des étudiants de Toulouse.
Petit historique des versions :
  • 2006 : Client lourds
  • 2008 : Passé en JavaEE, Ajax avec IceFaces
  • 2010 (en cours) : grails + jquery
Site communautaire et professionnel : www.icescrum.org et www.icescrum.com
IceScrum est téléchargeable et installable sur un tomcat ou un glassfish.
Il reproduit un environnement de travail Scrum avec :
  • Systeme de post it
  • Définition de stories
  • Planning poker
  • Roadmap
  • ...

Retours d'expérience

Scrum a l'air d'être un méthodogie interessante en théorie, mais qu'en est il en pratique ?
Bertrand Gorge de Epsitema, un éditeur logiciel, vient nous parler de la mise en application de Scrum dans leur société. Il annonce la couleur : scrum leur a sauvé la vie !!!
Pourquoi donc ?
Ils n'étaient pas très organisés et rencontraient des difficultés façe à une croissance rapide de leurs effectifs. C'est un client qui leur a conseillé Scrum. Ils ont lu le livre, "Scrum and XP from the trenches", qui les a convaincu. Scrum leur a semblé adapté, ils ont testé et gardé.
Qu'est ce qui est important dans Scrum ?
  • Le daily scrum : "sans lui, ça part en couille", évite la procrastination car les problèmes que rencontre un développeur peuvent y être connus.
  • La démo finale : Sans elle, le développement risque de ne jamais être terminé ou que ça ne corresponde pas. Eux ils en font en chaque fin de story. Quand un développeur a fini, il envoie un mail à l'équipe, et les interessés peuvent venir voir; le product owner bien sûr sera toujours là. La notion de terminé n'est pas la même pour un client et un développeur, c'est pour celà qu'ils ont une checklist à vérifier lors de la démonstration.
  • Le how-to demo, c'est la spécification. Le développement est est termininé quand le développeur fait passer le how-to demo
  • Sprint planning meeting, il sert à valider avec les développeur le contenu de chacune des stories. Le développeur peut interragir sur le how-to demo. Durant cette réunion, on pratique le planning poker qui sert à estimer.
  • DOD (Definition Of Done). Sur le scrum board, en plus de : A faire, En cours, Fini; ils ont rajouté une colonne : Vraiment fini. C'est en effet, lors de la démonstration qu'on se le développeur se rend compte :d'un oublie.
Scrum est un processus d'amélioration, si on s'est trompé, on apprends de ses erreurs.
Les erreurs qu'ils ont commis :
  • Mélanger maintenance et développement : pas facile à gérer, plusieurs solutions
  • Ne pas faire de taches et uniquements des stories, ils n'avaient que des stories. Le découpage en tache permet se rendre compte d'éventuels oublis.
  • Splitter une équipe sur le même projet, les daily scrum devenaient longs, ils avaient découpé mais ça marche pas très bien. Solution : équipe plus petite.
  • Démarrer un développement sans how-to démo : on est tenté lorsque qu'on n'a pas les infos. Il faut résister et ne jamais commencer les développements quand on a pas de how-to demo
  • Ne pas faire de dalily scrum. Parfois, ils n'en faisaient pas car le Scrum master était absent, ou tout le monde n'arrive pas à la même heure, ... Et au final, ce n'est pas bon.
Ce que a changé pour eux;
  • Augmentation de la productivité
  • Satisfaction des clients et de l'équipe
  • meilleur prédictibilité des efforts : ils ont essayé plusieurs logiciels, leur préférence est pour excel pour estimer la velocité.


C'est ensuite au tout de Paul el Khoury, chercheur en sécurité chez SAP.
Dans leur équipe, il y a : 1 scrum master, 2 product owner et 11 team member.
Leur environement est particulier dans la mesure où il s'agit de projets de consultations, et ilsarrive que leur besoin change.
Ils ont indroduit une notion de "timeblock" qui est en durée sur laquelle ils sont sur une tâche importante et ne peuvent faire autre chose. Une autre particularité est que leur équipe est divisée entre la France et l'Allemagne. Au début, ils utilisaient le téléphone pour leur réunion, mais ce n'était pas pratique, on ne sait pas vraiment qui parle ni à qui il parle. C'est pourquoi, ils ont opté pour les visio-conf. Cependant, pour planning meeting tout le monde se rencontre physiquement.
Leur projet est divisé en 2 sous projet (d'où leur 2 product owner). Leur daily scrum se fait à 11h15. Cette horaire peut sembler étrange, mais il semble que c'est pour avoir un effet psychologique : les gens seraient apparement plus concentrés que si elle avaient lieu à 11h.
Scrum leur a appris à se focaliser au jour le jour. Après 9 mois de pratique, ils ont beaucoup appris. Selon eux, les projets de consultations ne sont pas les meilleurs endroits pour utiliser Scrum.

L'intelligence situationnelle

Et pour finir, cette conférence, Claude Aubry revient nous parler de l'intelligence situationnelle.
C'est un terme qui vient de Pierre Villepreux, ancien joueur de rugby. Claude nous montre un extrait du texte, il suffit de remplacer "joueur" par "développeur" et c'est tout à fait dans l'esprit de l'agilité.

3 croyances erronées à propos de Scrum :
  • "Par ce que nous disons être agiles, nous le sommes". Beaucoup d'équipes prétendent être agile, en grattant un peu, on voit qu'elle ne sont pas vraiment.
  • "Vous pouvez être agile en faisant comme nous". ce n'est pas parce que ça marche que ici que ça marchera là bas, ça dépend du contexte.
  • "Nous voudions être agile mais ce n'est pas possible". C'est certainement plus difficile à certains endroits, mais ça reste toujours possible
Une liste de pratiques existe-elles ?
Pas vraiment, cependant, il existe certaines pratiques indispensables de Scrum.
Comment faire ?
En fonction du contexte, il faut identifier les pratiques et définir comment les mettre en oeuvre, il faut étudier la situation.
Quelques exemples :
  • Gouvernance forte : Il est important de sensibiliser l'environnement (manager, client, ... ) sur la façon dont on va travailler. Il peut aussi être utile de faire du reporting supplémentaire pour coller à certaines pratique du process. Attention cependant, à ne pas faire un retour au cycle en V.
  • Le multiprojet : Quand certaines personnes travaillent sur plusieurs projet avec différents client. Scrum nous dit qu'on ne doit pas perturber un sprint. Il serait donc possible de faire des sprint plus court et de voir comment s'adapter pour traiter les urgences.
  • Distribution géographique : 60% des développements logiciels se font avec des équipes réparties. Dans ce cas, la vidéo conf peut être une solution
  • Forfait : Comment gérer le problème du product owner ? On peut par exemple, faire des mise en place spéciale et prévoir de voir fréquement le client.
  • Gros projet : comment diviser les équipes ? On peut par exemple mettre un product owner général et un scrum master par sous projet.
C'est à chaque organisation se trouver en tenant compte du contexte et en s'améliorant. Il leur faudra acquérir une culture de l'agile, connaitre le contexte, adapter les pratiques de ce contexte, former l'équipe à ces pratiques, les mettre en oeuvre, ajouster à chaques sprint.
Il ne faut pas croire qu'il y ait un processus agile ultime. Il y a toujours les choses à améliorer. Si tout va bien, c'est louche.
Si on ne fait pas attention à la qualité logicielle, elle se dégrade, il faut la surveiller dans chaque sprint.
On en peut pas appliquer scrum sans tenir compte du compte. La plupart des pratiques sont utiles, mais ne s'appliquent as de la même façon partout.
Le développement logiciel n'est pas de la production comme dans un usine. On a besoin d'apprendre des choses. Dans les méthodes agiles, on considère qu'il est important de connaitre le coté métier de ce que l'on développe et qu'il faut savoir se former aux nouvelles technos.

lundi 5 juillet 2010

Sophiaconf2010 - Android

1ère partie : Tout savoir sur l'évolution des 12 derniers mois et de l'année à venir

Aujourd'hui, pour cette 3ème conférance, c'est Arnaud Farine (Fondateur de eXpertise Android et rédacteur pour le site frandroid) qui débute.
Cette fois ci beaucoup plus de monde dans la salle, 190 personnes s'étaient inscrites.

1 an d'Android

Pourquoi 1 an ?
Tout simplement parce qu'il y a un an, Arnaud été venu présenter Android à une conférence ici, à Sophia Antipolis. Cette conférence était assez technique. Le but de la conférence ce jour, ne sera pas de faire la même, les notions de base comme qu'est ce qu'un intent, ne seront pas ré-expliquée.
Arnaud commence par rappeler quelques notions sur l'environnement : Qu'est ce qu'est Android, OHA, market, SDK, STK (Sim Toolkit), ...
La fragmentation commence à se montrer (résolution, matériel, ...). Le problème de la fragmentation vient des constructeur et opérateur qui souhaitent personnaliser le système.
Petit rappel sur Android aujourd'hui : 
  • 160 000 devices vendus par jour
  • 70 000 applications
  • 48 pays
  • 1er système mobile sur internet (attention au chiffre fournit par Admob)
  • 190 000 developpeurs
  • 59 constructeurs
L'année dernière en juin, alors qu'il n'y avait seulement que 2 téléphones (G1 fream et le G2 Magic), il y a en aujourd'hui 30 et 20 tablettes. D'ici la fin de l'année, il devrait y avoir 60 smartphones et 50 tablettes.
Tous les opérateurs s'y sont mis. 
Chez Bouygues, les 5 mobiles les plus vendus sont des téléphones sous Android. Si quelqu'un avait annoncé cela l'année dernière, personne ne l'aurait cru.
Grosse évolution aussi niveau performance : meilleure résolution, 2 fois plus de puissance et mais aussi le multitouch.
Sur le plan des applications, la progression aussi a été fulgurante :
Juin 2009 : 6000 applications (1500 applications par mois) avec des markets accessible au Etats Unis et Europe
Juillet 2010 : 80000 applications (14000 applications par mois) avec un market présent dans le monde entier
Les applications google aussi connaissent une bonne évolution : Google maps, Street View, Google navigation (depuis septembre au US, et depuis peu en France). Selon Arnaud, Google Navigation est un produit de bonne qualité, depuis qu'il s'en sert: le  Garmin reste au coffre. Ce dernier ne semble pas inquiet face à ce concurrent, selon eux,  car leurs puces sont plus performantes que celle de téléphone mobile. Garmin devrait sortir un GPS/Teléphone en alliance avec Asus.
Coté market, depuis l'année dernière, on a vu des android markets qui se développent et viennent combler les manques du google market (sur le contact d'un développeur par exemple).
C'est ainsi qu'est apparut un market où il est possible de payer avec son compte Paypal. Le moyen de paiement est d'ailleurs un  des reproches qui est souvent fait au google market; les utilisateurs préféreraient une facturation opérateur. Au US, T Mobile l'a fait, et en France, Orange travaille dessus.

Améliorations des versions

Avec les différentes versions d'Android, sont venus leur lot de nouveautés et d'améliorations pour l'utilisateur mais aussi pour le développeur.

Donut

Utilisateur Développeur
  • Commande vocale (pas en fr)
  • TTS (Text To Speech)
  • Ergonomie revues
  • Nouveau interface market
  • Economie NRJ (voir ce qui consomme le plus)
  • Nouvelle interface photo.vidéo
  • Système de recherche intégré au mobile
  • Gestion résolutions
  • Suppression de AbsoluteLayout (pour compatibilité différentes résolutions)
  • SearchManager
  • Api TTS (text to speetch)
  • OnClick xml
  • Optimisation du touch avec l'outil Gesture Touch
  • ADT6

Eclair

Utilisateur Développeur
  • Nouvelle interface
  • Syncho multi compte avec exchange en natif
  • Interfacemail tous les comptes
  • Zoom numérique amélioré
  • Applications d'effets
  • Multitouch (des gens ont un peu ralé, google a libéré le code)
  • Bluetooth 2.1 (à début juste pour oreillette,)
  • Echange de données
  • Amélioration navigateur internet
  • Moteur de recherches sur ls contacts ou les MNS et appli autorisants
  • Live Wallpaper
  • Maps Navigation
  • Optimisation outils création IHM
  • API live wallpaper
  • API BT
  • Gestion du signal réseau
  • Gestion des changements de connexion
  • Multitouch
  • Modification gestion contact
  • Support Chrome Webclient

Froyo

Utilisateur Développeur
  • Amélioration UI
  • Android market sur pc
  • Communication Pc/Android (seulement sous chrome via extensions)
  • Maj auto de tous les applis installées
  • HTML5 et accès matériel
  • Javascript 8
  • Tethering/ partage de connexion wifi
  • Installation s'application sur SD
  • Flash 10 (pas très satisfaisant). Pas testé Adobe Air
  • 20% + rapide
  • Open GL ES2
  • InstallLocation (SD)
  • Backup Manager (cloud), mais pas toutes les données.
  • Reconnaissance Vocal
  • Compression YUV
  • API Camera modifiée (visu) / Exif
  • Gestion de la sécurité
  • Fill_parent (deprecated) vs match_parent

Bilan des évolutions : en 2009, 4 versions et en  2010, 3 versions. Ce rythme est jugé trop rapide de la part des acteurs qui n'ont pas le temps d'intégrer leur modifications avant qu'une nouvelle version ne sorte. Pour y remédier, Google a décidé de limiter les versions à une par an.
Les chiffres donnés par Google sur la répartition (à savoir 50% d'Android 2.1 en juin 2010) sont ils représentatifs du marché français ? Arnaud en tant que responsable sur Frandoid, avait lancé une grande enquête. Il semblerai ainsi qu'en France, il y ait 60 % de version d'Android 2.1

Et dans 1 an ?

Arnaud précise qu'il ne posséde que peu d'information à ce sujet, et pour ses prévisions, elles sont liées à son expérience et sa boule de cristal.
  • Android 3.0 : nouvelle IHM,
  • 150 000 applications
  • 3 ou 4 ème OS  smartphone et 1er OS sur les tablettes
  • Diminution de la fragmentation,
  • Nouveau matériel : TV, set top box commercialisé
  • Google voice accessible en Europe
  • Apparition de matérial 3D, de la vraie 3D sans lunettes
  • Payement applications sur la facture opérateur
  • Arrivée d'un ADT1.0
  • Intégration du NDK dans le SDK, aujourd'hui c'est assez rébarbatif
  • Plus d'accès au matériel via HTML5
  • Présent dans les cursus d'écoles d'ingénieurs / université
Et pour finir, il note que le marché à changé au niveau de professionel. En 2008 personne ne savait ce qu'était Android.
Depuis fin de l'année dernière , la tendance  s'est inversée, beaucoup de demandes de développements, consultating de haut niveau, ...
L'année dernière, alors qu'on demandait des portages d'application Iphone pour Android, maintenant, on rencontre de plus en le contraire : on développe d'abord une version Android avant de voir pour d'autres OS.
La présentation finie quelques questions de l'assistance :
  • Les markets alternatifs ne risquent ils pas de  créer de la fragmentation ?
    Non car c'est les même applications. De plus, ils sont réservé à une élite d'utilisateurs pour le moment.
  • Quelle est la position de ChromeOS par rapport à Android ? 
    ChomeOS est prévu pour les laptops, ce n'est pas les mêmes usage.

2ème partie : Retours d'expériences

GridPocket

C'est Filip Gluszak, CEO & co-founder de GridPocket, qui commence.
GridPocket est une start-up visant à offrir une aide à la maitrise de la consommation énergétique. Leur solution s'intègre dans la mouvance des compteurs dit intelligents et ont choisi Android. Le but de leur application mobile est le suivi de consommation, l'analyse de l'impact environnemental et les alertes état du réseau.
Avec des besoins initiaux qui étaient : la nécessité d'avoir un prototype rapidement, de démontrer l'interet de l'application aux clients et investisseurs et de préparer des trials avec des clients; ils ont donc choisi Android pour son nombre d'utilisateurs en grande croissance, une flexibilité en terme de programmation que IPhone et une différentiation par rapport à IPhone (leur donnant ainsi une avance technologique).
Leur bilan est très positif malgré quelques reproches :
  • Emulateur peu efficace en lignes de commandes
  • Pas de multitouch jusqu'à présent
  • Performance SQLite limitée (getCount() très lent par exemple)
  • Message erreur utilisateur peu efficace, difficile de débugger avec
  • STK très limité
  • Problème UI qui ont été résolu en passant en 1.6

Orange Labs

C'est maintenant au tout de Philippe Gilbert, Ingénieur R&D Orange Labs.
Un des utilisation que Orange Labs a pu faire avec Android est une interface pour le monitoring de bundles OSGI dans des devices livebox. Ils possédaient déjà une telle application mais sous forme web. Leur interrogation était de savoir comment l'application pourrait se porter sous Android ? 
Leur interface web n'était pas portable en tant que tel. 
Ils ont ainsi du refondre l'interface graphique en utilisant des composants graphique Android et des appels avec des services REST pour la communication coté serveur.
Au final :
  • 10 000 lignes de code
  • 4 Activities
  • 1 mois et demi de développement pour une seule personne (code, test et intégration)
  • Application full java
  • Utilisation d'api REST
  • Internationalisation
Les conclusions qu'ils tirent de leur développements :
Forces :
  • Réutilisation composa,te et app java, pas de scenar de rupture
  • Intégration + ue du ndevde composant
  • Bon support (forum, blog, ...)
  • Bonne intégration à Eclipse
Faiblesses :
  • Il faut un peu de temps pour se familiariser avec les concepts de développement Android
  • Recompilation de bibliothèques externes qui devient difficile lorsqu'il y a beaucoup de dépendances (ex SOAP)
  • Peu d'outils
Tendances intéressantes
  • html 5
  • Automatic update + bug report
  • Entreprise API
 

SAP

Et pour finir, Laurent Gomez et Stéphane Dupin, d'un département R&D de SAP.
Une de leur utilisation a été une application de prévision de consommation (énergetique,  eau, ...).
Pourquoi avoir choisi Android ? 
Parce que ça leur a eu l'air l'air sympa, communauté grande, plateforme ouverte.
Ils sont satisfait du mode émulateur qui leur procurait des performances égales à celles de leur device HTC Hero
Eux aussi trouve l'utilisation de lib externe peu pratique et niveau composant regrettent l'absence de composants de type charts.
Pour la communication avec le monde extérieur, les appels REST leur ont très bien convenu et recommandent cette manière de procéder.
Leur conclusion et que Android est prometteur mais encore jeune mais qu'il continue a développer dessus.

vendredi 2 juillet 2010

Sophiaconf2010 - Propriété intellectuelle

1 ère partie : Intellectual Property Rights Analysis (IPRA)

Pour cette présentation, nous retrouvons encore une fois Maitre Pascal Agosti ainsi que Patrick Moreau, responsable du patrimoine logiciel à l'INRIA.
Le marché du logiciel libres est en pleine croissance : +30% de 2010, mais reste encore peu présent. Comme beaucoup de choses, c'est lorsqu'il est devant les tribunaux que l'ont se rend compte de son importance.
En temps que développeur, il faut prendre en considération le cadre juridique.
Question à la salle : qui est le possesseur des sources ? C'est l'employeur.
Pascal a participé avec la commission open source de Telecom Valley à l'écriture d'un livre blanc sur l'édition du libre; livre blanc qui devrait sortir prochainement.
Actuellement, les licences open sources pose le problème législatif : ces licences n'étant pas traduites, elles n'ont pas de droits français applicable et c'est donc le droit anglo-saxon qui est valable.

C'est au tour de Patrick de prendre la parole. Celui commence par rappeler le soutien de l'INRIA à l'open source. 
Dans le développement logiciel, le risque juridique doit être géré et doit être résolu pour la 1ère diffusion.
Une IPRA est une photo à une moment de la vie du logiciel visant à qualifier le statut logiciel, c'est à dire son intégrité juridique. Cette méthodologie a été mise en pratique sur plusieurs logiciels en interne.
En conclusion, il devient de plus en plus necesaire de prendre en compte l'aspect juridique tout au long de la création d'un logiciel libre pour éviter tout risque pouvant devenir paralysant et rendant le logiciel libre.

2 ème partie : Le point de vue d'un développeur

Philippe Kaplan va nous exposer la propriété intellectuelle par une histoire qu'il a vécu.
Il travaille pour Ilog, une ancienne start up de l'INRIA rachetée en 2008 par IBM. Cette société produit plusieurs logiciel qui sont devenus numéro 1 dans leurs domaines respectifs.
3 mois avant le rachat, IBM en tant que client demande une évaluation des droits.
Mis à part quelques remarques, cette évaluation s'avère bonne, ce qui a fortement influencé IBM dans le rachat.
Une fois le rachat effectué, la principale priorité a été de certifier l'origine de tout le contenu des produits.
Quelques chiffres sur les produits :
  • 1,5 millions de lignes de code
  • 10000 images
  • 50 Mo de données
Quelques problèmes sont apparus : 
  • Dans un fichier xml de démonstration figurait des données clients. Le client avait donné un accord uniquement oral à quelqu'un qui n'était plus dans la société. Il a donc fallu refaire ce fichier.;
  • Les images sont des éléments difficiles à tracer. Ce n'est pas parce qu'elle figure sur un site ou elles sont disponibles sans restrictions qu'elles sont utilisable : la personne qui l'a déposée aura pu la trouver ailleurs.
Il a fallu au total 1 an pour tout certifier et corriger les problèmes. Pendant cette période aucune nouveauté n'ont été apportées aux logiciels.
Pourquoi donc une telle volonté alors ?
  • IBM ne souhaite pas être attaqué en justice. Un procès pourrait lui faire perdre beaucoup d'argent
  • Réputation, un tel procès entache une réputation
  • Par respect du client : c'est trahir le client que de lui fournir un logiciel dont une partie a été volée
Phillipe nous apporte quelques définition personne de développeur :
  • copyright : droit qui protège l'expression d'une idée
  • Licence : document donnant la permission officiel de faire quelques choses et de limiter la responsabilité de l'auteur
L'open source initiative définit en 10 critères ce qu'est un logiciel libre et reconnait 60 licences open source.
Il faut savoir se méfier du copier/coller : ce que l'on prends est il soumis une licence ?
On est soumit à de différentes sources possibles
  • internet : site, forum, blog
  • logiciel déjà installé
  • aide par collège, pire : un ancien collège (lui demande t-on d'où viens le code ?)
Pour qu'il y ait plagiat il faut que 2 conditions soient réunis :
  • Avoir eu accès au code original
  • Avoir fait un code proche
C'est 2 conditions sont nécessaires et suffisantes.
Si cette question est abordée, c'est justement parce qu'Ilog a rencontré un problème de ce type dans l'un ces logiciel lors de la grande vérification.
Le problème semble anodin : une classe qui dessine une sinusoïde récupérée dans un livre. Oui, mais ce livre est édité par Sun est semble être soumis à certains droits spéciaux. IBM ne préfère pas prendre le risque d'un procès. Il va falloir refaire le code et c'est là où ça se complique ... Comment dessiner une sinusoïde sans utiliser de sinus ? 
IBM propose une solution qui permet de résoudre ce genre de problème :
Les développeurs ayant participé à ce développement sont considérés comme "contaminés", ils ne peuvent donc pas résoudre le problème eux même. Il faut faire appel à d'autres développeurs qui ne connaissent pas l'application, ni le livre et n'ont jamais eu à faire à ce genre de développement, ils sont dit "non contaminés". Un arbitre sert d'intermédiaire dans leurs communication. Les contaminés spécifie le besoin mais sans laisser d'indices : il ne faut donc pas parler de sinusoïde pour ne pas influencer les non contaminés. Difficile de demander la représentation sous forme sinusoïde sans parler du terme. Heureusement, les images sont autorisées. Lorsque le développement est fini, les contaminés testent. En cas d'erreur, ils ne peuvent pas dire pourquoi le test ne passent pas (car c'est donner des indices) tout ce qu'ils peuvent faire c'est modifier les spécifications. Lorsque le code est opérationnel, il doit être stocké sur un repository propre lui aussi pour ne pas être contaminé.
Qu'est ce qu'un brevet ?
Le principe de brevet a plus de 100 ans et s'appliquait au début à la mécanique et à la chimie.
Il donne un monopole temporaire sur l'exploitation d'une invention. Le brevet doit cependant réunir 3 conditions : il doit être nouveau, utile et non trivial.
1er exemple : un inventeur avait un crayon et une gomme séparée. Il les a simplement réunis sous la forme que l'ont donnait tous aujourd'hui. Cette invention a elle pu profiter d'un brevet ? Non. C'était nouveau, utile mais trivial car la gomme est juste fixée sur le crayon.
2ème exemple : un téléphone et a coté un enregistreur, ça donne un répondeur. Le brevet est il valable ? Oui. C'est aussi nouveau et utile mais aussi non trivial, car pour que le système puisse se mettre en route il faut plus que les fixer : il faut les connecter, dans ce cas par de l'électronique.
Conclusion :
Respecter la propriété intellectuelle est une question de qualité et d'intégrité. Le développeur est garant de cette intégrité. Lorsque l'on importe du code, il faut faire attention et bien y réfléchir. Aussi bien pour du code que des images ou des données. Une erreur pourrait être grave pour l'entreprise et l'employé (peut être une faute professionnelle grave). 
Mais vive la partage quand même !

3ème partie : table ronde

C'est maintenant au tour des questions.
Beaucoup de questions sur l'anecdote de la sinusoïdale. Les babyloniens eux aussi avaient déjà dessiné des  sinusoïdale grâce au sinus. Le livre ne les a t-il pas plagié lui aussi ?
C'est un argument qui serait tout à faire recevable devant un tribunal, mais c'est une autre histoire. 
La raison pour laquelle IBM préférait que les ingénieurs passent du temps sur une ré-écriture, c'est qu'ils ne veulent pas laisser une possibilité de se faire attaquer en procès. Ils ne veulent pas prendre de risques.
Une personne dans la salle, qui semble exercer dans le domaine juridique, n'est pas tout à fait d'accord avec la définition de plagiat donnée lors de la présentation. Pour elle la 1ère condition, n'est pas obligatoire : il peux y avoir plagiat sans avoir eu accès au code original. Il ne faut pas non plus oublier le droit d'auteur tout les logiciels y sont soumis.
Y a t-le une limite à partir de laquelle on peut considérer qu'il y a plagiat (un plagiat de 2 lignes serait en effet absurde) ? 
La loi ne semble rien indiquer à ce sujet.
Comment savoir qu'on ne plagie pas ?
Le plaignant dans son dossier doit être le plus précis possible, tout est dans la pré-constitution de la preuve. On peut faire déposer du code à l'APP si on le souhaite, pour plus tard pourvoir apporter une preuve en tant que plaignant.
Et les logiciels non libres s'il plagie ? On ne peux pas facilement le vérifier.
On est dans le domaine du "pas vu, pas prit" et là aussi tout est dans la pré-constitution de la preuve.
Un algorithme est une spécification est un brevet ne peux être posé dessus. En revanche, il peut être soumis au droit d'auteur.
En France, il existe la licence Cecill. L'INRIA a justement participé à son élaboration. Vaut il mieux utiliser celle ci plutôt que la GPL ?
Ça dépend ce que l'on veut faire du logiciel : la licence Cecill est reconnu en France par la loi, mais pas à l'étranger.

Sophiaconf2010 - Gestion de l'identité et sécurisation des services webs

C'est en ce moment même qu'à lieu la sophiaconf2010. Tout d'abord, qu'est ce la sophiaconf ?
C'est un ensemble de 20 conférences organisée en partenariat entre plusieurs acteurs de Sophia Antipolis comme la commission open source de Telecom Valley ou le Riviera JUG. Point intéressant, ces conférences sont gratuites ou presque. Pour plus d'informations http://sophiaconf2010.fr/


1ère partie

La conférence commence avec Hubert Le Van Gong, architecte spécialisé dans la gestion d'identité et sécurité. Il est aussi community leader pour open sso, développeur OAuth et a déployé openid au sein de Sun.

Problématique

  • fracture paysage et identité de l'entreprise
  • Explosion de la complexité
  • Rationalisation des couts
  • Limitation des risques
Il y a 20-30 ans, sur le web, la notion d'identité n'existait pas. Avec l'explosion du web, les services se sont multipliés; et pour chaque services, une identité différente. Depuis 10 ans, le partage de l'identité fait son chemin.
L'objectif des protocoles de gestion d'identité est de limiter la complexité.
Il existe néamoins des risques sur la vie privée et sur l'exposition des entreprises.
L'actualité nous le montre : 
  • Facebook et ses contreverses sur la vie privée. Le bouton "aime" entre autre qui expose publiquement
  • Google avec Street View et sa tentation de garder des infos dont il n'a pas besoin

Objectifs

  • Limiter les risques
  • Sécuriser les services web et les échanges
  • Limiter le vol d'identite pour le consommateur
  • Limiter l expo légale d'une entreprise
Autres avantages
  • Meilleure interopérabilité
  • Architecture plus simple, plus efficace
  • Satisfaction de l'usager
  • Rationaliser les couts
  • Réduction moyens informatique
  • Eviter les duplications d'informations
Exemple d'un achat sur internet :
Je commande, je paie par carte bancaire et me fait livrer sur mon lieu de travail.
Le site à t il besoin de savoir ou j'habite ? Pas forcément.
La banque a t elle besoin de savoir ce que j'ai commandé ? Non.
Le livreur a t-il besoin des mes coordonnées bancaire et ce que j'ai commandé ? Non

Délégation authentification

Idp : identity provider, c'est lui qui gère l'identification.
Sp : Service provider en gère plus l'identité. Fait partie d'un cercle de confiance avec l'idp. Il partage des attributs avec l'idp. Il en fait usage mais ne les stocke pas. 
Les principaux protocoles sont :
  • SAML 
  • Shibboleth
  • Openid
  • Ws-federation
L'adoption se fait à la fois dans le secteur privé (banques, telecom, ...) que dans le service public de plusieurs pays (France, Nouvelle Zélande, ...). En France par exemple, monservicepublic utilise open sso.
SAML
  • La référence
  • Sinle sign on (SSO)
  • Single log out
  • Fédération identité
  • Echange attribut
SAML fonctionne par jetons d'assertions (auth, autorisation, attributs)
protocoles : requetes/réponse pour obtenir les assertions et gestion identité
binding : mapper les protocole saml sur les autres (soap, http redirect, ...)

Délégation d'autorisation

  • id-wsf 2.0
  • OAuth (le pendant openid de la délégation d'autorisation)
  • ws-*
Adoption au sein de réseaux sociaux comme twitter mais le plus gros reste à venir.


OAuth
  • Orienté web 2.0
  • Se charge aussi de la délégation authentification
Mode de fonctionnement : autorise un service web a échanger avec un autre services web de la part d'un utilisateur authentifié.
Il existe des bibliothèques dans la plupart des langages.

Ws-*

Ses spécifications ne sont pas forcement basé sur identité. C'est aussi une assez grosse grappe : beaucoup de dépendances entre les différente spécifications. Néamoins certaines se détachent : ws-adressing, security, trust (confiance), policy (modélisation des contrainte usage).

Conclusion

2 grands domaines :
  • délégation authentification 
  • délégation autorisation
Les 2 principales spécifications sont SAML et OAuth.


2 ème partie : les retours d'expérience.

C'est Pascal Agosti qui commence cette partie. Il n'est pas du tout dans la technique puisqu'il est avocat au barreau de Nice chez Caprioli Associé. Il est cependant spécialiste du droit dans le monde informatique, même s'il avoue ne pas toujours comprendre ce que nous (les gens de la technique) racontons.
 
Il  commence par nous raconter une petite histoire datant de quelques années : un couple avait constaté que peu à peu des transfert avait été fait à leur insu et représentaient une somme de 26500€. Selon la banque, ces transferts avaient été effectué depuis leur compte en ligne et ne voulait pas rembourser, c'est le client qui est responsable si son mot de passe est découvert en étant trop simple par exemple et de sa non divulgation. Cette affaire a finit devant les tribunaux. Quelle a été le verdict du juge ? L'authentification par login et mot de passe est insuffisante... Cela marqua en première dans ce domaine.
L'authentification, c'est la vérification d'une identité.
Il est donc important de ne pas confondre les notions d'identification et d'authentification. Le problème est que les lois parlent d'identification et non pas d'authentification.
Un seul facteur pour authentifier n'est pas suffisant. 
Techniques authentifications :
  • Quelque chose que l'on connait (mot de passe, ...)
  • Quelque chose que l'on possede (carte à puce, ...)
  • Quelque chose qui nous est personnel (biometrie, ....)


C'est ensuite au tour Frédéric Aime, CTO de Janua, qui nous livre un retour d'expérience de Openid
cas 1 : utilisation de la couche Openid pour logiciel de sécurisation "end point' entrée de gamme.
cas 2 : utilisation de Openid dans un logiciel de widget de bureaux pour se rapprocher de sso.
Son avis est Openid est intéressant pour mais ne doit pas concerner des taches risquées où on attend un niveau de sécurité important.
Il existe plusieurs implémentations : java, php et .net
java : openid 4 java
Avantages/inconvéniants
  • Intégration facile 
  • Multi-langages
  • Limité à de l'authentification pure  :loggé ou non, il ne gère pas de droits.
  • Identité est maintenue par le client et n'est donc pas garantie
  • Pas de gestions de droit
  • 100 % web based (pas de client lourds)
Tant que l'on pas la Nasa ni une banque, il convient pour une authentification basique.
Et pour finir, Florent Peyraud, cofondateur de Tryphon SARL, vient nous parler de CACert, autorité de certification communautaire qui fournit gratuitement des certificats électronique.

Un certificat électronique doit être :
  • cryptage asymétrique
  • certifié
Autorité de certification
  • Commerciaux : Thawte, verisign, gandi
  • Gratuit : CACert, Gandi (1 an), Verisign (60 jours)
En tant que système communautaire, un certificat CACert est validé par les membres. Avec le temps, et vos validations de membres, vous gagnez des points et votre certificat obtient plus de crédibilité.
Cette initiative est basée en Australie. Le contrat de certification étant rédigé en langue anglaise et mentionnant l'adresse australienne de la communauté, il semblerait que ce soit le droit australien qui s'applique.
Sophiaconf2010 - Gestion de l'identité et sécurisation des services webs

dimanche 20 juin 2010

Tests java asynchrone : AssertRetry

Je souhaite ici partager une expérience lors de l'écriture de tests unitaires en Java

Le Besoin

Ecrire un test dont l'action est asynchrone (ex: batch, thread, workflow, ...)

 

L'Erreur

Ajouter un Thread.sleep() entre l'action et les assertions

Cela va temporairement résoudre votre problème : le test va passer.

Mais cela a de nombreuses contraintes :

  • Votre série de tests va commencer à être très longue.
  • À chaque fois que le test va échouer sur la machine d'un développeur, celui-ci va être tenté d'augmenter le délai d'attente.

Ainsi, la durée de votre test est contrainte par la machine la plus lente.

Personne ne veut avoir une suite de test longue, encore moins une suite qui ne fait qu’attendre.

Le timeout sur les tests apporté par les annotations Junit 4 permet de définir un temps d’exécution maximal pour l’ ensemble de la méthode de test, mais il ne permet pas de placer les assertions à la fin du timeout. Il nous faut donc trouver d’autres solutions.

Solution 0 : Contourner

Si cela est possible, placer les tests plus près du code, et faire un test simple.

Solution 1 : Listener

Réussir à observer la fin du traitement par une attente passive (Pattern observateur), associé à un timeout.

C'est ce qui est fait par exemple dans GwtTestCase

http://code.google.com/intl/fr/webtoolkit/doc/1.6/DevGuideTesting.html#DevGuideAsynchronousTesting

La durée d’exécution du test est ainsi parfaitement ajustée à la durée de l'action testée.

 

public void testDoWithCallback() throws Exception {

      final Async async = new Async();

      async.doWithCallBack(new Async.Callback() {

            public void onSuccess() {

                  finishTest();

            }

                  public void onError(Throwable t) {

                  finishTest(t);

            }

      });

      delayTestFinish(11000);

      assertEquals(10, async.result);

}

Il existe une variante avec wait et notify, mais le code est moins lisible (voir sources). 

Solution 2 : AssertRetry

Dans le cas où vous ne pouvez pas être notifié de la fin du traitement, ce qui était mon cas.

La solution que j'ai trouvée est de faire plusieurs essais successifs afin de vérifier la fin correcte du traitement.

Les assertions sont définies avec un nombre d'essais supplémentaires et une durée d'attente entre les essais.

Ainsi, le test passera avec peu d’essais sur une machine puissante, et passera également sur une machine moins puissante,

jusqu’à atteindre le timeout implicite ( nombre d’essais supplémentaires * durée d’attente), dans ce cas, la dernière assertion échoue.

public void testDoWithoutCallback() throws Exception {

    final Async async = new Async();

    async.doWithoutCallBack();

    new AssertRetry(10,1000, new AssertRetry.AssertTry() {

            public void assertTry() throws Exception {

            assertEquals(10, async.result);

      }

    });

}

 

Conclusion

J’ai trouvé cette solution du AssertRetry efficace et élégante.

Je n’ai pas trouvé d’équivalent dans les frameworks de test, mais si vous en connaissez un, faites-moi signe.

Le code fourni peut être consommé sur place ou à emporter.

 

package fr.wokier.assertion;

 

import org.apache.log4j.Logger;

 

/**

 * Allows to give multiple tries to some assertions, without adding arbitrary and

 * time consuming Thread.sleep() calls

 *

 * @author f_wauquier

 */

public class AssertRetry {

 

    private static final Logger LOGGER = Logger.getLogger(AssertRetry.class);

 

    /**

     * Internal class for AssertRetry

     *

     */

    public interface AssertTry {

        /**

         * Does one or more assertions

         *

         * @throws Exception

         *             eorror or assertion failure

         */

        public void assertTry() throws Exception;

    }

 

    /**

     * Builds an AssertRetry

     *

     * @param retryTimes

     *            number of times the assertTry will be called AGAIN (0 calls it

     *            only one time)

     * @param assertTry

     *            Implements your own AssertTry containing assertions

     * @throws Exception

     */

    public AssertRetry(int retryTimes, AssertTry assertTry) throws Exception {

        retry(retryTimes, 0, assertTry);

    }

 

    /**

     * Builds an AssertRetry

     *

     * @param retryTimes

     *            number of times the assertTry will be called AGAIN (0 calls it

     *            only one time)

     * @param sleepTimeInMillis

     *            sleep time between assertTry calls, in milliseconds

     * @param assertTry

     *            Implements your own AssertTry containing assertions

     * @throws Exception

     */

    public AssertRetry(int retryTimes, int sleepTimeInMillis, AssertTry assertTry) throws Exception {

        retry(retryTimes, sleepTimeInMillis, assertTry);

    }

 

    private void retry(int retryTimes, int sleepTimeInMillis, AssertTry assertTry) throws Exception {

        if (retryTimes == 0) {

            assertTry.assertTry();

        } else {

            try {

                assertTry.assertTry();

            } catch (Throwable e) {

                LOGGER.warn("Try failed (remain " + retryTimes + ") :" + e.getMessage());

                Thread.sleep(sleepTimeInMillis);

                retry(retryTimes - 1, sleepTimeInMillis, assertTry);

            }

        }

    }

}

 

 

Sources

jeudi 17 juin 2010

Update or Insert sur SSIS avec un Lookup simple

La problématique :

Déverser certaines données d'une table source vers une table destination en évitant les doublons. La table source pourrait par ailleurs être un fichier plat ou un service web mais le sujet n'est pas là.
Dans SSIS l'objet qui adresse cette problématique est le "Lookup". J'ai pas mal cherché dans les forums, c'est rarement détaillé comme j'aime, c'est à dire en images. Je me lance donc, et là c'est une vrai BD, accrochez-vous. Voyons en détail comment mettre en place un Lookup simple dans SSIS.

Lire la suite...

mardi 8 juin 2010

How to export – import data from App Engine's Datastore in java development.

Today I am going to talk of one of those things that can get you bordered many hours Googling the web before find out the right way to do it.
I just land in the GWT island with Duke, on his Google App Engine, coming from the old Java EE world. Working on Fastcall I had to export - import data from the Google's App Engine Datastore. At first glance, I expected  to do it in two or three clicks, but that was not the case.
Very quickly I get stuck because my project was developed on the Java runtime environment where the native support for export – import  data is missing.
So if you are concerned with that, take a closer look at this post.
1- Due to the use of python, we’ll install on our local machine:
“Google App Engine SDK for Python” (http://code.google.com/appengine/downloads.html)  and 
the python interpreter from http://www.python.org/download/.
2- In our application’s web.xml deployment descriptor file we will add the following servlet com.google.apphosting.utils.remorteapi.RemorteApiServlet in order to interact with our web application using python commands.
------------------------------------------------------------
<servlet>
      <servlet-name>remoteapi</servlet-name>
      <servlet-class>com.google.apphosting.utils.remoteapi.RemoteApiServlet</servlet-class>
</servlet>
<servlet-mapping>
      <servlet-name>remoteapi</servlet-name>
      <url-pattern>/remote_api</url-pattern>
</servlet-mapping>
<security-constraint>
      <web-resource-collection>
            <web-resource-name>remoteapi</web-resource-name>
            <url-pattern>/remote_api</url-pattern>
       </web-resource-collection>
       <auth-constraint>
              <role-name>admin</role-name>
       </auth-constraint>
</security-constraint>
------------------------------------------------------------
3- Deploy your web application on the App Engine.
So for so good, the first part of the work is done!!!!
Next we will see two kind of import - exports:
 A- Raw data import - export
We can make use of the python commands to do some import - export tasks:
Note: In the commands below you can ommit the –kind=<…> argument. In that case all our entities will be backup.
Dump:  (be sur that the our_dump.txt doesn’t exist)
bulkloader.py --dump --app_id=<our_app_id> --kind=<our_entity> --url=http://<our_app_name>.appspot.com/remote_api --filename=<our_dump.txt>
Restore:
bulkloader.py --restore --app_id=<our_app_id> --kind=<our_ entity> --filename=<our_dump.txt> --url=http://<our_app_name>.appspot.com/remote_api 
When running each of those commands, you will be prompted for authentication. Just put your Google email account and you password.
 B- Formatted data import – export
 We'll use the bulkloader.yaml configuration file to describe how your data should be transformed when uploaded or downloaded. But where is this file??? Well, we are going to create it with this command:
appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url http://<our_app_id>.appspot.com/remote_api
 Then let’s customize it.
Go to the transformers section and do your own customization: This configuration below will probably be not suitable for you. Use it just like a sample.
------------------------------------------------------------
transformers:
- kind: Contact
  connector: CSV
  property_map:
    - property: __key__
      external_name: email
      export_transform: transform.key_id_or_name_as_string
    - property: name
      external_name: name
    - property: surname
      external_name: prenom
    - property: numTelF
      external_name: numTelF
    - property: numTelM
      external_name: numTelM
    - property: Fax
      external_name: Fax
    - property: adresse
      external_name: adresse
------------------------------------------------------------
This file has 2 main parts:
The connector configuration: lets you choose the type of the backup file. Available connectors are csv, xml or simpletext. The last connector can only be used for export not import (keep that in mind).
The property mapping: this is where you define the properties you want to export, the mappings between the entity properties and the exported names and finally some import – export transformation functions that will occur during the process.
The kind keyword means our persisted entity class: Contact in our case.
Run the following commands:
Note: the –kind=<…> is mandatory this time.
Dump:
appcfg.py download_data --config_file=bulkloader.yaml --filename=<filename> --kind=<our_ entity> --url http://<our_app_id>.appspot.com/remote_api 
Restore:
appcfg.py upload_data --config_file=bulkloader.yaml --filename=<filename> --kind=<our_ entity> --url http://<our_app_id>.appspot.com/remote_api 
And that's it.
For any further information have a quick look at http://code.google.com/intl/fr-FR/appengine/docs/python/tools/uploadingdata.html
 

dimanche 23 mai 2010

Récit de la quête du Saint Graal : Android 2.2 Froyo

android-robot-io.pngUn des rédacteurs de Techcrunch a eu la bonne surprise de voir en se levant hier de bon matin que son Nexus One lui proposait une mise à jour OTA (over the air) qui n'était ni plus ni moins que Froyo, la version 2.2 tant attendu par tous les possesseurs de smartphone Android depuis sa présentation au Google IO de jeudi/vendredi dernier.

La quête du Saint Graal

A la lecture de l'article, beaucoup ont été déçus de voir que leur Nexus One ne leur proposait rien de nouveau. Il fallait s'y attendre, comme pour les précédentes mises à jour OTA, la mise à jour est progressive et peut s'étaler sur plus d'une semaine. Sur Twitter, on voit fleurir les tweets de gens qui découvrent avec plaisir cette bonne surprise de la journée, mais il s'agit essentiellement de personnes dans le milieu de la presse et des googlers aussi bien en europe que dans le reste du monde.

Tout de suite, un topic sur le forum xda-developers s'est enflammé. C'est le repère des passionnés de bidouille de smartphone, de "cookers de ROM" (personnes qui créent leurs propres versions de systèmes à partir des sources et de morceaux récupérés à droit à gauche) et de leakers (personnes qui mettent à disposition des versions qui ne sont pas publiques). Pas loin de 100 pages d'investigations ont été nécessaires, la technique était surtout de contacter les chanceux sur twitter et leur demander des informations techniques permettant de récupérer le fichier. En effet, lorsqu'une mise à jour est détectée, le téléphone va récupérer via HTTP sur le site android.clients.google.com la mise à jour sous la forme d'un fichier zip et sauvegardé temporairement dans le répertoire /cache du téléphone. Le nom du fichier est indiqué dans les logs du téléphone. Une fois celui ci connu (signed-passion-FRF50-from-ERE27.1e519a24.zip) il ne restait plus qu'à trouver le chemin exacte et le précieux objet était enfin notre. C'est gTree qui a complété l'énigme sur XDA : http://android.clients.google.com/p...

froyo.jpg

Mise à jour manuelle

La procédure pour mettre à jour manuellement son téléphone est connue, voir par exemple ici. C'est un peu compliqué mais pas insurmontable.

Et maintenant ?

Vous pouvez vous amuser avec les nouveautés de cette version :

  • Installer Flash 10.1 beta depuis le market et voir comment il s'en sort sur différents sites
  • Activer les mises à jour automatique sur les applications déjà installées en allant cocher dans l'application Market, onglet "téléchargement", l'option.
  • Essayer le push server => téléphone avec l'application ChromeToPhone téléchargeable ici (lancer l'apk sur votre téléphone, puis le crx dans chrome). Une fois installé, vous pourrez "transférer" une page ouverte dans chrome sur votre téléphone en un clic.
  • Tester les gains de performances javascript du navigateur web avec le test Sunspider. Des résultats du nexus, de l'ipad, de l'iphone et d'ordinateurs ont été compilés dans un tableau à l'initiative de david gageot. Si vous avez des sites qui utilisent de façon intensive le javascript (des applications en GWT par exemple), vous verrez un gain non négligeable !
  • Essayer vos applications android favorites et constater le gain de rapidité
  • Tester le partage de connexion (tether) en créant un mini hotspot wifi avec votre téléphone (paramètres du téléphone, catégorie réseau).

Bonne dégustation de yaourt glacé (froyo) !

Alexandre

mardi 18 mai 2010

Créer sa première extension Chrome

Lors du Bof d'avril 2010, nos équipes ont pu voir de leur propres yeux la rapidité avec laquelle il est possible de créer, installer, débugguer une extension à destination du navigateur Chrome.
En effet, à l'instar de Firefox, le navigateur de Google possède des api simples d'accès pour réaliser des extensions.

Nous allons voir tout au long de ce post comment faire pour créer une extension Chrome en partant de presque rien. 

Avant de plonger dans la partie technique il est nécessaire de bien définir ce que représente une extension pour Chrome. Une extension est vue dans son intégralité comme un onglet de navigation ce qui implique qu'il possède son propre processus système, les extensions ne font en définitive qu'exécuter du code Web (Javascript, Html et CSS) en proposant quelques API supplémentaires permettant des manipulations spécifiques au navigateur (comme la possibilité d'ajouter une vignette à une icône d'extension).

Intéressons-nous maintenant à notre objectif du jour. Le but de notre première extension sera de permettre de visualiser le statut des builds d'un serveur Hudson, serveur qui propose nativement des API Json et XML permettant de consulter son état. Par manque d'imagination et par soucis de rapidité nous donnerons à cette extension le nom barbare de Chrudson.

Une extension Chrome se présente sous la forme d'une archive (signée ou non) qui doit inclure un descripteur d'extension au format json. Ce fichier se nomme dans le jargon "chromien" le Manifest.
Voici à quoi pourrait ressembler notre premier manifest.json

{
  "name": "Chrudson",
  "version": "1.0",
  "description": "Gestion d'un serveur hudson depuis chrome",
  "permissions": ["http://*/*","https://*/*"]
}
Comme on le voit rapidement, il est possible de nommer, versionner, et décrire succintement son extension. Bien que notre extension n'ait aucun lien direct avec Maven, nous l'autorisons à faire des requêtes sur l'internet tout entier grâce à la ligne :

  "permissions": ["http://*/*","https://*/*"]

Une fois ce manifest écrit il est d'ores et déjà possible de l'installer sur un navigateur Chrome en utilisant pour cela le navigateur lui-même en passant par le panneau des extensions et en ouvrant le mode développeur. L'extension peut être chargée soit empaquetée (directement en la glissant dans le navigateur), soit directement depuis un dossier local (ce que nous utilisons en développement).

Outre le fichier manisfest, une extension chrome peut aussi se composer d'autres modules "actifs" comme une tâche de fond ou background_page (service venant alimenter les données locales ou mettre à jour l'état de l'extension), d'une page d'options ou options_page (page permettant de configurer l'extension) et enfin soit d'une action navigateur ou popup, soit d'une action de page ou page_action (icone cliquable ajoutée à la barre d'adresse, ex : icône rss).

Options_page


Cette partie de l'extension est disponible lorque l'utilisateur clique sur "options" dans le menu déroulant disponible sur l'icône d'extension.
Pour Chrudson, cette page permet de renseigner l'URL du serveur qui sera surveillée par l'extension. Une page d'options simplifiée de Chrudson ressemble à ceci :

<html>
    <head><title>Chrudson Options</title>
    <script type="text/javascript">

    // Saves options to localStorage.
    function save_options() {
      var url = document.getElementById("url");
      localStorage["hudson_url"] = url.value;
      // Update status to let user know options were saved.
      var status = document.getElementById("status");
      status.innerHTML = "Options Saved.";
      setTimeout(function() { status.innerHTML = "";}, 750);
    }

    //Restores select box state to saved value from localStorage.
    function restore_options() {
      var url = localStorage["hudson_url"];
      document.getElementById("url").value = url;
    }
    </script>
</head>
<body onload="restore_options()">
    Url :<input type="text" id="url">
    <button onclick="save_options()">Save</button>
    <span id="status"></span>
    </body>
</html>

On peut remarquer qu'il est possible de stoquer localement des données via la table localStorage, cette table étant accessible par toutes les parties javascript de l'extension. Tout comme une page web, l'évènement onload de la balise <body> est levé chaque fois que l'utilisateur affiche la page des options.

Pour définir cette page comme la page d'options il suffit d'ajouter la description suivante au manifest.json précédent : 

"options_page":"options.html"

Background_page


Ce module de l'extension va permettre à Chrudson de scruter à intervalles régulier l'état du serveur Hudson précédemment configuré dans la page d'options. Pour des raisons de synthèse, le code n'est pas au complet dans ce post. Quelques morceaux de cette page sont cependant intéressant

var pollInterval = DEFAULT_POLL_INTERVAL;
function onLoad() {
    chrome.browserAction.setTitle({title :"Hudson " + getHudsonUrl()});
    if(localStorage["poll_frequency"]){
        pollInterval = localStorage["poll_frequency"];
    }
    startRequest();
}

Cette fonction, exécutée au chargement de l'extension met à jour le tooltip disponible sur l'icône d'extension. Le localStorage est une fois de plus utilisé pour récupérer la fréquence de rafraîchissment des pages (fréquence que l'utilisateur pourra changer dans une version plus évoluée de notre page d'options). Dans notre exemple, cette valeur n'est jamais renseignée, la valeur par défaut est donc utilisée.

La tâche de fond peut aussi utiliser les APIs plus spécifiques aux extensions Chrome:

function setStatus(text, color) {
    chrome.browserAction.setBadgeText({text :text});
    chrome.browserAction.setBadgeBackgroundColor({color :color});
}

La fonction setStatus permet de changer l'état de l'icône de l'extension en lui affectant un badge de couleur à la manière de ce qui peut se trouver sur les iPhones (limité à quelques caractères).

Une fois la page html/javascript crée, il suffit de rajouter la ligne suivante au manifest.json pour s'assurer de le déclencher à chaque lancement du navigateur :

"background_page":"background.html"

Browser_action


L'icône d'extension à laquelle fait référence la background_page est définit par ce que l'on appelle une Browser_action. Cette page permettra lors d'un clic utilisateur sur l'icône de l'extension d'afficher une fenêtre qui contient en fait la page html définie comme popup pour la browser_action.

Pour cela il suffit d'ajouter la description de la browser_action au désormais bien connu manifest.json

"browser_action": { 
   "default_icon": "butler.png",
   "popup": "popup.html"
}

Dans notre cas, le fichier popup.html simplifé ressemble au code suivant :

<html>
<head>
<title>Chrudson Popup</title>
<script type="text/javascript">
    ...
    function onLoad() {
        url = localStorage["hudson_url"];
        titleDiv = document.getElementById("title");
        titleDiv.innerText = "Status hudson ("+url+")";
        statusDiv = document.getElementById("status");
        statusDiv.innerText = "loading";
        refreshStatus();
    }

    function refreshStatus(){
        var xmlUrl = url+"api/json";
        updateReq = new XMLHttpRequest();
        updateReq.open("GET",xmlUrl,true);
        updateReq.onload = parseResult;
        updateReq.send(null);
    }
    function parseResult(){...}
    ...

    function onClick(url){
        return function(){open_tab(url)};
    }

    function open_tab(url){
        chrome.tabs.create({"url": url});
    }
</script>
</head>
<body onload="onLoad();" class="status">
    <div id="title" class="title"/>
    <span id="status"/>
</body>
</html>

Il se contente d'afficher l'état des jobs listés sur le serveur dans des éléments HTML simples. Ces éléments peuvent être enrichis de styles CSS 3. On peut signaler dans ce code la possibilité d'ouvrir de nouveaux onglets Chrome lors d'un clic souris sur le nom d'un job par exemple. Il est cependant nécessaire de compléter les autorisations données à l'extension dans le fichier manifest comme suit :

"permissions": ["http://*/*","https://*/*","tabs"]

C'est bien beau tout ça ...


Tout ce qui nous avons vu jusqu'à présent montre à quel point il est simple de coder, installer et utiliser rapidement une extension. Cependant, que se passe-t-il lorsque l'un des traitements javascripts foire lamentablement, ou que certains styles CSS présentent finalement des problèmes d'alignement ? 

L'une des forces de Chrome sur ce point réside dans la possibilité d'inspecter dynamiquement chacune des parties de l'extension (background, options et popup) directement dans le navigateur. 
En effet, un lien d'inspection du background est disponible dans le menu des extensions, la page d'options est quant à elle inspectable comme n'importe qu'elle autre page Web, et la popup peut être inspectée en effectuant un clic-droit->inspecter sur l'icône de l'extension comme le montre la capture d'écran suivante (réalisée sous chrome 6.0.401.1) 



Le wrapping GWT


L'une des extensions les plus réussie de Chrome, livrée avec GWT 2.0, s'appelle Speed Tracer. Cette extension a été codée en grande partie avec le Framework GWT. Pour cela, les développeurs ont réalisé une implémentation partielle des API d'extension chrome pour GWT. Si vous êtes un fervent admirateur de GWT ou simplement un petit curieux, je vous invite à explorer le code par vous même pour vous faire une idée de la puissance de l'engin (l'implémentation des api d'extension se trouve dans le package com.google.gwt.chrome.crx.*). 
Cette variation d'utilisation du Google Web Toolkit sera d'ailleurs abordée au Google I/O cette semaine http://code.google.com/events/io/2010/sessions/gwt-linkers-webworkers-extensions.html

Vous savez maintenant tout ce qu'il faut savoir pour coder votre première extension chrome, vous savez aussi qu'il sera bientôt possible de coder des extensions avec GWT de manière encore plus intuitive pour les Java-istes qui lisent ce post.

Ressources 

SpeedTracer  http://code.google.com/p/speedtracer/
Guide & APIs  http://code.google.com/chrome/extensions/devguide.html
Projet Git d'où nos exemples sont librement inspirés http://github.com/sanitz/hudson-chrome-extension

lundi 10 mai 2010

En attendant Google I/O...

googleio_mark.jpg Nous sommes à 9 jours de la grande messe annuelle de Google : "Google I/O".
Pendant 2 jours, 3000 développeurs se retrouvent au Moscone Center à San Fransico pour suivre à un rythme effréné des conférences sur toutes les technologies Google.
Chez SFEIR nous travaillons beaucoup avec ces technologies, en particulier GWT, App Engine et Android, nous sommes donc particulièrement attentifs à ce qui va sortir de cet évènement.
C'est bien souvent l'occasion aussi pour google de faire une annonce fracassante. Pour rappel la session 2009 a levé le voile sur Google Wave qui a fait sensation par son coté avant-gardiste et innovateur.
Alors à quoi peut-on s'attendre cette année ?

Android


android-robot-io.png Tim Bray l'a dit sur le blog android : "I don’t think that I’m telling any secrets when I say that there will be Android-related announcements at that event"
Le petit monde d'Android évolue à toute vitesse : nouvelles versions, nouveaux téléphones, parts de marché à croissance exponentiel.
Des signes nous ont montré l'approche de Froyo, la version 2.2 d'Android qui pourrait être dévoilée lors de l'évenement. On connait déjà quelques nouveautés :

  • Gain de performance important via un compilateur Just In Time pour la machine virtuelle Dalvik
  • Un nouveau market avec mise à jour automatique des applications
  • Console améliorée pour les developpeurs avec les erreurs clientes consultables
  • Support de la radio FM pour les appareils le supportant
  • Support Flash 10.1
  • Des évolutions pour le développement de jeux (OpenGL ES ou autres), terrain sur lequel Google essaye de faire progresser Android qui fait encore pâle figure face à l'iphone.


On parle aussi de nouveaux types d'appareils : le robot s'inviterai sur des tablettes ainsi que sur les télévisions.


App Engine


google-app-engine.png Une roadmap des évolutions de app engine a été publiée il y a quelques temps. La nouveauté la plus attendue est l'arrivée des technologies push (Comet, Websockets, ...), technologie qui va assurément changer notre façon de consommer le web avec des usages plus "temps réels".



Maps & Geo


maps.gif Nous avons récemment eu droit à l'api V3 pour Maps qui va donc être un sujet de certaines sessions.
Concernant les produits "geo" chez google, on parle d'évolutions de Google Latitude pour suivre notamment la mode du "check-in" à la Foursquare.
Buzz qui a un succès mitigé pourrai aussi faire l'objet d'ajustement dans ce sens. La géolocalisation devenant omniprésente dans notre quotidien avec les smartphones, c'est le terrain le plus actif en terme de recherche de nouveaux usages dans les startups et google va aussi continuer à innover dans le domaine.

Chrome


logo-google-chrome-navigateur-web.jpg La version 5 est en cours de développement et apportera sont lot de nouveautés : plus de synchronisation des données avec le cloud, plus de performances, une barre d'adresse revue avec la disparition du "http://", flash player intégré...
Google continue de miser sur son navigateur en le faisant évoluer et en investissant massivement dans la publicité. Le travail semble porter ces fruits car sa part de marché ne cesse d'augmenter et a dépassé celle de safari.
Chrome OS attendu pour la fin de l'année sera peut être le sujet d'annonce, le système d'exploitation pour netbook qui boot en 5 secondes et réduit à l'essentiel : un navigateur chrome. Cela sera peut être un élément clé de la stratégie google dans le futur.
Chrome et Chrome OS intègrent déjà la technologie NaCL (native client) qui permet d'exécuter du code à 99% de la vitesse du code natif dans un environnement protégé mais elle est désactivée par défaut. A la vue du nombre de commiters google sur le projet googlecode et l'activité des commits sur le projet, on peut être certain que cela sera un élément important dans le futur de google, qui pourra faire entrer le domaine du jeu vidéo et des applications gourmandes en calculs couteux dans le navigateur et le cloud. Activation par défaut dans chrome annoncé à google i/o et premier produit annoncé ?


Entreprise


google_apps-300x284.jpg La plus grande attente des entreprises utilisant les google apps est d'avoir accès à plus de produits google en mode "for your domain" comme reader, voice ou google code.
On sait déjà que plusieurs produits vont faire leur apparition cet été : annoncé ici mais peut être des choses inédites vont être annoncées.


Suivez la conférence en live


google io Rares sont les français qui ont la chance d'aller à Google I/O, mais tout n'est pas perdu ! Cette année nous allons pouvoir suivre en direct la conférence via ce channel youtube : http://www.youtube.com/GoogleDevelopers.
Voici le programme : http://code.google.com/intl/fr-FR/events/io/2010/session-schedule.html
Tous les sujets n'ont pas été abordé dans ce billet, il y a encore le langage Go, wave, GWT, ... C'est peine perdu, malgré toutes les rumeurs, google a toujours réussi à créer la suprise, alors rendez vous la semaine prochaine !

Alexandre
@alexandre_t

samedi 8 mai 2010

Applications métiers riches avec Silverlight 4 et Visual Studio 2010

Avec Silverlight 4, vient le temps des applications riches d’entreprise. Le développeur a tout pour développer des applications fiables, évolutives, sécurisées et réactives. Identiques en tous points à des applications desktop ou web classiques, elles sont surtout beaucoup plus ergonomiques.

Métier et riche en même temps

Avec les performances d’internet aujourd’hui, plus rien ne justifie d’avoir des applications complètement portées par le client, base de données comprise. C’est encore plus vrai quand la collaboration est un critère important. On veut pouvoir profiter du potentiel et de la puissance des data-centers du cloud.

Il peut pourtant être intéressant de pouvoir continuer de travailler en mode déconnecté. Quoi de plus frustrant en effet que de perdre le fruit de son travail lorsque le train passe sous un tunnel. C’est une vision partagée depuis un moment par Google (Gears), Adobe (Air) et Microsoft : avoir les avantages d’internet sans les inconvénients.

Les RIA intéressaient jusqu’ici surtout les sites de vente ou de médias en ligne. La consolidation de Silverlight (sécurité, performance, composants, interaction) offre de nouvelles perspectives.

Mais en quoi Silverlight peut-il rejoindre les pré-requis spécifiques d’une application métier et au fond, qu’est-ce qui fait une bonne application métier ?

image

L’application CRM en SaaS de CAS® (www.cas.de)

Productivité

Le premier aspect d’une application métier est la productivité. Elle doit répondre exactement au besoin de l’utilisateur (sans fioritures mais aussi sans lacunes). Elle doit aussi être facile à maintenir et à faire évoluer. Exit donc les technologies de pointe, qu’un développeur sur dix seulement est capable de comprendre. Et la disponibilité devient primordiale elle aussi.

Avec la découverte de composants au runtime, l’IoC (Inversion de Contrôle) et l’injection de dépendance avec MEF (Managed Extensibility Framework), le modèle MVVM (idéal pour Silverlight), les patterns les plus reconnus sont adoptés pour le bonheur de la maintenabilité et de la réutilisabilité de vos applications. Avec le développement unifié pour toutes les plateformes (Common Runtime .Net), le partage des fichiers entre développeur et designer, le partage des services sur le cloud, la productivité du développement n’a jamais été aussi forte. Avec le mode déconnecté, la présence sur le pc ou le smartphone, le mode out-of-browser (OOB), la productivité de l’utilisateur est maximale.

Interaction

L’interaction est elle aussi un critère essentiel. Une application en plug-in, complètement isolée, c’est bien mais ça limite le service rendu. Dans Silverlight 4, l’interaction avec l’utilisateur et ses applicatifs est plus grande.

Il y a d’abord l’interaction avec l’utilisateur :

  • Le support du texte riche (RichTextArea).

  • L’API de Notification pour les alertes.

  • Le support complet du clavier en mode plein écran.

  • La gestion de la souris (molette, click droit).

  • Le presse-papier, enfin géré.

  • La géo-localisation qui permet de lier l’action à la situation de l’utilisateur.

  • La Webcam et le microphone supportés (indispensable pour les meetings).

  • Les nouveaux événements pour les transitions sur ItemsControl (BeforeLoaded, Loaded, Unloaded).

Il y a ensuite l’interaction avec le reste du système :

  • Le stockage avec l’accès aux répertoires du compte utilisateur où se trouvent les documents.

  • Le partage grâce à l’interaction avec les logiciels qui exposent une API COM sous Windows.

  • L’import avec le support du glisser-coller depuis une source extérieure, par exemple depuis l’explorateur, très pratique pour l’upload de fichier, l’ajout de pièces jointes.

  • La gestion de l’impression, complète et offrant un contrôle intégral des éléments à imprimer.

  • La confiance avec la sandbox et l’isolated storage.

  • Le mode Trusted pour aller plus loin dans l’interaction.

Il y a enfin l’interaction avec le reste du monde, mais en toute sécurité :

  • Les WCF RIA Services qui font la glue avec le tiers métier.

  • La validation des entrées.

  • La cryptographie et le support du SSL.

  • La prévention des risques de Cross Site Scripting (XSS).

  • Les fichiers de politique cross-domain pour l’extension des ressources.

  • Le temps réel (WCF RIA Services) qui apporte un vrai confort et une réactivité maximale.

Workflows

Dans les applications métier, les processus sont indispensables et souvent complexes. Une étape de workflow peut intervenir à tout moment pour l’utilisateur, nécessitant son intervention. Si son application métier n’est pas lancée, il peut être prévenu par mail, par exemple mais cela ne palie pas tout : finalement, on n’a pas les yeux rivés sur sa messagerie en permanence. Quoi de mieux alors, que d’avoir un statut affiché en bas de l’écran, comme pour l’arrivée de mail dans Outlook. L’utilisateur n’a plus qu’à cliquer sur le statut pour lancer l’application et valider sa phase de workflow.

Et sur mobile ?

Pouvoir travailler sur la même application depuis son poste fixe au bureau, continuer sur le smartphone dans le train, et revenir dessus sur son portable chez soi ou dans la chambre d’hôtel, voilà la vraie mobilité. Silverlight 4 est opérationnel sur windows mobile et avec le multitouch, on palie aisément l’absence de souris. Votre application vous suit partout, vous n’êtes plus jamais pris de court. C’est vraisemblablement l’avenir des applications métier.

Horizons

La technologie Silverlight se rapproche plus que jamais des technologies desktop classiques en termes de productivité (utilisateur et développeur), comme en termes de sécurité ou de fonctionnalités. On peut donc enfin réinventer toutes ces applications métiers que nous pratiquons au jour le jour, en beaucoup plus ergonomiques et pratiques. Les utilisateurs ne seront pas trop durs à convaincre et la maturité certaine de cette dernière version devrait rassurer les responsables informatiques. On peut s’attendre à une déferlante d’applications métier sous Silverlight dans les années qui viennent, notamment sur Codeplex ou le Showcase Silverlight (http://www.silverlight.net/showcase/).

jeudi 6 mai 2010

Slides HTML5 en GWT

Si vous travaillez dans le monde de l'informatique ou du web, vous êtes sûrement au courant du buzz qui monte autour de HTML5 : "le remplacement de Flash" proclament les uns, "la mort du client lourd" annoncent les autres, pendant que vous, développeur web, vous vous demandez ce que ça va bien pouvoir vous apporter, et surtout, comment vous allez pouvoir en profiter car, après tout, "la preuve est dans le pudding" comme diraient nos amis anglophones (il faut goûter pour juger, pour les francophones endurcis), et pour goûter aux joies du HTML5, il faut coder un peu avec ses nouvelles fonctionnalités pour se rendre compte de sa puissance.

Sans doute, la meilleure présentation disponible de cette nouvelle mouture de HTML est celle de Marcin Wichary et Ernest Delgado, deux employés de Google : elle passe en revue la plupart (voire toutes) les nouvelles fonctionnalités avec des explications claires et concises, mais elle ne s'arrête pas là, car il y a des exemples de code et des démonstrations interactives, pour que vous puissiez vous rendre compte du résultat, et le code est mis à disposition sous la licence Apache 2.0 et est constamment amélioré.

Après avoir joué avec cette présentation, nous nous sommes posés la question suivante : comment un développeur GWT peut-il profiter de ces nouvelles fonctionnalités ? (Chez Sfeir nous faisons du GWT depuis 3 ans maintenant, et nous avons plusieurs missions en cours basées sur cette technologie) Et nous nous sommes lancé un défi : reproduire la présentation en GWT 2. Vous pouvez trouver la version la plus récente à l'url suivante :
http://gwthtml5.appspot.com
et pour accéder à la version en français, il suffit d'ajouter le paramètre locale=fr à l'url, ce qui donne:
http://gwthtml5.appspot.com?locale=fr

Le code est disponible aussi sous la licence Apache 2.0 sur le repository Google Code de Sfeir. Cette présentation n'est pas encore complétement finie et évoluera en fonction des améliorations de la version originale de Marcin Wichary et Ernest Delgado.

lundi 3 mai 2010

AndroidCampParis 1

Ce samedi 17 avril a eu lieu le 1er Android Camp Paris organisé par Sylvain Maucourt de Deveryware.

Il y avait certes eu un Android-"Dev"-CampParis1 mais cette fois-ci, le barcamp se voulait plus général.
Nous étions 3 à de Sfeir à participer à cet événement.

Le barcamp a commencé de manière détendue autour de pizzas offertes par Deveryware. Cela a été l'occasion de faire connaissance avant de rentrer dans le vif du sujet. Parmis la trentaine d'affamés, il y avait entre autre Jean Luc de jbmm, Pierre-Yves ou encore les fondateurs du site Standroid... et bien d'autres personnes encore. Chacun a pu sortir son appareil, le comparer, donner ses impressions...
Jean Luc, testeur pour Archos, nous a montré un nouveau firmware "3D" pour archos. Un jeu de course de vaisseaux type Star Wars I a servi de démonstration. Le contrôle se faisant par l'accéléromètre : incliner à droite ou à gauche pour tourner. Le jeu n'est pas évident à prendre en main, il faut certainement de l'habitude. Quant aux performances graphiques, elles étaient tout à fait honorables. Nous avons vu aussi voir un htc desire, petit frère que Nexus One qui ne diffère que la Sense, la surcouche de HTC.

Une fois le ventre bien rempli, nous avons commencé le barcamp proprement dit de façon traditionnelle : présentations à tour de rôle puis établissement du programme pour l'après midi. Il y avait des profils très différents : le bloggeur, le développeur qui fait de l'android quotidiennement, le développeur amateur ou même le néophite qui vient voir si android serait un bon investissement technique pour sa société.
Certains sujets se dégagent par rapport à d'autres comme le market (certaines personnes présentes étudient l'idée de lancer un market alternatif dénommé Appoke) et html5. Les sujets ont été séparés en 2 catégories correspondant aux 2 salles à notre disposition même : développement et hors-développement. Cela n'a pas empeché certains de faire des aller-retour entre les 2 salles.
En ce qui nous concernent, nous avons assisté au sujet développement.
Voici un aperçu des thèmes abordés :

Performances

Un retour d'expérience de Pierre-Yves conseille Jackson pour la génération de JSon, le gain de performance serait énorme.
Les nouveaux devices comme le Nexus One sont très performant. Quelqu'un nous parle par exemple de son application qui marche très bien sur son Nexus, mais qui très lente sur le HTC Hero d'un ami à lui. Celà peut être un danger, car on ne se rend pas forcément compte des performances si l'on teste sur son Nexus. C'est pourquoi, certains testent sur leur "vieux" Magic.
Le cycle de vie des Activity est sujet à problème pour certaines personnes. En particulier, la rotation de l'écran qui provoque la perte des données. Des solutions sont abordées allant des choix de conception à des astuces permettant de sauver des données (voir les tutoriels disponibles ici).
Le débat sur l'optimisation a été nuancé. Il faut savoir trouver un juste milieu entre recherche de la performance et maintenabilité. L'augmentation des performances des nouveaux processeurs ainsi que l'éventuel JIT de Froyo, permettront de s'autoriser plus de design pattern java classiques.

Industrialisation et outils

Pierre Yves nous parle de Roboguice, qui apporte la possibilité de faire de l'injection de dépendances sur la plateforme android. Son utilisation a un certain surcout, peu génant dans beaucoup de cas. Il permet notamment de s'affranchir de code n'apportant que peu de plus-value comme la récupération des composants déclarés dans les layouts.
Peu de développeurs présents ont exploré le terrain de l'industrialisation, signe qu'il y a encore de quoi faire de ce coté là.

WebApp, HTML, GWT

Nous avons résumé ce qui avait été dit au HTML 5 Meetup sur les "device API". Ces API interessent beaucoup les developpeurs mobiles alors que le premier SDK de l'iphone, pourtant orienté web, était un échec. Etait-ce trop tôt ?
Les apports de GWT dans le développement mobile ont aussi été abordés. On a évoqué "Modding" l'api open-source de SFEIR qui permet de faire du développement GWT pour mobile.

Market

Alexandre nous parle de son api open source : android-market-api qui permet entre autre de rechercher sur l'android market en fonction de critères comme mots clés, commentaire, ... Pour celà, il nous explique comment il a rétro-ingénieurer les échanges faits avec le market. Derrière une compression gzip et un encodage en base64, des chaines de caractères était lisibles. Le reste était basé sur protobuf.
Bien que les échanges soient optimisés, il reste tout à fait possible de les lire.
Nous nous sommes interrogés sur la stratégie de Google au sujet de ce market. Google a fait le sien, celui de référence, d'autres seraient tout à fait possible.

Fragmentation

Le problème de la fragmentation du marché est abordé. D'après les derniers chiffres, les devices en 1.5, 1.6 et 2.0 représentent chacun un tier du marché. Il est donc bien difficile d'ignorer ces anciennes versions qui représentent une part importante.
Nous parlons aussi rapidement de Froyo, la version 2.2 de Android, qui sortirait en mai et de ce qu'elle pourrait apporter.

Palm

Bien que ce ne soit pas de l'android, ceux qui avaient une expérience sur le developpement WebOS ont donner leur retour. Arrivée tardive hors des états unis, stratégie du constructeur mal comprise, difficulté à attirer des développeurs. Certains aspects comme la protection des données personnelles protègent plus l'utilisateur au détriment des possibilités pour le développeur.

Conclusion

C'est vers 18h30 que la journée se termine ....
Je crois que tout le monde est reparti des infos intéressantes, des anectodes ou des astuces de développement.
Bref une journée enrichissante !

Nous remercions encore Sylvain et sa société pour l'organisation de cet événement.



Par Alexandre et Nicolas.

dimanche 2 mai 2010

Spring Batch au Spring User Group

Mercredi dernier s’est tenue la deuxième réunion du Spring User Group France. A cette occasion, Julien JAKUBOWSKI et Olivier BAZOUD nous ont présenté Spring Batch.

Les slides de cette très bonne introduction sont disponibles ici.

Pour ma part, voici ce que je retiens de cette présentation :

Qu’entend t-on lorsque l’on parle de batch ?


On parle ici de “Batch processing”, dont la traduction française est “Traitement par lot”.
Il s’agit d’un enchaînement automatique de commandes ne nécessitant pas l’intervention d’un opérateur. Ces traitements peuvent réaliser des opérations métier sur de gros volumes de données.
Un exemple courant de batch est l’import d’un référentiel de données XML dans une base de données relationnelle.

L’accent a été porté par les intervenants sur le fait qu’il ne faut pas confondre batch avec scheduler. En effet, un scheduler (Cron, Quartz) n’est qu’un outil permettant de lancer un batch.

Les frameworks disponibles pour la réalisation de batchs ?

La réalisation d’applications WEB ou encore la gestion de la persistance en Java sont des tâches couvertes par de nombreux frameworks.
Par contre, lorsque l’on s’attaque à la réalisation d’un batch, on peut parfois se sentir démuni de tout outil, pourtant Spring Batch est là.
Bien entendu, il ne répond pas forcément à tous les cas d’utilisation mais en faire un petit tour d’horizon peut aider à prendre une décision la prochaine fois que la réalisation d’un batch s’impose.

A quoi ressemble un batch classique ?

Les batchs réalisés sans outils spécifiques présentent habituellement un certain nombre de problèmes.
Ils consistent souvent en un bloc monolithique de code, ils sont de ce fait difficilement maintenables.
La réutilisation de code d’un batch à l’autre n’est pas une tâche aisée et l’on est souvent amené à réinventer la roue pour réaliser des fonctionnalités très semblables (lecture d’un fichier XML, écriture dans une base de données, ...).
Il est nécessaire de connaître la volumétrie avant le développement, de manière à découper en lots appropriés les traitements.
Il est difficile de faire évoluer un batch qui était initialement prévu pour traiter un fichier de 10ko pour qu’il traite à l’avenir des fichiers de 100mo.
La gestion des transactions et des rejets est laissée à la charge du développeur.

Quelle est la réponse de Spring Batch ?

Spring Batch répond de manière plutôt efficace à ces différentes problématiques, il propose un cadre de développement et de conception.
Il instaure un vocabulaire commun d’un batch à l’autre.
Il permet de répartir les traitements par lots et cela sur de gros volumes sans que les développements spécifiques ne soient impactés.
Ce framework intègre la gestion des transactions et un processus de commit régulier.
Bien entendu, l’intégration de Spring dans le batch est native. Au-delà de ces différents aspects de base, Spring Batch propose des fonctionnalités “avancées” permettant de répondre à des besoins plus spécifiques parmi lesquels :
  • Le partitionnement
  • Le parallélisme
  • La reprise sur erreur

Comment s’organise un batch Spring Batch ?

Dans la terminologie Spring Batch, un batch est un Job, ce dernier peut être constitué de plusieurs étapes : Step.

Une étape met en oeuvre un ItemReader, un ItemWriter et peut également faire appel à un ItemProcessor.
Ces trois éléments sont des interfaces, voici la vocation de chacune : 

ItemReader : Comme son nom l’indique, cette interface est chargée de lire un item à traiter dans une étape. Il en existe un bon nombre d’implémentations, telles que la lecture de fichier plat, la lecture en base via JDBC, Hibernate, ... 

ItemProcessor : Il peut être utilisé pour réaliser des transformations, validations ou encore filtrages sur les éléments traités dans l’étape. Il transforme un élément et en retourne un autre, c’est le bon endroit pour indiquer des règles métier. 

ItemWriter : Encore une fois, il porte plutôt bien son nom, l’ItemWriter va se charger d’écrire les éléments de sortie. Comme pour l’ItemReader, diverses implémentations sont fournies. 

Le traitement des données dans une Step s’effectue par lots (Chunk) successifs. La gestion d’un lot s’effectue de la manière suivante : n items d’entrée sont lus successivement puis transformés en vue d’être écrits. 

La taille des lots est définie par le commit-interval. Lorsque le nombre d’items lus atteint cette limite, les items sont écrits par l’ItemWritter et la transaction est “commitée”. 


Dans la documentation Spring Batch, le schéma ci-dessus est représenté de la manière suivante en code :


List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
items.add(itemReader.read());
}
itemWriter.write(items);
Pour une Step donnée, il est possible de définir des listeners à l’écoute des différents évènements de celle-ci. Ainsi, combiné à un writer, un listener peut permettre de renseigner un fichier de rejet. 

Il est possible d’éxécuter un batch en ligne de commande et de lui passer ses paramètres en utilisant le CommandLineJobRunner.


Les tests :

Du fait du cadre proposé par Spring Batch, l’écriture de tests unitaires est relativement aisée. Il est ainsi possible de tester unitairement les différents composants de votre réalisation intervenant dans l'exécution du batch (itemReaders, itemProcessors, ...).

De même, il est tout à fait possible d’écrire des tests d’intégration.

Retour d’expérience des intervenants :

Olivier Bazoud nous a présenté son constat vis à vis de l’utilisation de Spring Batch en entreprise.
Il a mis l’accent sur le fait qu’il y avait moins de code à écrire, cet élément couplé au fait que les batch réalisés avec Spring Batch sont fortement testables, les erreurs possibles sont moindres.
Un point important est le fait qu’il est plus facile à deux développeurs de batchs de communiquer grâce au vocabulaire porté par Spring Batch.
La délégation de la gestion des transactions à Spring Batch est un point appréciable.
Sur le plan concret les chiffres suivants ont été évoqués :
  • 15% à 50% de gain sur le temps de développement
  • 15% à 50% de gain sur le temps d'exécution des batchs

Conclusion :

Spring Batch est un outil fiable et qui présente de bon patterns, il présente l’avantage de faciliter la testabilité et la maintenabilité des batchs réalisés ce qui n’est pas toujours une tâche évidente lorsque l’on réalise un batch sans outil spécifique.
De nombreuses fonctionnalités avancées sont intégrées à l’outil et peuvent être mises en place à moindre coût.
Bien que la productivité soit meilleure à termes, il faut toutefois être conscient que le coût initial est important.

Les intervenants ont évoqué la possibilité d’intervenir une prochaine fois sur les notions plus avancées de Spring Batch telles que le partitionning, le parallélisme, le remoting, la reprise sur erreur ou encore Spring Batch Admin

Liens :
La présentation
Le code qui a servi de support à la présentation
Documentation officielle Spring Batch
Le Spring User Group

La prochaine session du Spring User Group est prévue le 10 juin sur les styles d’injections de dépendances de Spring. Cette session sera animée par Chris Beams (ingénieur Spring Source).

lundi 19 avril 2010

Comment obtenir un accès root en exploitant une faille XSS, le cas Apache

Contexte : L'infrastructure technique de la fondation Apache a été victime d'une attaque XSS suivie d'une intrusion dans les systèmes. Les administrateurs ont reporté cet incident en détail et avec transparence. Ils ont fait état des erreurs qu’ils ont commises et ont établi des recommandations afin d'améliorer la sécurisation des infrastructures. Ce billet tente d'expliquer la partie XSS de l'attaque et d'offrir une analyse du point de vue du développeur, il livre enfin des recommandations pour vous aider à renforcer la sécurité de vos applications Web.

Lire la suite...

lundi 12 avril 2010

Google Secure Data Connector : l'intranet de votre entreprise disponible sur AppEngine

Ce post est publié aussi sur mon blog et c'est une wave. Pour savoir comment importer une wave dans une page html en dehors de wave, allez lire ce post d'Olivier Croisier et/ou la documentation de l'API Embed de Wave.
Par contre, les blogs Gandi ne permettant pas d'insérer du javascript dans le corps du billet, je me vois obligé de vous rediriger soit vers mon blog, soit vers la Wave.

lundi 5 avril 2010

GWT token Gestion de l'historique

La Gestion de l'historique et la possibilité d'avoir des pages 'bookmarkable' est un plus de GWT.
Cela est rendu possible grâce à une chaîne de caractères nomée token, placée après un # dans l'url.
Exemple :
    http://www.google.com/moderator/#15/e=8ea&t=8ea.41&f=8ea.3070

Le token représente un état du client, il n'est jamais envoyé au serveur et son changement ne provoque pas de rafraichissement de la page ni appel au serveur.

Pourquoi c'est important ? 

Les utilisateurs internautes ont acquis des reflexes "web" et s'attendent donc à :
- pouvoir faire précédent et suivant
- créer un favori pour revenir au même endroit (ou dans le même état) ultérieurement

Pourquoi c'est (encore plus) important ? 

Parce que google nous prépare une technique d'indexation des pages dynamiques

Google fait ses essais avec le Showcase de GWT.
http://www.google.fr/search?q=gwt+showcase+radio+button

Vous remarquerez le !Cw

En pratique, cela revient à fournir 2 versions de la page, une en html+Javascript pour l'utilisateur , qui veut que ça aille vite, et une html pour le robot d'indexation, qui veut lire du html.
C'est un énorme enjeu pour Google, qui a proposé un outil qui lui a 'masqué' une partie du Web.
Cette lacune est sur le point d'être comblée.

Que propose GWT ?

Les classes de base sont :
History auquel on peut ajouter un ValueChangeHandler<String> pour être prévenu des changements de token.
Hyperlink qui est le widget de base qui permet de déclencher un changement de token sur un clic.

GWT vous permet de construire votre token comme vous le souhaitez et cela reste assez bas niveau : il se contente de fournir un String java, à vous de le découper.
On remarque cependant que beaucoup adoptent les mêmes syntaxes proches des urls en utilisant les séparateurs / ? et &

Pour plus de détails : 

Frameworks
Il existe donc plusieurs frameworks qui tentent de faciliter la gestion de ce token :

Restful-gwt

http://code.google.com/p/restful-gwt/
Ce projet utilise les annotations JAX-RS afin d'extraire et découper le token.
@GET
@Path("hello/{name}")
public void helloWithIntegerParam(@PathParam("name") Integer myName) {
   
Window.alert("Hello "+(myName+1));
}

Exemple

gwt-mvc

 http://code.google.com/p/gwt-mvc/
Ce projet reprend les conventions JSP.
Le token est ainsi découpé: #ACTION?param1=value1&param2=value2
content.clearAndAdd(pocViewNumeric);
Integer modelAParamValue = Integer.valueOf(getUrlParam("modelA"));
updateModel(modelA, modelAParamValue, event);


Exemple

jeudi 1 avril 2010

Microsoft prépare LinqToGoogle et LinqToHadopi

LinqToGoogleprogramming-microsoft-linq-to-google

Le framework .NET 4.5 contiendra quelques ouvertures à l'open source. On notera par exemple l'apparition de GOData pour Google Open Data, la synthèse de Odata et de GData tant attendue (même si on ne sait pas trop par qui). Mais la vrai nouveauté est l'ouverture tous azimut de la technologie Linq, avec notamment LinqToMySql, LinqToITunes, et LinqToGoogle pour attaquer directement les recherches Google depuis la CLR (enfin sauf en Chine).


LinqToHadopi

programming-microsoft-linqtohadopi Devrait aussi apparaitre une version spéciale préparée par Microsoft France : LinqToHadopi. Un module directement relié à Paypal et à Bercy et vous permettant de faire des requêtes sur vos MP3 favoris en toute légalité.

Deux livres sont déjà en préparation en tout cas :

- page 1 de 12