jeudi 28 juin 2012

Learn Javascript, use Coffeescript and checkout Dart

Le langage Javascript est incontournable dans le développement web côté client et serveur, lui même se confondant maintenant avec le développement d'applications systèmes.
Cependant, ses lacunes sont connues et de nouveaux langages ou "sur-langages" tentent de les résoudre.
Parmi ceux-ci, Coffeescript et Dart. Un post lu sur stackoverflow ce matin, résume bien mon opinion sur l'approche globale à avoir face face à ces langages et à l'envie de zapper la compréhension du "vanilla" javascript :


Learn Javascript, use CoffeeScript, check out Dart.
Learn Javascript
The best way to learn (and debug) Coffeescript
Dart is similar enough to JS but far less common. You will come across more JS than Dart.
To understand why CoffeeScript exists, and how Dart differs.
Use Coffeescript
CoffeeScript is out there in projects already, so there's community and experience.
CoffeeScript might come up at work sooner than Dart (esp. with Rails).
CoffeeScript is nice!
Check out Dart
If you understand Javascript, and use CoffeeScript, and have checked out Dart, you'll be in a good position to judge which hammer is best for the task. Most JS/CS knowledge should be transferrable to Dart, the other way around would be more difficult.




vendredi 20 mai 2011

Client WCF et HTTP Basic Authentification

WCF propose 2 protocoles pour cela : BasicHttpBinding et WSHttpBinding avec des caractéristiques différentes. Parmi celles-ci, la version SOAP des messages échangés doit être de version SOAP 1.1 pour  BasicHttpBinding et SOAP 1.2 pour WSHttpBinding.
En partant du principe, que le web service cible est implémenté en SOAP 1.2, la seule solution devient WSHttpBinding. Sauf que … WSHttpBinding impose soit une sécurité sur le transport (SSL) ou sur le message (certificat X.509). Il n’existe donc aucune solution dans WCF pour utiliser un service web basé sur HTTP Basic Auth sans protection (très mauvaise pratique, je l’accorde …).
La seule solution est donc un CustomBinding surchargeant BasicHttpBinding en lui imposant comme version de message SOAP 1.2.
public class MyBasicHttpBinding : BasicHttpBinding
    {
        public override BindingElementCollection CreateBindingElements()
        {
            Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
            Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
            BindingElementCollection bc = base.CreateBindingElements();
            bc.Remove(bc.Find<textmessageencodingbindingelement>());
            //Transport binding element must be the last
            bc.Insert(0, new TextMessageEncodingBindingElement { MessageVersion = MessageVersion.Soap12 });
            return bc;
        }
    }

Pour le client :
var client = new MyWebserviceClient(new MyBasicHttpBinding(), new EndpointAddress("http://localhost:8090/MyWebservice"));
client.ClientCredentials.UserName.UserName = "my_user";
client.ClientCredentials.UserName.Password = "my_key";
client.doSomething();

mardi 5 avril 2011

Spring comme provider JPA au sein d’un conteneur EE5

Notamment dans JBoss 5, cela pose un problème. En effet, le conteneur va scanner l’ensemble des librairies pour trouver le ou les fichiers de définitions des “persistence units” (META-INF/persistence.xml). Or, lorsque l’on souhaite que ce soit Spring qui gère la création de l’”EntityManagerFactory”, ce fichier de définition peut être très succinct :
<persistence xmlns=&<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0">
 
 <persistence-unit name="myPersistenceUnit">
  <class>model.MyEntityClass</class>  
 </persistence-unit>
  
</persistence>
Cette description ne permettra pas au conteneur EE5 de démarrer cette “persistence unit” en l’absence de source de données.
Par exemple, sous JBoss 5 le serveur indiquera qu’une spécification n’est pas respectée :

Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: myPersistenceUnit

La solution consiste a renommer le fichier persistence.xml de telle sorte qu’il ne soit pas pris en compte par le serveur (exemple : jpa-persistence.xml).
Mais cela ne suffit pas : le conteneur va aussi scanner toutes les classes à la recherche de l’annotation  @PersistenceContext et sera incapable de charger la “persistence-unit” correspondante.
Là, l’attribut metadata-complete de l’élément web-app du fichier de configuration web.xml permet de préciser au conteneur de ne pas prendre en compte les annotations Java EE parce qu'elles sont gérées pas un autre mécanisme (Spring en l’occurrence dans notre cas).
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5" metadata-complete="true">
</web-app>

jeudi 28 octobre 2010

L’ Agile Tour 2010 - Rouen

Grâce au soutient du Normandy JUG, L’Agile Tour 2010 faisait une étape à Rouen ce 27 octobre dans les locaux du cesi à Mont Saint Aignan. C’était pour moi l’occasion de clarifier tous ces termes qui inondent la littérature sur la gestion de projet et l’agilité : “backlog”, “sprint”, “burdown chart”, etc …
Je vais pas mentir, j’ai rater la keynote de 13h30 … et je penses que cela a été préjudiciable pour la suite. En effet, j’ai eu l’impression de rentrer tout de suite dans le vif du sujet sans réel vue globale de haut niveau, sans comparaison avec d’autres modèles de gestion de projet ou plutôt LE modèle de gestion de projet qui a trôné pendant des années : le cycle en V.

L’adoption de l’agilité par les usages – Xavier Warzee

Je me suis trompé de salle … mais c’est trop tard, le speakeur commence. Les logos “Microsoft” et “MSN” sur le rétro projecteur me font penser que je vais avoir droit à une présentation commerciale de Visual Studio Team System. Et bien non, Xavier Warzee présente et explique ce qui fait le succès d’un taskboard : l’interactivité par le touché. Il est scientifiquement prouvé que la collaboration est plus efficace par l’approche tactile (touch). Ainsi, un tableau avec des post-it est un moyen très efficace d’organiser ses backlogs et tasks avec un public qui n’est plus que spectateur mais aussi acteur et appréhende cet exercice comme un jeu. Il faut cependant dématérialiser cette pratique pour d’une part conserver un historique des changements et éviter une double saisie vers le SI.
Xavier Warzee nous présente alors les solutions Microsoft face à cette demande :
  • Urban Turtle : l’outil de Pyxis qui s’interface avec TFS pour le planning board et la gestion de product backlog est aussi disponible sur une tablette à écran tactile sous Windows 7.
  • Team Table et TFS 2010 : Microsoft Surface et TFS collaborent pour fournir un plan interactif tactile de post-it virtuels pour les daily meeting.
Les fabricants planchent sur des versions en 3D, où les utilisateurs manipulent ces métaphores (post-it) dans l’espace. Bon, si je peux comprendre l’intérêt de ces tableaux virtuels pour la collaboration, je doute qu’une infrastructure à la “Minority Report” soit indispensable …

Intégration continue – Dimitri Vaeli

Le programme annonçait “Une approche imagée sur l’éligibilité et la contractualisation Agile par Laurent Morisseau”. Il a certainement été précisé lors de la keynote que Laurent Morisseau n’était pas là et que sa présentation était remplacée … C’est Dimitri Vaeli, d’eXo Platform, qui reprend une version actualisée et étoffée semble t’il d’une précédente présentation sur le sujet lors du Normandy JUG du 16/09/2009. Au menu, une des composantes de l’agilité : l’intégration continue (même si le concept existait bien avant la création de la méthode agile). L’intégration continue consiste à vérifier de manière systématique (au commit et(ou) à intervalle régulier) la non régression du logiciel. Cela passe par une automatisation complète de la phase de build (compilation, tests unitaires, analyse qualité, tests de déploiement, d’intégration, génération de la documentation, packaging et publication). Même si le concept m’est plutôt familier, j’ai pu noter quelques nom d’outils que je ne connaissais pas comme GreenPepper de … Pyxis. Mais là on n’est plus du tout en collaboration avec TFS mais plutôt avec les outils d’Atlassian. Déjà convaincu de la qualité et efficacité des autres outils (JIRA, Confluence, …) de cet éditeur, je ne peux qu’approfondir l’utilisation de GreenPepper. D’ailleurs, il est fort probable que l’ALM d’eXo Platform soit géré par ces outils … L’une des difficultés dans l’intégration continue sont les tests ou plutôt comment distinguer les tests unitaires, des tests d’intégration. Pour moi les frontières entre ces tests sont souvent floues et poreuses. Dimitri Vaeli ne m’a pas éclairé davantage, c’est en effet un exercice difficile aussi d’après lui. Nous sommes tout de même arrivé à la conclusion suivante :
  • dans les test unitaires, on teste une classe unitairement. On “Mock” les objets en relation avec la classe à tester pour se concentrer uniquement sur les algorithmes qui la compose.
  • dans les tests d’intégration, ces relations doivent être implémentées. Ces tests doivent être répartis suivant le degré de qualité que l’on veut vérifier. Ainsi, ces tests d’intégration peuvent à la fois prendre la forme de tests JUnit (ou TestNG) mais aussi de tests Selenium (ou Abbot) pour une couverture encore plus élargie.

Optimiser le retour sur investissement de votre produit avec une bonne priorisation de votre backlog – Céline Stauder

Je suis pour l’instant un peu déçu : même si j’ai apprécié les 2 premières présentations, je n’ai toujours pas clarifier la vision que je me faisait de l’agilité. Je n’ai certainement pas choisis les présentations adéquates pour ce genre de questionnement. Céline Stauder de CLT Services propose une vision orientée service produits de la méthode et dès les premiers slides de sa présentation, je sens que c’est ce point de vue qui va m’éclairer. Tout d’abord quelques définitions :
  • product backlog : ensemble de user stories priorisées
  • product owner : le “maitre” du projet
  • user story (US) : fonctionnalité vue par l’utilisateur. Par exemple, en tant que rôle X dans le produit je veux pouvoir faire ça.
Céline Stauder détaille ensuite les méthodes de priorisation des US. C’est cette priorisation par “backlog en map” qui va donner le roadmap. Les US les plus pertinentes seront en effet dans la première release. La méthode présentée est la priorisation relative de Mike Cohn. L’idée est de prendre une US de référence et de comparer les autres US par rapport à celle-ci. On arrive ensuite à une classification des US dans le backlog :

Conclusion

Suivant ce que j’attendais de cette après-midi, je penses qu’assister à d’autres sessions m’aurait été plus profitable, notamment l’Introduction à Scrum par Guillaume Lours et l’atelier de Planning Poker de Youen Chéné. Cependant, les 3 présentations auxquelles j’ai pu assisté m’ont toutes semblées intéressantes et toutes animées par des personnes passionnées. Ce type d’évènement est fait par des agilistes, pour des agilistes pour tout public même si quelques notions de base sur la méthode sont préférables pour profiter des différents speakeurs. En tout cas, une belle initiative du Normandy Agile Group.

jeudi 10 décembre 2009

Intégration de l’API Zoho Report dans Spring

Zoho Report permet de réaliser facilement en ligne des rapports et graphiques efficaces.
Une API REST est disponible pour soumettre ou récupérer des données dans ou depuis Zoho Report. Ce format n’est pas le plus adapté pour manipuler un nombre important de données organisées au sein d’une base de données. Zoho CloudSQL permet d’effectuer ces manipulations par requête SQL. Un driver JDBC vient compléter le tout pour offrir une véritable connectivité à cette base de donnée “on the cloud”.
Cependant, CloudSQL et donc le driver JDBC ne permettent, pour l’instant, que de la récupération de données (SELECT).
Pour utiliser complètement les possibilités de Zoho Report, le mieux est donc d’utiliser les librairies clientes disponibles (Java, Python et Google App Engine).
Pour Java, pour utiliser la librairie, il faut :
  • télécharger la librairie sur cette page
  • avoir un compte Zoho (LOGINNAME,PASSWORD)
  • demander une clé API (APIKEY)
  • une base de donnée crée (DATABASENAME) avec au mois une table (TABLENAME)
ReportClient rc = new ReportClient(APIKEY);
rc.login(LOGINNAME,PASSWORD);
String uri = getURI(LOGINNAME,DATABASENAME,TABLENAME);
rc.addRow(uri, new HashMap(), null);
Le but ici est d’utiliser Spring pour simplifier la gestion du client et de ses constantes de configuration (APIKEY, LOGINNAME, PASSWORD et DATABASENAME) :
ZohoReportClientWrapper rc = (ZohoReportClientWrapper) ctx.getBean("zohoClient");
rc.login();
rc.addRow("sampleTable", new HashMap());
Avec comme fichier de configuration Spring :

<bean id="zohoConfig" class="ZohoConfig">
<property name="apiKey" value="yourAPIKey"/>
<property name="databaseName" value="yourDBName"/>
<property name="loginName" value="yourZohoLogin"/>
<property name="password" value="yourZohoPasswd"/> 
</bean>

<bean id="zohoClient" class="ZohoReportClientWrapper" init-method="init">
<property name="config" ref="zohoConfig"/> 
</bean>
Pour cela, j’ai crée un projet Google : spring-zohoreport

mercredi 21 octobre 2009

Google App Engine (GAE) : création d'un environnement de développement

Installation et configuration pas à pas d'un environnement de développement java pour Google App Engine.

Installation du SDK Java

Google App Engine supporte Java 5 et Java 6. Cependant, l'application tournera sous Java 6 dans App Engine. Il est donc naturellement préférable que l'environnement de développement soit configuré en Java 6.


Tips : localisation des SDKs sur le disque
Créer un dossier "SDKs" sur votre disque dur. Par exemple, sous Windows, je l'ai créer sous C:\SDKs.
Créer une variable d'environnement pour ce dossier (SDKS_HOME).
C'est dans ce répertoire SDKS_HOME que vous pourrez installer les différentes versions de SDK.
Par exemple sous Windows, pour créer des variables d'environnement il faut soit aller dans Panneau de Configuration -> Système ou clique droit sur le bureau dans Poste De Travail -> Propriétés.
Cliquer alors sur l'onglet Avancé puis sur le bouton Variables d'environnement.
Entrer les variables suivantes dans Variables Systèmes :
SDKS_HOME = C:\SDKs
JAVA_HOME = %SDKS_HOME%\jdk1.6.0_16
Rajouter %JAVA_HOME%\bin à la variable PATH
Tout ceci permet de "switcher" rapidement de version de Java,
simplement en modifiant la variable JAVA_HOME.

Télécharger et installer le Java SE Development Kit (JDK). Pour vérifier l'installation, vérifier le numéro de version retourné par ces lignes de commande.
java -version
javac -version

Installation d'Eclipse et du Plugin Google

Un plugin Google pour Eclipse est disponible. Celui-ci est disponible pour les versions Eclipse 3.3 (Europa), Eclipse 3.4 (Ganymede) and Eclipse 3.5 (Galileo). Le dernière version Eclipse à l'écriture de ce post est la version 3.5 (Galileo).
Télécharger et installer Eclipse 3.5 (Galileo) Il est préférable de choisir le package Eclipse IDE for Java EE Developers pour profiter aussi du plugin Web Tools Platform (WTP).

Lancer Eclipse pour installer le Plugin Google par le Software Update d'Eclipse.
  1. Selectionner Help -> Install New Software
  2. Dans la zone de texte Work with taper http://dl.google.com/eclipse/plugin/3.5
  3. Cliquer sur le bouton Add puis sur OK dans la zone de dialogue.
  4. Cocher les composants "Google Plugin for Eclipse 3.5" et "Google App Engine Java SDK"("Google Web Toolkit SDK" pourra être installer plus tard si nécessaire).
  5. Une fois l'installation terminée Eclipse doit être redémarré.
Voilà, il faut maintenant se lancer en créant son premier projet.

mercredi 27 mai 2009

Traitement asynchrone avec une api REST

Une des critiques faite sur REST est le fait de son attachement au protocole HTTP. Ce protocole est "déconnecté" : il est impossible de reprendre une connexion précédente. Cela pose un problème dans le cadre de longs traitements asynchrones et de notifications.

Une possibilité pour palier à cette faiblesse est de considérer elle aussi cette transaction comme une ressource. Cette ressource est retournée immédiatement au client suite au premier appel. Ensuite, le client pourra récupérer l'état de cette transaction. Par exemple, supposons que nous souhaitons lancer un batch "batch1" de manière asynchrone :

GET /batchs/batch1 HTTP/1.1
Host: xyz.com
Content-Type: application/xml; charset=utf-8


HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Location: /transactions/1234
http://xyz.com/transactions/1234


La réponse est immédiatement renvoyée et contient l'URI de la transaction utilisée. Le client peut consulter cette ressource pour connaitre le status de son traitement en cours.

GET /transactions/1234 HTTP/1.1
Host: xyz.com
Content-Type: application/xml; charset=utf-8


HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Content-Length: nnn

batch1
In Progress