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.
new Blog("jclagache");
A propos de Web, Enterprise Java & .NET Applications et autres sujets ennuyeux ...
jeudi 28 juin 2012
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.
Pour le client :
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 :
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).
<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.
Xavier Warzee nous présente alors les solutions Microsoft face à cette demande :
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.
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.
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.
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,
Libellés :
agile
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 :
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 :
Pour cela, j’ai crée un projet Google : spring-zohoreport<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>
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.
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.
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.
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.
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.
- Selectionner Help -> Install New Software
- Dans la zone de texte Work with taper http://dl.google.com/eclipse/plugin/3.5
- Cliquer sur le bouton Add puis sur OK dans la zone de dialogue.
- 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).
- Une fois l'installation terminée Eclipse doit être redémarré.
Libellés :
eclipse,
GAE,
google app engine
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 :
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.
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
Libellés :
REST
Inscription à :
Articles (Atom)