Forum Logiciel : diffusion de connaissance et dâinformations sur toutes les activitĂ©s liĂ©es au dĂ©veloppement dâapplications informatiques en entreprise.
Blogs de Développeurs: Aggrégateur de Blogs d'Informatique sur .NET, Java, PHP, Ruby, Agile, Gestion de Projet
Forum Logiciel : diffusion de connaissance et dâinformations sur toutes les activitĂ©s liĂ©es au dĂ©veloppement dâapplications informatiques en entreprise.
La semaine derniĂšre Oracle a annoncĂ© la sortie de Java EE 7, en nous promettant (je cite) âle support de HTML5, plus de productivitĂ© pour les dĂ©veloppeurs et la rĂ©ponse aux besoins les plus exigeants des entreprisesâ.
Quâen est-il vraiment ?
Etat des lieux de Java EESi Java est aujourdâhui le principal language utilisĂ© en entreprise, Java EE nâa pas eu le mĂȘme succĂšs, la plupart des gens nâen utilisant quâun sous-ensemble (JSP, Servlet, JPA, etc.) et non pas l’ensemble des APIs (EJBs, JMS…).
Les premiĂšres versions de la plateforme, mal conçues, ont Ă©tĂ© rapidement concurrencĂ©es par des frameworks tels que Spring : au bout de quelques annĂ©es de concurrence, J2EE est devenu Java EE et a repris les principes majeurs de Spring tels que lâinjection de dĂ©pendance par annotation ou les intercepteurs (encore quâon pourrait argumenter que les intercepteurs Java EE sont nettement moins puissants que lâAOP fourni par Spring).
Cependant, entre-temps, notre monde a bougĂ© : la productivitĂ© ou la satisfaction des dĂ©veloppeurs nâest plus simplement limitĂ© Ă avoir un framework dâinjection de dĂ©pendance ! Nous voulons pouvoir dĂ©velopper des applications REST, HTML5, dans le cloud, avec la stack ayant le plus de buzzwords possibles. Et jâoubliais la mobilitĂ© et le Big Data, sur des architectures distribuĂ©es
Que ce soit sur Google Trends (tendances des recherches Google) ou Indeed (tendances des offres dâemploi aux US), on retrouve les mĂȘmes courbes :
On voit bien ici que lâintĂ©rĂȘt des dĂ©veloppeurs pour Java EE nâa pas dĂ©collĂ©, par rapport Ă des frameworks concurrents (node.js) ou des technologies NoSQL/Big Data.
Câest donc sur ces thĂšmes que Java EE doit se battre, en particulier contre Spring ou Node.js, qui sont des stacks ayant pris depuis longtemps le chemin des applications HTML5, REST, NoSQL, mobiles, dans le cloud, etc. Et c’est ce que nous allons donc Ă©tudier tout au long de cet article.
Le support de HTML5, 1Ăšre partie : les WebsocketsLe support de HTML5 mâa personnellement plutĂŽt fait sourire : quel rapport entre Java EE et le HTML5 ? Pour Oracle, dans sa âpress releaseâ, cela signifie supporter les Websockets !
Quiconque ayant dĂ©jĂ fait des Websockets se mĂ©fie en voyant ce type dâannonce :
Pour utiliser Atmosphere depuis pas mal de temps, un excellent framework qui résout tous ces problÚmes de maniÚre performante et élégante, je vois mal quiconque utiliser Java EE 7 directement.
La press release dâOracle met donc en avant une avancĂ©e technique nĂ©cessaire et intĂ©ressante, mais dont lâimplĂ©mentation reste simpliste.
Le support de HTML5, 2Ăšme partie : JAX-RS 2 et JSONFaire une application HTML5 avec un framework MVC JavaScript moderne, de type backbone.js ou angular.js, câest surtout consommer des services REST, et sâĂ©changer des donnĂ©es au format JSON.
La mise Ă jour de lâAPI JAX RS est donc particuliĂšrement bienvenue, et permet :
De mĂȘme nous disposons maintenant dâune API JSON standardisĂ©e, avec JSON-P (plus de dĂ©tails sur cet article). Une nouveautĂ© intĂ©ressante est lâajout dâune API fluente permettant de crĂ©er du JSON (personnellement je nâai encore jamais eu ce besoin, mais cela peut toujours ĂȘtre utile).
Toutes ces fonctionnalitĂ©s Ă©tant prĂ©sentes dans les stacks concurrente (par exemple Spring MVC REST + Jackson 2), il sâagit donc lĂ dâune mise Ă jour nĂ©cessaire.
Un regret cependant : cette stack ne propose pas de support pour rĂ©aliser des tests unitaires avec des mocks, comme nous en disposons dans Spring. Câest une fonctionnalitĂ© que jâapprĂ©cie particuliĂšrement, par exemple dans Tatami (voici en exemple), et qui devrait bientĂŽt faire lâobjet dâun nouvel article sur ce blog.
Le support de HTML5, 3Ăšme partie : JSF 2.2De maniĂšre plus discrĂšte, Java EE 7 amĂšne Ă©galement les âpassthrough attributesâ dans JSF 2.2, ce qui permet enfin dâutiliser HTML5 avec JSF 2.2.
JusquâĂ prĂ©sent, on ne pouvait utiliser que les tags reconnus par sa librairie de composants : or, en HTML5, vous pouvez ajouter et dĂ©finir vos propres attributs, que vous utilisez ensuite en JavaScript.
Les âpassthrough attributesâ sont en fait assez basiques : la librairie de composant va simplement rendre ces attributs cĂŽtĂ© client. Elle fait alors juste âpasse platâ entre le code JSF et le HTML gĂ©nĂ©rĂ©. Mais cela change tout, car nous pouvons maintenant avoir nos propres attributs cĂŽtĂ© client !
Pas de cloud dans Java EE 7Lâobjectif de Java EE 7 Ă©tait le cloud : comme prĂ©sentĂ© lâannĂ©e derniĂšre par Oracle (les slides sont encore ici), nous devions pouvoir dĂ©velopper âdans le cloudâ avec Java EE 7, et plus prĂ©cisĂ©ment :
Au final, tout cela a été abandonné.
Pour avoir participĂ© Ă la spĂ©cification JMS 2, je peux vous confirmer que cet abandon a Ă©tĂ© volontaire : aucun vendeur de serveur dâapplication ne souhaite voir ces fonctionnalitĂ©s ĂȘtre intĂ©grĂ©es dans Java EE. Cela fait plus de 10 ans que lâajout de ces fonctionnalitĂ©s âavancĂ©esâ dans Java EE sont sabordĂ©es par une grande partie des acteurs du JCP, car ce sont grĂące Ă elles que les entreprises clientes achĂštent des serveurs en âversion entrepriseâ au lieu de se contenter dâun simple Tomcat.
Câest donc un grand gĂąchi, mais ce nâest que partie remise. Comme en son temps lâarrivĂ©e de Spring a fait bouger le JCP, lâarrivĂ©e du cloud va nĂ©cessairement faire bouger les lignes. A titre dâexemple, les ventes de serveurs dâOracle (les anciens serveurs Sun, que Oracle a rachetĂ©) ont chutĂ© de 27,2% ce trimestre ! Il est donc probable que le JCP, Ă nouveau, soit forcĂ© de sâadapter.
Focus sur JMS 2Lâun des succĂšs de Java EE 7 est lâarrivĂ©e de JMS 2. Plus de 10 ans aprĂšs la norme prĂ©cĂ©dente, et toujours sans support du clustering (cf. le point prĂ©cĂ©dent), JMS 2 propose une API modernisĂ©e, qui vous permettra de vous passer de la fameuse JmsTemplate de Spring.
JMS 2, heureusement, garde quand mĂȘme lâun des grands bĂ©nĂ©fices de JMS 1, qui Ă©tait de pouvoir ĂȘtre utilisĂ© en dehors dâun serveur dâapplication : en effet, les vendeurs de serveurs dâapplications voulaient lier JMS 2 Ă CDI, de maniĂšre Ă obliger les utilisateurs Ă avoir un serveur dâapplication pour envoyer un message. Au final, nous restons donc sur une API proche de lâoriginale, mais modernisĂ©e et simplifiĂ©e.
Cette nouvelle API a été trÚs bien décrite dans ce blog, nous en retiendrons principalement :
LancĂ© par IBM, lâintĂ©gration des batchs dans Java EE est enfin une rĂ©alitĂ© ! Dans la pratique, il sâagit dâune intĂ©gration du code Spring Batch dans Java EE :
Dâautre part, SpringSource a fait le maximum pour que Spring Batch puisse ĂȘtre utilisĂ© dans Java EE (avec CDI), mais sans que lâon soit obligĂ© de dĂ©pendre de ses APIs.
Depuis le nombre dâannĂ©es que lâon attendait une solution pour faire des batchs en Java EE, câest donc une excellente nouvelle, dâautant plus que Spring Batch est une solution trĂšs largement reconnue.
Reste Ă voir quelles implĂ©mentations seront disponibles dans les diffĂ©rents serveurs dâapplications :
Cette nouvelle devrait également permettre de faire revivre Spring Batch, qui est un projet qui ne progressait plus beaucoup ces derniÚres années, en particulier depuis que Accenture en avait abandonné le co-développement avec SpringSource.
En conclusionCette montĂ©e de version de Java EE, tant attendue, nâa pas tenue ses promesses. Lâobjectif âcloudâ a Ă©tĂ© totalement ratĂ©, de mĂȘme quâun certain nombre dâAPI qui devaient ĂȘtre mises Ă jour (JCache en particulier).
Heureusement, un travail minimal a Ă©tĂ© rĂ©alisĂ© sur les HTML5 et sur JMS 2, et nous avons eu la bonne surprise de voir lâintĂ©gration de Spring Batch dans la spĂ©cification. En 2013, nous nâen attendions pas moins !
Plus d’une heure et demi de vidĂ©o sur ElasticSearch, encore un IppEvent d’une grande qualitĂ© technique avec David Pilato, qui nous prĂ©sente le moteur de recherche Open Source le plus avancĂ© du moment.
Je profite de ce billet pour vous annoncer deux nouvelles en relation avec l’Ă©vĂšnement :
Elasticsearch – Le moteur de recherche Ă©lastique pour tous, pour David Pilato from Ippon Technologies on Vimeo.
Au dĂ©but du web nous nâavions que des pages statiques, nous entrions une adresse et le serveur nous retournait une page HTML. Puis nous avons voulu dynamiser un peu nos sites avec du Javascript et de lâAJAX, jusquâĂ avoir des applications complĂštes dans nos navigateurs. Ce que nous appelons maintenant des âSingle-Page-Applicationâ.
Une des problĂ©matiques lors du dĂ©veloppement dâapplication de type âsingle-pageâ est que nous chargeons une page, puis nous modifions le contenu de celle-ci au grĂ© des clicks de lâutilisateur sans modifier visiblement lâURL de la page. Ceci est logique, car nous restons toujours sur la mĂȘme page, mais ne suit pas la philosophie de Web oĂč un contenu est identifiĂ© de maniĂšre unique.
Pour rĂ©soudre ce problĂšme et avoir un identifiant unique pour chaque ressource, il existait jusquâĂ maintenant une solution : Ajouter des hash pour avoir des adresses comme ceci http://monsite/#article/0/spring_c_est_bien
Le hash apporte une solution partielle, car si cette technique permet dâavoir un identifiant unique pour une ressource, celle-ci est connue uniquement du navigateur, mais pas du serveur. Alors oui, nous pouvons mettre lâadresse en favori et lorsque lâutilisateur rechargera cette page, il lâaura bien la page dans le bon Ă©tat, mais il reste des problĂšmes.
Tout dâabord,  lâaffichage de la page nâest pas optimale, car la remise dans le bonne Ă©tat de la page se fait forcĂ©ment cĂŽtĂ© sur le client via Javacript, car le serveur nâayant pas lâintĂ©gralitĂ© du nom de la ressource, il ne peut pas gĂ©nĂ©rer la page dans son Ă©tat final. Pour lâutilisateur ça veut dire attendre que tous les scripts soient chargĂ©s, puis que le javascript s’exĂ©cute. Sur une machine peut puissante ou si vous utilisez 90 % votre CPU pour lire une vidĂ©o avec flash, un temps plus ou moins long est nĂ©cessaire pour que la page sâaffiche et donc lâexpĂ©rience utilisateur est dĂ©gradĂ©e.
Lâautre problĂšme dâavoir le nom de la ressource uniquement sur le client est que si le serveur doit faire une redirection, il la fera uniquement vers le dĂ©but de lâadresse. Par exemple si vous devez vous authentifier, vous serez rediriger vers la page dâaccueil et non vers la page que vous avez appelez initialement.
Mais ça câĂ©tait avant, maintenant avec HTML5, il est possible dâavoir des vrais adresses comme ceci http://monsite/article/0/spring_c_est_bien tout en continuant Ă utiliser de lâAjax. Pour rĂ©aliser ce miracle, nous utilisons la nouvelle fonction pushstate de lâobjet History. Alors quand je dis nous utilisons, câest vrai, le pushstate a Ă©tĂ© mis en place sur la prochaine version de Tatami. Nous ne sommes pas les seuls Twitter utilise cette technique pour accĂ©lĂ©rer son affichage, comme indiquĂ© ici.
CompatibilitéAvec HTML5, nous ne savons jamais quel navigateur supporte quelle fonctionnalité, voici un tableau des navigateurs supportant le pushstate
IE
Firefox
Safari
Chrome
Opéra
iPhone
Android
-
4.0+
5.0+
8.0+
11.50+
4.2.1+
Navigation via du hashNous allons créer les liens de la maniÚres suivantes :
Lorsquâun utilisateur clique sur un lien, le serveur nâest pas appelĂ© puisque nous restons sur la mĂȘme page. Pour modifier le contenu de la page, il ne reste plus quâĂ ajouter un Ă©vĂ©nement sur le changement du hash.
Attention, lâĂ©vĂ©nement nâest pas lancĂ© au chargement de la page, il faut appeler la fonction de modification du contenu au chargement de la page.
Navigation via pushstatePour ce type de navigation, nous utilisons les liens suivants avec des vrais URLs :
Lorsque lâutilisateur clique sur un lien, il est nĂ©cessaire de supprimer le comportement par dĂ©faut du navigateur, sinon le serveur sera appelĂ©. Nous allons ensuite changer lâurl et appeler la fonction modifiant le contenu de la page
Il est nĂ©cessaire dâajouter lâĂ©vĂ©nement suivant pour que le contenu de la page soit modifiĂ© lors de la navigation via les boutons “prĂ©cĂ©dent” et “suivant”
Attention le comportement par dĂ©faut de cet Ă©vĂ©nement est diffĂ©rent entre les navigateurs Webkit et Firefox. Sous Webkit lâĂ©vĂ©nement est appelĂ© lors du chargement de la page, alors quâil ne lâest pas sous Firefox
Pushstate dans les frameworks MVCIl est possible dĂšs maintenant dâavoir le support du pushstate dans certains frameworks MVC. Lâutilisation des ces frameworks permet de dĂ©tecter le support de la fonctionnalitĂ© par le navigateur et dâutiliser la mĂ©thode du hash pour les vieux navigateurs.
BackbonePour lâutiliser, il suffit de lâactiver au moment du lancement de la gestion des routes
Il est également possible de passer en paramÚtre de start, la propriété  silent: true, qui permet de ne pas déclencher la route lors du chargement initial de la page.
AngularJSIl suffit de le dĂ©clarer dans la configuration de lâapplication
Il nây a pas dâĂ©quivalent au silent: true de backbone.js, pour ne pas avoir de dĂ©clenchement dâune route lors du premier chargement, ce qui peut sâavĂ©rer gĂȘnant dans certains cas.
GWTGwt ne supporte pas cette fonctionnalitĂ© pour le moment, mais il existe lâextension https://github.com/jbarop/gwt-pushstate/
Pourquoi le pushstate câest gĂ©nial ?LâintĂ©rĂȘt t’utiliser Ajax sur un site Web ou une application nâest plus Ă dĂ©montrer. Consommation de bande passante rĂ©duite, fluiditĂ©, possibilitĂ©s ergonomiques Ă©tendues. NĂ©anmoins, ils posent certaines problĂ©matiques quâil est possible de rĂ©soudre avec cette nouvelle possibilitĂ©
Site WebSur un site Web la principale problĂ©matique est la complexitĂ© dâindexation des contenus affichĂ©s en Ajax. Pour lâindexation par Google, la mĂ©thode est la suivante :
Avec pushstate, il nâest plus nĂ©cessaire de faire ce type de configuration, mais il est nĂ©cessaire quâun appel direct aux adresses gĂ©nĂ©rĂ©es via pushstate retourne le code HTML complet.
Dans ce cas le mode silent de backbone est intĂ©ressant, le contenu de la page Ă©tant gĂ©nĂ©rĂ© complĂštement par le serveur lors dâun appel direct, il nâa pas Ă ĂȘtre gĂ©nĂ©rĂ© par le client. Ce procĂ©dĂ© est utilisĂ© par Twitter.
Si nous accĂ©dons Ă un âTrending-topicâ directement depuis la barre dâadresse via cette url https://twitter.com/search?q=%23RolandGarros&src=tren, nous obtenons la page HTML complĂšte :
Mais si nous accĂ©dons Ă la page en cliquant depuis le bloc âtendanceâ. Lâurl est la mĂȘme, mais il entraĂźne un appel AJAX avec une rĂ©ponse en JSON :
Application WebDans une application Web, la problĂ©matique lorsque lâon utilise la mĂ©thode des hash est que tout ce qui se trouve aprĂšs le hash nâest pas envoyĂ© au serveur, donc lors dâune redirection cette information nâĂ©tant pas prĂ©sente, celle-ci est faite sur lâadresse jusquâau hash, donc la page dâaccueil de lâapplication.
Le cas fonctionnel oĂč ce comportement est gĂȘnant est lorsque nous mettons lâadresse en favori oĂč lorsque nous lâenvoyons par e-mail. Si pour accĂ©der Ă la page, ne devons passer par processus dâauthentification, nous serons dirigĂ© vers la page dâaccueil de lâapplication plutĂŽt que vers le contenu intĂ©ressant.
Pour une application Web, qui nâa pas vocation Ă ĂȘtre indexĂ©e par les moteurs de recherche,  il nâest pas nĂ©cessaire que le serveur retourne le HTML complet de la page. Il suffit quâil rĂ©ponde Ă toutes les ressources, le client se chargeant de mettre Ă jour le contenu en AJAX.
Nous avons fait ceci sur Tatami, lorsque nous accĂ©dions Ă âTrending topicâ sans ĂȘtre authentifiĂ© :
Avant , nous Ă©tions redirigĂ© vers lâaccueil lorsque nous saisissions lâurl https://tatami.ippon.fr/tatami/#/tags/TatamiV3
Maintenant, nous sommes bien redirigĂ© vers le âTrending topicâ lorsque nous saisissons lâurl https://tatami.ippon.fr/tatami/new/tags/TatamiV3
Vous ĂȘtes intĂ©ressĂ© par AngularJS mais vous n’avez pas pu venir Ă notre dernier IppEvent consacrĂ© au sujet ? Heureusement, Ippon Technologies a filmĂ© l’Ă©vĂ©nement et vous propose les vidĂ©os gratuitement en ligne !
Nous vous proposons donc 3 vidéos :
SĂ©bastien LetĂ©liĂ© nous montre le fonctionnement d’AngularJS via une session de “live coding”ANGULARJS & le futur du dĂ©veloppement web from Ippon Technologies on Vimeo.
Thierry Lau et les filtres sur AngularJSFocus sur les filtres ANGULARJS from Ippon Technologies on Vimeo.
Patrick Aljord sur AngularJS et FirebaseANGULARJS & le futur du développement web from Ippon Technologies on Vimeo.
L’Ippevent sur les APIs Cassandra change de date en raison d’un appel Ă la grĂšve lancĂ© par plusieurs syndicats de la SNCF
RDV LE JEUDI 20 JUIN Ă Partir de 19h00
MERCI POUR VOTRE COMPRĂHENSION
Chez Ippon Technologies, nous utilisons Hector depuis plusieurs années, que ce soit chez nos clients ou pour nos applications Open Source, comme par exemple Tatami.
Hector est un driver trĂšs fiable, assez performant, mais qui possĂšde une API complexe, et qui est sans doute trop âbas niveauâ. RĂ©sultat : le code dâaccĂšs Ă Cassandra est verbeux, ce qui ne facilite pas les dĂ©veloppements.
Cette soirĂ©e va ĂȘtre lâoccasion dâassister Ă deux retours dâexpĂ©rience sur les nouvelles APIs Cassandra : sont-elles vraiment simples dâutilisation ? Sont-elles mures ? Que peut-on faire avec ?
1Ăšre partie de soirĂ©e : “Cassandra-Java-Driver : vers cassandra 1.2 et au-dela” - Par Vincent BERETTI, manager technique chez Ippon Technologies
Les Ă©quipes de DataStax ont releasĂ© rĂ©cemment un tout nouveau driver pour exploiter pleinement CQL3 et le âBinary Protocolâ introduit dans Cassandra 1.2. Pendant cette session, nous prĂ©senterons rapidement les concepts et fonctionnalitĂ©s de ce nouveau driver qui pose les bases de l’avenir de Cassandra.
2Ăšme partie de soirĂ©e : âJPA avec Cassandra ? Mission pas impossible!â - Par Duy Hai DOAN, dĂ©veloppeur indĂ©pendant
Vous avez toujours voulu vous mettre Ă Cassandra mais vous nâavez pas encore lâoccasion de sauter le pas ? Vous le connaissez dĂ©jĂ , mais le code bas niveau vous rebute ? Venez dĂ©couvrir Achilles, un Entity Manager pour Cassandra qui est lĂ pour vous faciliter la vie.
Durant cette présentation, nous allons créer un clone de Twitter pas à pas avec Achilles en toute simplicité.
Inscrivez-vous Ă cet IppEvent, qui est comme d’habitude gratuit, sur http://ippevent-cassandra.eventbrite.fr/?ref=etckt
Ou par mail, en demandant une invitation Ă marketing@ippon.fr
Le French Scrum User Group organise le 26 Juin prochain une “croisiĂšre Agile” sur la Seine.
Retrouvez d’autres agilistes sur une pĂ©niche amarrĂ©e en face de la Tour Eiffel Ă Paris, Ă l’occasion d’une rencontre organisĂ©e dans la droite ligne des dĂ©sormais fameuses “Scrum Nights” !
Au programme de la soirée :
La soirĂ©e se terminera par un cocktail doublĂ© d’une croisiĂšre sur la Seine qui nous permettra de profiter d’une vue pittoresque sur “Paris by night”.
Vous trouverez toutes les informations concernant la soirée ici.
Ippon Technologies est trĂšs impliquĂ© dans la communautĂ© agile, notamment par le biais de son soutien au French Scrum User Group en tant que sponsor annuel et sponsor rĂ©gulier d’Ă©vĂ©nements tels que le Scrum Day. A ce titre nous serons bien Ă©videment prĂ©sents lors de cette soirĂ©e. N’hĂ©sitez pas Ă venir nous rencontrer pour de discuter de Scrum, de l’AgilitĂ© en gĂ©nĂ©ral, voire mĂȘme de bien d’autres sujets !

PeÌniche LâĂvĂ©nement
Ippon sera partenaire Platinum de la 3Úme édition du Symposium Liferay France, organisé à Paris.
Rendez-vous le 6 juin pour tout savoir sur les nouvelles fonctionnalitĂ©s de la premiĂšre plateforme pour le dĂ©veloppement d’applications web innovantes.
Venez rencontrer les experts Liferay d’Ippon et de l’hĂ©bergeur Atomes Hosting, les dirigeants de Liferay, les utilisateurs et les membres de la communautĂ© !
Au programme : retours d’expĂ©rience clients, prĂ©sentations techniques sur les meilleurs usages de la solution de portail et zoom sur les nouveautĂ©s Liferay.
Yann Vigara, Responsable de l’Offre Cloud Liferay Ippon animera une confĂ©rence “Liferay en production” :
“Petit kit de survie pour la mise en production de votre portail Liferay. Vous dĂ©couvrirez les bonnes pratiques qui ont fait leurs preuves dans les environnements de production que nous gĂ©rons. Vous apprendrez comment sĂ©curiser et optimiser votre Liferay. Nous explorerons les enjeux et les solutions liĂ©s au dĂ©ploiement d’un portail dans le Cloud.”
Horaires et lieu :Â de 14h00 Ă 14h35 dans le Salon Bonaparte.
Vous pourrez aussi rencontrer les Ă©quipes Ippon et Atomes Hosting sur le Stand dans l’espace Partenaires.
Pour tout savoir sur lâĂ©vĂ©nement et vous inscrire, cliquez ici
Durant une de mes rĂ©centes missions j’ai eu la chance de dĂ©velopper une application HTML5 en mode offline. Cette application a pour coeur de mĂ©tier le calcul de structures dans le bĂątiment. En gros, l’ingĂ©nieur bĂątiment va sur un chantier avec son laptop ou sa tablette, ouvre l’application et rentre des donnĂ©es de mesures physiques pour voir si Ă tout hasard le bĂątiment ne risque pas de s’Ă©crouler ^^. Toute la logique mĂ©tier est donc cĂŽtĂ© client et une connexion au serveur web permet juste de tĂ©lĂ©charger l’application une premiĂšre fois, puis de faire des mises Ă jour.
La grande question est pourquoi avoir choisi des technos Web pour faire une application “desktop” offline ? Tout d’abord c’Ă©tait un pari sur l’avenir et ensuite plusieurs devices clients Ă©taient ciblĂ©s, notamment des laptops et des tablettes, et ça HTML5 sait bien faire. L’argument rĂ©current contre HTML5 est la compatibilitĂ© navigateur. Pour une application interne Ă l’entreprise, on aurait pu cibler un seul navigateur mais ça n’a pas Ă©tĂ© notre cas. Le client voulait de la compatibilitĂ© Firefox, Chrome et mĂȘme IE8 ! Heureusement ils ont bien voulu de Google Chrome Frame.
Dans cet article, je vous prĂ©senterai donc les diffĂ©rentes technos, APIs que j’ai utilisĂ© pour dĂ©velopper cette application mais surtout je vous dĂ©voilerai les 20% d’Ă©cueils qui ont pris 80% de mon temps !
Mode OfflineMon ingĂ©nieur en bĂątiment, il n’aura pas forcĂ©ment de connexion internet sur les chantiers. Il lui faut donc une application capable de fonctionner en mode offline. HTML5 a introduit l’interface ApplicationCache qui va permettre de mettre en cache l’application web et ainsi de se passer d’une connexion internet les fois suivantes.
Le fichier cache manifestLe fichier cache manifest est un simple fichier texte qui va rĂ©fĂ©rencer tous les fichiers de votre application qui doivent (ou ne doivent pas) ĂȘtre mis en cache. Voici un exemple de fichier manifest qui demande Ă mettre en cache les fichiers index.html et css/style.css :
CACHE MANIFEST
index.html
css/style.css
Ce fichier (“manifest.appcache” par exemple mais vous pouvez lui donner n’importe quel nom ou extension) doit ĂȘtre rĂ©fĂ©rencĂ© par votre page dans la balise <html> :
<html manifest="manifest.appcache">
...
</html>
Voilà rien de plus simple. Mais on peut faire un peu plus compliqué. Le fichier cache manifest peut se décomposer en 3 sections :
En exemple :
CACHE MANIFEST
# on peut omettre cette ligne car CACHE: est la section par défaut
CACHE:
index.html
css/style.css
# Ressources qui nécessitent que l'utilisateur soit online
NETWORK:
img/logo.png
# offline.html sera utilisé si online.html n'est pas accessible
# offline.html sera utilisé à la place des autres fichiers html si ils ne sont pas accessibles
FALLBACK:
online.html offline.html
*.html offline.html
On peut utiliser des wildcards dans les sections NETWORK et FALLBACK mais pas dans la section CACHE ! Si vous avez beaucoup de fichiers dans votre application ça peut ĂȘtre ennuyeux. Je vous conseille d’utiliser un petit script pour gĂ©nĂ©rer une premiĂšre fois votre fichier, sous Unix par exemple :
echo "CACHE MANIFEST" > manifest.appcache; find . -type f | sed "s#^\./##" >> manifest.appcache
Une erreur frĂ©quente est d’oublier de vĂ©rifier que votre serveur web sert le fichier cache manifest avec le bon type MIME. Un fichier cache manifest doit avoir le type MIME “text/cache-manifest”. Par exemple dans Apache, vous pouvez rajouter cette ligne dans le fichier de configuration :
AddType text/cache-manifest .appcache
Tiens bizarre, vous avez modifiĂ© votre fichier index.html mais lorsque vous rechargez la page, vous ne voyez pas vos modifications !? C’est normal si vous avez mis en cache votre fichier index.html ! C’est bien lĂ le principe du cache
Du coup si vous voulez que votre navigateur mette Ă jour son cache avec votre nouveau fichier, vous devez modifier le fichier cache manifest.
Je vous conseille d’utiliser une ligne de commentaire avec un numĂ©ro de version que vous incrĂ©menterez lorsque vous dĂ©ploierez une nouvelle version de votre application.
CACHE MANIFEST
# Version 2
index.html
...
(note: le cache peut Ă©galement ĂȘtre mis Ă jour programmatiquement via l’api ou lorsque vous effacez le cache du navigateur)
C’est trop bien le cache HTML5 mais en mode dĂ©veloppement c’est pas pratiqueEffectivement, c’est pas pratique car pour voir vos modifications vous devez en permanence modifier votre fichier cache manifest ! LĂ plusieurs solutions s’offrent Ă vous :
Car si vous le faites, votre fichier cache manifest sera en cache et votre navigateur ne verra pas les modifications apportĂ©es au fichier cache manifest et ne mettra donc pas Ă jour son cache ! Il faudra attendre le temps d’expiration du fichier.
Double RechargementLors du tĂ©lĂ©chargement d’une nouvelle version de votre application, il faut reloader 2 fois la page : une fois pour mettre Ă jour son cache, une 2Ăšme fois pour vraiment charger la nouvelle version en cache. Pour Ă©viter ce double rechargement Ă votre utilisateur, vous pouvez utiliser un peu de code Javascript qui va faire ce boulot pour vous :
// On vérifie si un nouveau cache est disponible au chargement de la page
window.addEventListener('load', function(e) {
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Là le navigateur a téléchargé un nouveau cache
// On change le cache et on recharge la page
window.applicationCache.swapCache();
window.location.reload();
} else {
// Le cache Manifest n'a pas changé, on ne fait rien
}
}, false);
}, false);
Api Localstorage
Robert, mon ingĂ©nieur en bĂątiment, il avait l’habitude avec son logiciel desktop de sauvegarder son travail, de revenir sur son chantier le lendemain et de reprendre lĂ oĂč il s’Ă©tait arrĂȘtĂ©. Si on Ă©tait sur une application Web classique, on sauvegarderait notre travail dans une base de donnĂ©es. Mais en offline, il faut composer avec ce que le navigateur nous propose. Il y a les cookies, mais bon la taille maximale d’un cookie est de 4ko, ça fait pas beaucoup. Ce qu’il nous faut c’est donc un espace de stockage :
Dans un premier temps on va utiliser le Web Storage et plus particuliÚrement le LocalStorage qui se comporte simplement comme une Map clé-valeur. Celui-ci répond à tous nos besoins. Par exemple, sa limite de stockage est de 5Mo par nom de domaine. Cette limite est évoquée dans la spécification mais ce nombre peut différer selon les implémentations.
Ecueils String-StringLe principal problĂšme est que le LocalStorage ne propose qu’un mapping clĂ©-valeur oĂč clĂ© et valeur ne peuvent ĂȘtre que des chaines de caractĂšres ! Si vous sauvegardez un int ou un objet, celui-ci sera transformĂ© en chaine de caractĂšres. Lorsque vous voudrez le charger, il faudra coder une petite Ă©tape intermĂ©diaire pour retrouver votre objet initial (parseInt() ou JSON.parse() par exemple). Mais si vous ne voulez pas vous embĂȘter, vous pouvez utiliser le petit framework Locache qui possĂšde une API simple de cache et qui permet notamment de sauvegarder vos objets dans le LocalStorage et de le rĂ©cupĂ©rer en tant que tel.
Api File, FilesystemRobert, qui dĂ©pose tous les matins ses enfants Ă l’Ă©cole, il est content de pouvoir sauvegarder son travail dans son navigateur. Mais avant il le faisait dans des fichiers qu’il pouvait voir en vrai sur son disque dur. En plus, ça lui arrivait d’envoyer son fichier Ă son collĂšgue Miguel pour qu’il y jette un oeil. Ok… pas de problĂšme…
Dans une application web classique, c’est le serveur qui envoie un binaire Ă votre navigateur et ce dernier vous propose de le sauvegarder quelque part sur le filesystem. Mais lĂ je vous rappelle, on travaille en mode offline.
HTML5 introduit plusieurs APIs permettant de gérer des fichiers :
Ici le principal Ă©cueil est le support disparate des navigateurs des APIs de fichiers. D’une part, les APIs fichiers de HTML5 sont compliquĂ©s car scindĂ©s en diffĂ©rentes API et de l’autre cĂŽtĂ©, certains navigateurs supportent une Api mais pas l’autre. C’est facile de s’y perdre. Je vous conseille d’utiliser le site caniuse pour se tenir au courant des diffĂ©rentes compatibilitĂ©s navigateurs.
ModĂ©lisation 2DAutre truc sympa que l’application doit faire, c’est modĂ©liser les diffĂ©rentes structures (poteaux, dalles, …) des bĂątiments. Oui, Robert comprend mieux avec des schĂ©mas et des dessins. Pas vous ?
Bon ici on était confronté à deux choix : Canvas ou SVG. On a essayé les deux :
et Ă vrai dire on Ă©tait plutĂŽt satisfait des deux. En ce qui nous concerne, ce qui a fait la diffĂ©rence, c’est que SVG c’est du vectoriel. D’une, l’application prĂ©cĂ©dente utilisait du vectoriel et de deux, ces modĂ©lisations devaient ĂȘtre imprimĂ© pour ĂȘtre incorporĂ© dans un rapport.
Framework Javascript, CSSBien sĂ»r au-delĂ de HTML5, nous avons utilisĂ© plĂ©nitude d’outils et framework Javascripts, CSS. Je ne vais pas les dĂ©tailler ici, surtout que mes collĂšgues s’y sont dĂ©jĂ attelĂ©s :
J’ai oubliĂ© de prĂ©ciser que ce dĂ©veloppement n’Ă©tait pas un dĂ©veloppement de zĂ©ro mais une migration d’application desktop Ă©crite en C++ vers une application web offline Ă©crite en HTML Javascript ! On commence Ă voir des entreprises de moins en moins frileuses par rapport Ă ces nouvelles technologies Web et tant mieux ! Le Web existe maintenant depuis plus de 20 ans et est utilisĂ© partout, par tout le monde et tout le temps.
Je pense que HTML5 a de beaux jours devant lui et notamment dans le dĂ©veloppement d’applications d’entreprise dites desktop. Les APIs sont lĂ , les implĂ©mentations ne suivent pas toujours mais la communautĂ© HTML/Javascript/CSS est tellement bouillante que de nombreux frameworks Ă©mergent pour combler les trous. La convergence applications web, applications desktop et applications mobiles sera sans doute HTML5 (ou HTML6 ^^). Seul l’avenir nous le dira.
En 2004, Google a publiĂ© un article prĂ©sentant son algorithme de calcul Ă grande Ă©chelle, MapReduce, ainsi que son systĂšme de fichier en cluster, GoogleFS. Rapidement (2005) une version open source voyait le jour sous lâimpulsion de Yahoo.
Aujourdâhui il est difficile de se retrouver dans la jungle dâHadoop pour les raisons suivantes :
Ce sont des technologies jeunes.
Beaucoup de buzz et de communication de sociétés qui veulent prendre le train Big Data en marche.
Des raccourcis sont souvent employĂ©s (non MapReduce ou un Ă©quivalent nâest pas suffisant pour parler dâHadoop).
Beaucoup dâacteurs diffĂ©rents (des mastodontes, des spĂ©cialistes du web, des start-up, âŠ).
Dans une distribution Hadoop on va retrouver les Ă©lĂ©ments suivants (ou leur Ă©quivalence) HDFS, MapReduce, ZooKeeper, HBase, Hive, HCatalog, Oozie, Pig,  Sqoop, …
Ces solutions sont des projets Apache et donc disponibles mais lâintĂ©rĂȘt d’un package complet est Ă©vident : compatibilitĂ© entre les composants, simplicitĂ© dâinstallation, support, …
Dans cet article on évoquera les trois distributions majeures que sont Cloudera, HortonWorks et MapR, toutes les trois se basant sur Apache Hadoop.
On peut toutefois les distinguer en fonction de la distance quâelles prennent avec cette base :
MapR : noyau Hadoop mais repackagé et enrichi de solutions propriétaires.
Cloudera : fidĂšle en grande partie sauf pour les outils dâadministration.
HortonWorks : fidĂšle Ă la distribution Apache et donc 100% open source.
Il existe d’autres distributions, voire des offres cloud, mais qui n’offrent pas l’ensemble des fonctionnalitĂ©s d’une plate forme Hadoop ou ne sont pas open source (ou a minima gratuites) comme Intel Distribution for Hadoop ou bien Greenplum (Pivotal HD).
Le cĆur : Hadoop kernelHadoop est le framework le plus utilisĂ© actuellement pour manipuler et faire du Big Data.
Apache Hadoop est un framework qui va permettre le traitement de donnĂ©es massives sur un cluster allant de une Ă plusieurs centaines de machines, c’est un projet open source (Apache v2 licence).
Hadoop est écrit en Java et a été créé par Doug Cutting et Michael Cafarella en 2005 (Doug, travaillait alors pour Yahoo sur son projet de crawler web Nutch).
C’est lui qui va gĂ©rer la distribution des donnĂ©es au cĆur des machines du cluster, leurs Ă©ventuelles dĂ©faillances mais aussi l’agrĂ©gation du traitement final.
Lâarchitecture est de type « Share nothing » : aucune donnĂ©e nâest traitĂ©e par deux noeuds diffĂ©rents mĂȘme si les donnĂ©es sont rĂ©parties sur plusieurs noeuds (principe dâun noeud primaire et de noeuds secondaires).Â
HDFS (Hadoop Distributed File System)HDFS est un systÚme de fichiers Java utilisé pour stocker des données structurées ou non sur un ensemble de serveurs distribués.
HDFS sâappuie sur le systĂšme de fichier natif de lâOS pour prĂ©senter un systĂšme de stockage unifiĂ© reposant sur un ensemble de disques et de systĂšmes de fichiers hĂ©tĂ©rogĂšnes.
La consistance des données est basée sur la redondance. Une donnée est stockée sur au moins n volumes différents.
ĂlĂ©ments importants :
Node (Master/slave) : Dans une architecture Hadoop chaque membre pouvant traiter des donnĂ©es est appelĂ© node (Noeud). Un seul d’entre eux peut ĂȘtre master mĂȘme s’il peut changer au cours de la vie du cluster.
Il est responsable de la localisation des données dans le cluster (il est appelé Name Node). Les autres sont des slaves appelés Data Nodes.
Bien quâil puisse y avoir plusieurs Name Nodes, la âpromotionâ doit se faire manuellement (Hadoop 2.0, actuellement en version alpha, introduit un failover automatisĂ©).
Le Name Node est donc un Single Point Of Failure (SPOF) dans un cluster Hadoop.
Au sein du cluster, les données sont découpées et distribuées en blocks selon les deux paramÚtres suivants :
Blocksize : Taille unitaire de stockage (gĂ©nĂ©ralement 64 Mo ou 128 Mo). C’est Ă dire qu’un fichier de 1 Go (et une taille de block de 128 Mo) sera divisĂ© en 8 blocks.
Replication factor : C’est le nombre de copies d’une donnĂ©es devant ĂȘtre rĂ©parties sur les diffĂ©rents noeuds du cluster (souvent 3, c’est Ă dire une primaire et deux secondaires).
Enfin, un principe important d’HDFS est que les fichiers sont de type “write-once” car dans des opĂ©rations analytiques on lit la donnĂ©e beaucoup plus qu’on l’Ă©crit. C’est donc sur la lecture que les efforts ont Ă©tĂ© portĂ©s.
Ce qui signifie que l’on ne modifie pas les donnĂ©es dĂ©jĂ prĂ©sentes.
Un principe liĂ© est qu’Ă partir du moment ou un fichier HDFS est ouvert en Ă©criture, il est verrouillĂ© pendant toute la durĂ©e du traitement.
Il est donc impossible d’accĂ©der Ă des donnĂ©es ou Ă un rĂ©sultat tant que le job n’est pas terminĂ© et n’a pas fermĂ© le fichier (et un fichier peut ĂȘtre trĂšs volumineux avec Hadoop).
En mai 2011, MapR a annoncĂ© une alternative au systĂšme HDFS. Ce systĂšme permet d’Ă©viter le SPOF qu’est le Name Node. Ce systĂšme n’est pas inconnu car il s’agit de HBase, dont elle propose une version propriĂ©taire.
HBase (Apache)HBase est un sous-projet d’Hadoop, câest un systĂšme de gestion de base de donnĂ©es non relationnelles distribuĂ©, Ă©crit en Java, disposant d’un stockage structurĂ© pour les grandes tables.
HBase est inspirĂ©e des publications de Google sur BigTable. Comme BigTable, câest une base de donnĂ©es orientĂ©e colonnes.
HBase est souvent utilisé conjointement au systÚme de fichiers HDFS, ce dernier facilitant la distribution des données de HBase sur plusieurs noeuds.
Contrairement à HDFS, HBase permet de gérer les accÚs aléatoires read/write pour des applications de type temps réel.
Cassandra (Facebook)Cassandra est une base de donnĂ©es orientĂ©e colonnes dĂ©veloppĂ©e sous lâimpulsion de Facebook.
Cassandra supporte lâexĂ©cution de jobs MapReduce qui peuvent y puiser les donnĂ©es en entrĂ©e et y stocker les rĂ©sultats en retour (ou bien dans un systĂšme de fichiers).
Cassandra comparativement à HBase est meilleur pour les écritures alors que ce dernier est plus performant pour les lectures.
Offre CloudLe cloud est un complément idéal au monde Hadoop, en offrant des possibilités de stockage et de traitement extensibles.
Il est donc possible dâutiliser un systĂšme de fichiers situĂ© dans le cloud pour le stockage des donnĂ©es et lâexĂ©cution des traitements.
Solutions supportées :
Amazon S3.
Kosmixâs CloudStore.
IBM GPFS (General Parallel File System).
A l’origine crĂ©e par Google pour son outil de recherche web.
C’est un framework qui permet le dĂ©composition d’une requĂȘte importante en un ensemble de requĂȘtes plus petites qui vont produire chacune un sous ensemble du rĂ©sultat final : câest la fonction Map.
Lâensemble des rĂ©sultats est traitĂ© (agrĂ©gation, filtre) : câest la fonction Reduce.
Alternatives YARN (HortonWorks)YARN (Yet-Another-Resource-Negotiator) est aussi appelĂ©  MapReduce 2.0, ce n’est pas une refonte mais une Ă©volution du framework MapReduce.
YARN apporte une séparation claire entre les problématiques suivantes :
YARN est compatible avec les anciennes versions de MapReduce (il faut simplement recompiler le code).
Les extensions RequĂȘtage des donnĂ©es : Hive (Facebook)Hive est Ă l’origine un projet Facebook qui permet de faire le lien entre le monde SQL et Hadoop.
Il permet l’exĂ©cution de requĂȘtes SQL sur un cluster Hadoop en vue d’analyser et dâagrĂ©ger les donnĂ©es.
Le langage SQL est nommĂ© HiveQL. C’est un langage de visualisation uniquement, c’est pourquoi seules les instructions de type âSelectâ sont supportĂ©es pour la manipulation des donnĂ©es.
Dans certains cas, les développeurs doivent faire le mapping entre les structures de données et Hive.
Hive utilise un connecteur jdbc/odbc.
Scripting sur les donnĂ©es : Pig (Yahoo)Pig est Ă l’origine un projet Yahoo qui permet le requĂȘtage des donnĂ©es Hadoop Ă partir d’un langage de script.
Contrairement à Hive, Pig est basé sur un langage de haut niveau PigLatin qui permet de créer des programmes de type MapReduce.
Contrairement Ă Hive, Pig ne dispose pas d’interface web.
Intégration SGBD-R : Sqoop (Cloudera)Sqoop permet le transfert des données entre un cluster Hadoop et des bases de données relationnelles.
C’est un produit dĂ©veloppĂ© par Cloudera.
Il permet dâimporter/exporter des donnĂ©es depuis/vers Hadoop et Hive.
Pour la manipulation des données Sqoop utilise MapReduce et des drivers JDBC.
Ordonnanceur : Apache Oozie (Yahoo)Oozie est une solution de workflow (au sens scheduler dâexploitation) utilisĂ©e pour gĂ©rer et coordonner les tĂąches de traitement de donnĂ©es Ă destination de Hadoop.
Oozie sâintĂšgre parfaitement avec lâĂ©cosystĂšme Hadoop puisquâil supporte les types de jobs suivant :
MapReduce (Java et Streaming).
Pig.
Hive.
Sqoop.
Autres tels que programmes Java ou scripts de type Shell.
ZooKeeper est un service de coordination des services dâun cluster Hadoop.
En particulier, le rÎle de ZooKeeper est de fournir aux composants Hadoop les fonctionnalités de distribution.
Pour cela il centralise les éléments de configuration du cluster Hadoop, propose des services de clusterisation et gÚre la synchronisation des différents éléments (événements).
ZooKeeper est un Ă©lĂ©ment indispensable au bon fonctionnement de HBase.Â
Supervision Apache Ambari (HortonWorks)Ambari est un projet dâincubation Apache initiĂ© par HortonWorks et destinĂ© Ă la supervision et Ă lâadministration de clusters Hadoop.
Câest un outil web qui propose un tableau de bord. Cela permet de visualiser rapidement lâĂ©tat dâun cluster.
Ambari dispose dâun tableau de bord dont le rĂŽle est de fournir une reprĂ©sentation :
De lâĂ©tat des services.
De la configuration du cluster et des services.
Des informations issues de Ganglia et de Nagios.
De lâexĂ©cution des jobs.
Des métriques de chaque machine et du cluster.
De plus Ambari inclue un systĂšme de gestion de configuration permettant de dĂ©ployer des services dâHadoop ou de son Ă©cosystĂšme sur des clusters de machines.
Ambari se positionne en alternative à Chef, Puppet pour les solutions génériques ou encore à Cloudera Manager pour le monde Hadoop.
Ambari ne se limite pas Ă Hadoop mais permet de gĂ©rer Ă©galement tous les outils de lâĂ©cosystĂšme.
Les outils annoncés sont :
Hadoop
HDFS
MapReduce
Hive, HCatalog
Oozie
HBase
Ganglia, Nagios
Flume est une solution de collecte et d’agrĂ©gation de fichiers logs, destinĂ©s Ă ĂȘtre stockĂ©s et traitĂ©s par Hadoop.
Il a Ă©tĂ© conçu pour sâinterfacer directement avec HDFS au travers dâune API native.
Flume est Ă lâorigine un projet Cloudera, reversĂ© depuis Ă la fondation Apache.
Alternatives : Apache Chukwa.
Apache MahoutApache Mahout est un projet de la fondation Apache visant Ă crĂ©er des implĂ©mentations d’algorithmes d’apprentissage automatique et de datamining.
MĂȘme si les principaux algorithmes dâapprentissage se basent sur MapReduce, il nây a pas dâobligation Ă utiliser Hadoop. Apache Mahout ayant Ă©tĂ© conçu pour pouvoir fonctionner sans cette dĂ©pendance.Â
Apache Drill (MapR)InitiĂ© par MapR, Drill est un systĂšme distribuĂ© permettant dâeffectuer des requĂȘtes sur de larges donnĂ©es. Il implĂ©mente les concepts exposĂ©s par le projet Google Dremel.
Drill permet dâadresser le besoin temps rĂ©el dâun projet Hadoop. MapReduce Ă©tant plutĂŽt conçu pour traiter de larges volumes de donnĂ©es en batch sans objectif de rapiditĂ© et sans possibilitĂ© de redĂ©finir la requĂȘte Ă la volĂ©e.
Drill est donc un systĂšme distribuĂ© qui permet lâanalyse interactive des donnĂ©es, ce nâest pas un remplacement de MapReduce mais un complĂ©ment qui est plus adaptĂ© pour certains besoins.
Apache HCatalog (HortonWorks)HCatalog permet l’interopĂ©rabilitĂ© d’un cluster de donnĂ©es Hadoop avec des systĂšmes externes.
HCatalog est un service de management de tables et de schéma des données Hadoop :
Tez est un nouveau framework en incubation chez Apache.
Utilisant YARN il remplace MapReduce afin de fournir des requĂȘtes dites âtemps rĂ©elâ. La faible latence est en effet un prĂ© requis Ă lâexploration interactive des donnĂ©es stockĂ©es sur un cluster Hadoop.
Câest un concurrent dâApache Drill (MapR) ou de Cloudera Impala.
Vue d’ensemble de la plate forme Hadoop Les distributions HortonWorks PrĂ©sentationHortonWorks a Ă©tĂ© formĂ© en juin 2011 par des membres de lâĂ©quipe Yahoo en charge du projet Hadoop.
Leur but est de faciliter lâadoption de la plate forme Hadoop dâApache, câest pourquoi tous les composants sont open source et sous licence Apache.
Le modĂšle Ă©conomique dâHortonWorks est de ne pas vendre de licence mais uniquement du support et des formations.
Cette distribution est la plus conforme Ă la plate forme Hadoop dâApache et HortonWorks est un gros contributeur Hadoop.
Parmi les projets reversés il y a :
YARN,
HCatalog,
Ambari,
…
Les éléments suivants composent la plate forme HortonWorks :
CĆur Hadoop (HDFS/MapReduce).
NoSQL (Apache HBase).
Méta-données (Apache HCatalog).
Plate forme de script (Apache Pig).
RequĂȘtage (Apache Hive).
Planification(Apache Oozie).
Coordination (Apache Zookeeper).
Gestion et supervision (Apache Ambari).
Services dâintĂ©gration (HCatalog APIs, WebHDFS, Talend Open Studio for Big Data, Apache Sqoop).
Gestion distribuée des logs (Apache Flume).
Apprentissage (Apache Mahout).
HortonWorks met à disposition une machine virtuelle ou sont pré installés les composants de la plate forme Hadoop.
Câest lâidĂ©al pour lâapprentissage de la plate forme mais incompatible avec les exigences de production ou mĂȘme celles dâun POC.
Installation automatique avec AmbariEn plus de la gestion du cluster, Ambari permet le dĂ©ploiement de l’ensemble des composants Hadoop de maniĂšre centralisĂ©e.
Installation manuelle avec Linux RPMHortonWorks met Ă disposition des packages RPM.
En utilisant le principe des RPM Linux il est possible dâinstaller les composants HDP manuellement.
Cloudera PrésentationCloudera se veut comme la compagnie commerciale Hadoop.
Fondée par des experts Hadoop en provenance de Facebook, Google, Oracle et Yahoo.
Si leur plate forme est en grande partie basĂ©e sur Hadoop dâApache, elle est complĂ©tĂ©e avec des composants maison essentiellement pour la gestion du cluster.
A noter aussi que la version dâApache Hadoop distribuĂ©e est la derniĂšre version stable complĂ©tĂ©e de patchs critiques ainsi que de quelques fonctionnalitĂ©s de la version de dĂ©veloppement.
Le modĂšle Ă©conomique de Cloudera est la vente de licences mais aussi du support et des formations.Â
Cloudera propose une version entiĂšrement open source de leur plate forme (Licence Apache 2.0).
Composants de la plate forme CDH (Clouderaâs Distribution including Apache Hadoop)Composants Apache :
HDFS : File System distribué.
MapReduce : Framework de traitement parallélisé.
HBase : Base de données NoSQL (accÚs read/write aléatoires).
Hive : RequĂȘtage de type SQL.
Pig : Scripting et requĂȘtage Hadoop.
Oozie : Workflow et planification de jobs Hadoop.
Sqoop : Intégration de bases SQL.
Flume : Exploitation de fichiers (log) dans Hadoop.
ZooKeeper : Service de coordination pour les applications distribuées.
Mahout : Framework dâapprentissage et de datamining pour Hadoop.
Composants dâorigine Cloudera :
Hadoop Common: Un ensemble dâutilitaires.
Hue : SDK permettant de développer des interfaces utilisateur pour les applications Hadoop.
Whirr : Librairies et scripts pour lâexĂ©cution dâHadoop et de services liĂ©s dans le cloud.
Composants non Apache Hadoop :
Cloudera Impala : Moteur temps rĂ©el de requĂȘtage SQL parallĂ©lisĂ© de donnĂ©es stockĂ©es dans HDFS ou HBase. Contrairement Ă Hive de Hadoop, Impala n’utilise pas le framework MapReduce qui exige que les rĂ©sultats de recherche soient Ă©crits sur le disque, ce qui lui permet d’exĂ©cuter les requĂȘtes plus rapidement. La consultation des donnĂ©es peut ĂȘtre interactive. Licence : ASLv2.
Cloudera Manager : Déploiement et gestion des composants Hadoop.
A noter que Cloudera Manager nâest pas entiĂšrement Open Source mais dispose dâune version gratuite avec quelques restrictions :
La version gratuite est limitée à 50 noeuds.
Certaines fonctionnalités sont uniquement disponibles sur la version commerciale (comme le monitoring, les sauvegardes et les mises à jour automatiques).
Support uniquement pour la version payante.
Cloudera Manager permet lâinstallation des composants de la plate forme sur une machine (y compris distante).
Cloudera Manager permet la configuration centralisée des composants du cluster.
Enfin Cloudera Manager permet de finaliser lâinstallation en vĂ©rifiant le bon fonctionnement de chacun des composants.
Manuel avec les packagesRécupération des archives tarball (tgz) contenant la distribution.
Configuration et installation Ă lâaide des scripts fournis.
MapR PrĂ©sentationMapR a Ă©tĂ© fondĂ©e en 2009 par dâanciens membres de Google.
Bien que son approche soit commerciale, MapR contribue Ă des projets Apache Hadoop comme HBase, Pig, Hive, ZooKeeper et surtout Drill.Â
MapR se distingue surtout de la version dâApache Hadoop par sa prise de distance avec le cĆur de la plate-forme. Ils proposent ainsi leur propre systĂšme de fichier distribuĂ© ainsi que leur propre version de MapReduce : MapR FS et MapR MR.
Trois versions de leur solution sont disponibles :
M3 : version open source.
M5 : Ajoute des fonctions de haute disponibilité et du support.
M7 : Environnement HBase optimisé.
MapR a remporté de beaux succÚs commerciaux depuis sa création.
Un partenariat avec EMC pour une la crĂ©ation et le support dâune version spĂ©cifique Ă la plate forme Hadoop d’EMC.
MapR est Ă lâorigine de la version cloud de MapReduce dâAmazon : Elastic Map Reduce (EMR).
Enfin ils ont Ă©tĂ© retenu par Google pour lâoffre Big Data de Google Compute Engine (GCE).
Composants Apache :
HBase,
Pig,
Hive,
Mahout,
Cascading,
Sqoop,
Flume
MapR propose son propre systĂšme en remplacement de HDFS :
Une version maison de HBase (performance et fiabilité améliorées).
Avantages :
SystÚme plus adapté au mode read/write que HDFS.
MapR intĂšgre un serveur NFS (Network File System) pour lâintĂ©gration au SI de lâentreprise.
Simplification de mise en oeuvre (surcouche du File System de lâOS et non remplacement comme HDFS).
Plus de Single Point Of Failure.
MapR FS reste compatible avec les API MapReduce/HDFS et HBase.
MapR propose son propre systĂšme en remplacement de MapReduce dâApache.
Avantages :
MapR annonce de meilleures performances.
EntiÚrement optimisé pour HBase.
MapR Control System (MCS)
MCS permet la gestion et la supervision du cluster Hadoop. Câest un outil web permettant Ă la fois les ressources du cluster (CPU, Ram, Disque) que les services et les jobs.
MCS permet de dĂ©finir des alarmes sur des seuils ou des quotas …
La visualisation des informations est assurée par le composant HeatMap.
Autres spécificités :
Apache Cascading
Cascading est un framework Java dĂ©diĂ© Ă Hadoop. Il permet Ă un dĂ©veloppeur Java de retrouver ses marques (JUnit, Spring, etc…) et de manipuler les concepts dâHadoop avec un langage de haut niveau sans en  connaĂźtre les API.
Apache Vaidya
Hadoop Vaidya est un outil dâanalyse des performances des jobs MapReduce.
Son principe de fonctionnement est basĂ© sur des rĂšgles quâil confronte aux statistiques dâexĂ©cution des jobs et aux fichiers de configuration.
Le rapport est produit au format XML.
Apache Drill
MapReduce a la rĂ©putation dâĂȘtre puissant mais complexe Ă manipuler (il faut en maĂźtriser l’API).
De plus, il est impossible de redĂ©finir les requĂȘtes Ă la volĂ©e.
Drill vient complĂ©ter MapReduce et se prĂ©sente sous la forme dâune API permettant de crĂ©er plus rapidement des requĂȘtes en se basant sur le modĂšle SQL.
SQL plutĂŽt qu’une nouvelle API, c’est donc le choix de la capitalisation fait par Drill.
Vision dâensemble de la distribution DĂ©ploiement de la plate forme Machine virtuelleMapR fourni une machine virtuelle avec un seul noeud et lâensemble des composants installĂ©s.
Câest lâidĂ©al pour une prise en main de la plate-forme mais incompatible avec les exigences de production.
Manuelle avec les packagesMapR ne fournit pas de systÚme de déploiement Hadoop.
Lâinstallation est donc essentiellement manuelle avec des automatisations possibles.
Tout dâabord il faut rĂ©cupĂ©rer les composants Ă installer :
Depuis le repository internet
Depuis un repository local
Avec des packages Debian/Linux
AprÚs édition de la configuration il faut ensuite exécuter les scripts fourni pour installer les composants MapR sur chaque machine.
A noter que la distribution ne contient pas les composants Apache et quâil faut les installer manuellement.
ConclusionLes trois distributions ont une approche et un positionnement diffĂ©rent en ce qui concerne la vision dâune plate forme Hadoop (open source, modĂšle Ă©conomique…).
Le choix se portera sur lâune ou lâautre solution en fonction des exigences :
Solution open source.
Maturité de la solution.
Partenariats et compatibilitĂ© avec les produits satellites.Â
Le choix d’une distribution est d’autant plus difficile que l’avenir d’Hadoop est loin d’ĂȘtre tout tracĂ©.
En effet des virages technologiques importants sont d’ores et dĂ©jĂ annoncĂ©s :
Hadoop est né afin de répondre à la problématique suivante : comment traiter des téra-octets de données simplement ?
La rĂ©ponse proposĂ©e alors, un systĂšme de fichier distribuĂ©, est arrivĂ©e Ă un moment oĂč il Ă©tait impossible de traiter de tels volumes de donnĂ©es en mĂ©moire. Maintenant le coĂ»t de la RAM a fortement baissĂ© et avec la gĂ©nĂ©ralisation des architecture 64 bits ce n’est plus tout Ă fait exact.
La sécurité : elle est encore balbutiante malgré quelques initiatives comme Apache Knox.
L’intĂ©gration avec le SI, une plate forme Hadoop isolĂ©e et non intĂ©grĂ©e au systĂšme d’information ne sera plus possible dans le futur (en tout cas certains besoins exigeront une interaction plus grande).
Un support direct des transactions ce qui a toujours été un challenge trÚs important dans le monde des données distribuées.
Le vĂ©tĂ©ran ce quâil lui donne une lĂ©gitimitĂ© et un nombre de clients supĂ©rieur Ă ces concurrents.
Un autre avantage est de disposer dans ses rangs de Doug Cutting le crĂ©ateur dâHadoop.
Cloudera est trĂšs prompt Ă sortir les derniĂšres versions dâHadoop (les premiers Ă sortir une distribution compatible Hadoop 2.0).
Les principaux partenaires sont IBM, HP, Oracle.
MapRLa plus Ă©loignĂ©e dâApache Hadoop car elle intĂšgre leur propre vision de MapReduce et HDFS. AprĂšs Cloudera câest la solution la plus mature.
Câest aussi la solution la plus simple Ă Â installer grĂące Ă leur utilisation du file system natif.
Beaucoup de partenariats de haut niveau et trÚs stratégiques sur le cloud (Amazon Elastic MapReduce et Google Compute Engine).
HortonWorksCâest la seule plate forme 100 % Apache Hadoop.
La stratĂ©gie assumĂ©e dâHortonWorks est de se baser sur les versions stables et testĂ©es dâApache Hadoop plutĂŽt que sur les derniĂšres versions.
Leur solution de gestion du cluster, Ambari, nâest pas aussi mature que la concurrence : Cloudera Manager et HeatMap.
Malgré sa relative jeunesse, HortonWorks a signé des partenariats importants avec IBM, Microsoft, Teradata et Talend. Ils ont notamment signé avec Microsoft un accord pour le déploiement de leur plate forme sur Azure.
Il y a une poignĂ©e d’annĂ©es, prononcer le mot Javascript face Ă un dĂ©veloppeur JavaEE, c’Ă©tait comme parler de la valeur du ticket restaurant lors d’un premier entretien d’embauche⊠Juste un truc pas complĂštement Ă cĂŽtĂ© de la plaque, mais plutĂŽt Ă Ă©viter, un aspect de la rĂ©alisation qu’il fallait mieux cacher comme la poussiĂšre qu’on pousse sous le tapisâŠ
Et puis, progressivement, une rĂ©volution a eu lieu : le HTML5 s’est prĂ©cisĂ©, l’outillage s’est raffinĂ© (merci Firebug et Chrome !) et surtout des frameworks de plus en plus puissants et faciles Ă utiliser ont fleuri (en commençant par JQuery), permettant d’exploiter Ă fond les capacitĂ©s impressionnantes de ce langage. Et petit Ă petit, les technologies Front ont retrouvĂ© grĂące auprĂšs des dĂ©veloppeurs JavaEE.
Dernier acte Ă ce jour, la parution de plusieurs solutions dites de MVC javascript, telles que BackBone.js (qui fait dĂ©jĂ figure d’ancĂȘtre !), Angular.js et Ember.js (pour ne citer que les plus populaires).
Ember.js : mon petit prĂ©fĂ©rĂ©…Dans ce post, nous nous intĂ©resserons uniquement Ă Ember.js, qui est Ă mon goĂ»t, la solution la plus complĂšte et la plus “Ă©lĂ©gante” (en tout cas de celles que j’ai pu aborderâŠ)
Ember est un framework Javascript issu du projet SproutCore, grandement utilisĂ© par Apple notamment pour ses applications Web. Contrairement Ă Backbone.js, Ember est directement conçu pour ĂȘtre couplĂ© Ă Handlebars pour les aspects templating, et offre immĂ©diatement des possibilitĂ©s de binding bi-directionnelles. Il est dĂ©pendant de JQuery.
Son apprentissage est relativement rapide, grĂące Ă un site Web plutĂŽt didactique et Ă une bonne documentation de l’API (en tout cas, tant qu’on ne touche pas Ă Ember-data qui fera sĂ»rement l’objet d’un autre post…). Je recommande cependant l’excellent article d’Andy Matthews (http://www.adobe.com/devnet/html5/articles/flame-on-a-beginners-guide-to-emberjs.html) pour une premiĂšre plongĂ©e. C’est clairement cet article qui m’a permis d’Ă©crire le mien ! Il y a Ă©galement un trĂšs bon tutoriel vidĂ©o directement disponible sur le site.
Ătant un amateur de portail (j’ai prononcĂ© un gros mot ?), je me suis dit qu’il serait intĂ©ressant de voir dans quelle mesure il pourrait ĂȘtre possible d’utiliser Ember dans le cadre particulier d’une portlet. Il n’y a rien d’Ă©vident Ă cela, sachant que ce type de framework est gĂ©nĂ©ralement conçu pour manipuler une page Web, alors mĂȘme qu’une portlet ne produira qu’un fragment de la page⊠La cible retenue est l’inusable Liferay.
Maven et Liferay : c’est possible !Depuis la version 6.1 du portail Liferay, il est possible d’abandonner le plugin sdk de l’Ă©diteur pour une structure plus classique de projet Maven. Liferay publie en effet Ă la fois les artefacts du portail et les plugins de construction ou de dĂ©ploiement sur des repositories publics.
Pour aller plus loin, vous aurez donc besoin :
Pour plus de simplicitĂ©, il est prĂ©fĂ©rable de dĂ©finir au prĂ©alable un profile spĂ©cifique Ă l’installation locale de son portail Liferay dans le fichier settings.xml du rĂ©pertoire .m2. Ce profile est du type :
<profile>
<id>emberlf</id>
<properties>
<liferay.version>6.1.1</liferay.version>
<liferay.auto.deploy.dir>%path to liferay bundle%/Liferay6.1/liferay-portal-6.1.1-ce-ga2/deploy</liferay.auto.deploy.dir>
</properties>
</profile>
Démarrer votre portail et lancer la création du squelette de projet de portlet par la commande suivante :
mvn archetype:generate -DarchetypeArtifactId=liferay-portlet-archetype -DarchetypeGroupId=com.liferay.maven.archetypes -DarchetypeVersion=6.1.0 -DgroupId=fr.ippon.liferay.ember -DartifactId=ember-portlet -Dversion=1.0-SNAPSHOT -DinteractiveMode=false
Charger le projet dans votre Ă©diteur, et vous avez alors une magnifique portlet qui ne fait rien⊠On peut mĂȘme la dĂ©ployer sur le portail Ă l’aide d’une commande :
mvn -Pemberlf package liferay:deploy
Ah si, elle affiche “This is the ember-portlet.”.
Le reste de cet article va vous montrer comment faire rapidement bien mieux !
IntĂ©gration d’Ember Ă la portletAvant toute chose, il faut bien entendu rĂ©cupĂ©rer la distribution d’Ember.js et les frameworks associĂ©s. Cet article se base sur la version 1.0.0-rc3.
La premiĂšre chose Ă faire est de recopier les ressources ember dans le projet
Une fois ces ressources copiĂ©es, il convient de les dĂ©clarer Ă la portlet. Cette dĂ©claration s’effectue au travers du fichier liferay-portlet.xml en y ajoutant les lignes :
<footer-portlet-javascript>/js/jquery-1.9.1.min.js</footer-portlet-javascript>
<footer-portlet-javascript>/js/handlebars.js</footer-portlet-javascript>
<footer-portlet-javascript>/js/ember-1.0.0-rc.1.js</footer-portlet-javascript>
On va Ă©galement ajouter dans le fichier main.js dĂ©jĂ prĂ©sent (créé par dĂ©faut par Liferay), la dĂ©claration de l’application Ember.js, plus quelques petites subtilitĂ©s permettant de valider le fonctionnement d’Ember.js :
App = Ember.Application.create({
rootElement: $('section#portlet_emberportlet_WAR_emberportlet')
});
App.ApplicationView = Ember.View.extend({
click: function(evt) {
alert("Well done ! En plein sur la View Ember de la portlet !");
}
});
App.ApplicationController = Ember.Controller.extend({
templateName: 'Ember portlet',
people: [
{firstName: "Kitien", lastName: "Laroutte"},
{firstName: "Sophie", lastName: "Fonsec"},
{firstName: "Igor", lastName: "Saherseize"}
]
});
Le point le plus important (et peu documentĂ©âŠ) est que l’on initialise l’application en lui passant un ‘rootElement’ correspondant au contenu de la portlet. Cela permet de limiter et de positionner les actions sur le DOM effectuĂ©es par le framework, qui est ainsi restreint au fragment de page servi par la portlet.
Le reste est assez standard :
Rien de trĂšs dynamique pour le moment.
vous pouvez alors modifier votre fichier view.jsp de la façon suivante :
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<portlet:defineObjects />
<script type="text/x-handlebars">
<h3>{{templateName}} </h3>
<ul>
{{#each people}}
<li>Hello {{firstName}}</li>
{{/each}}
</ul>
</script>
AprÚs déploiement de la portlet par un mvn -Pember-liferay clean package liferay:deploy et placement dans une page du portail, on obtient la vue de la liste des personnes déclarées précédemment.
Et un clic sur le fragment de page affichant la portlet produit l’affichage d’une boĂźte d’alerte.
Il est maintenant temps d’aller un cran plus loin !
Service Liferay et JSONLiferay est un portail offrant une architecture de services particuliĂšrement ouverte. On bĂ©nĂ©ficie ainsi de nombreux services SOAP ou REST/JSon permettant de manipuler les principaux objets créés au travers du “service builder”.
Pour consulter (et tester !) ces services JSON, il suffit de se rendre sur la page suivante de son portail local :
http://localhost:8080/api/jsonws
L’appel suivant, une fois les valeurs de repositoryId et de token d’authentification fixĂ©s permet par exemple de rĂ©cupĂ©rer les fichiers stockĂ©s dans le rĂ©pertoire de la bibliothĂšque :
http://localhost:8080/api/secure/jsonws/dlapp/get-file-entries?repositoryId=<repoId>&folderId=0&p_auth=<token secu>
On va donc mettre Ă profit cette capacitĂ© pour construire une petite interface permettant de lister les rĂ©pertoires de la bibliothĂšque Liferay et les fichiers qu’ils contiennent.
C’est beau la mĂ©canique Ember !Dans toute application Ember.js, l’essentiel de l’interface et de la cinĂ©matique applicative est rĂ©parti entre les fichiers HTML et Javascript. Les deux sont intimement liĂ©s et doivent normalement s’aborder simultanĂ©ment, ce qui est assez difficile dans le cas d’un post de Blog, vous en conviendrez… On va donc commencer par s’intĂ©resser Ă la partir JSP de notre portlet. Pour cela, il convient de remplacer le contenu de view.jsp par le code suivant :
<%@ page import="com.liferay.portlet.documentlibrary.model.DLFolderConstants" %>
<%@ page import="com.liferay.portal.kernel.util.WebKeys" %>
<%@ page import="com.liferay.portal.theme.ThemeDisplay" %>
<%@ page import="com.liferay.portal.security.auth.AuthTokenUtil" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib prefix="liferay-portlet" uri="http://liferay.com/tld/portlet" %>
<portlet:defineObjects />
<%
String auth= AuthTokenUtil.getToken(request);
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
long defaultRepoId = DLFolderConstants.getDataRepositoryId(themeDisplay.getScopeGroupId(), DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
%>
<script language="javascript">
var repoId = <%=defaultRepoId%>;
</script>
<script type="text/x-handlebars">
<div id="selector">
<div id="file-entries-frm">
<b>Select File Directory: </b>
{{view Ember.Select
contentBinding="App.fileDirectoriesSelector.content"
optionLabelPath="content.folderName"
optionValuePath="content.id"
valueBinding="App.fileDirectoriesSelector.selectedFolderId"
prompt="Select a folder :"
}}
</div>
</div>
<hr/>
<div id="filelist">
{{view App.FileListView}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="filelist">
<div id="file-entries-content">
<div id="file-entries">
<ul>
{{#each App.fileEntriesController}}
<li>
<span>{{size}} octets</span>
<h3>{{name}}-{{title}}</h3>
<p>{{description}}</p>
</li>
{{/each}}
</ul>
</div>
</div>
</script>
Ăvidemment, ce code, mĂȘme assez concis mĂ©rite quelques explications. Explorons le ligne par ligne :
Comme dĂ©jĂ prĂ©cisĂ© plus haut, le seul fichier JSP est largement insuffisant pour comprendre la mĂ©canique Ember, l’essentiel de l’application Ă©tant dans le fichier javascript. Pour cela, on va modifier le fichier main.js pour qu’il contienne le code suivant :
/**************************
* Application
**************************/
var App;
App = Ember.Application.create({
rootElement: $('section#portlet_emberportlet_WAR_emberportlet'),
LOG_TRANSITIONS: true
});
/**************************
* Models
**************************/
App.FileEntry = Em.Object.extend({
companyId: null,
createDate: null,
custom1ImageId: null,
custom2ImageId: null,
description: null,
extension: null,
extraSettings: null,
fileEntryId: null,
fileEntryTypeId: null,
folderId: null,
groupId: null,
largeImageId: null,
mimeType: null,
modifiedDate: null,
name: null,
readCount: null,
repositoryId: null,
size: null,
smallImageId: null,
title: null,
userId: null,
userName: null,
uuid: null,
version: null,
versionUserId: null,
versionUserName: null
});
/**************************
* Views
**************************/
App.FileListView = Ember.View.extend({
templateName: 'filelist',
classNames: ['filelist']
});
App.FileDirectoriesSelector = Ember.Object.extend({
selectedFolderName: "",
selectedFolderId: -1,
selectedFolderIdChanged: function(){
App.fileEntriesController.loadFileEntriesBySelect();}.observes('selectedFolderId')
});
App.fileDirectoriesSelector = App.FileDirectoriesSelector.create({
content: getFolders()
});
function getFolders() {
var url = 'http://localhost:8080/api/secure/jsonws/dlapp/get-folders/repository-id/%@/parent-folder-id/0?p_auth=%@'.fmt(repoId,Liferay.authToken);
// Push Default folder by default
folders = Ember.ArrayProxy.create({content:[Ember.Object.create({folderName: "Root Folder", id: 0})]});
$.getJSON(url,function(data){
$(data).each(function(index,value){
folders.addObject(Ember.Object.create({folderName: value.name, id: value.folderId}));
})
});
return folders;
}
/**************************
* Controllers
**************************/
App.fileEntriesController = Em.ArrayController.create({
content: [],
loadFileEntriesBySelect: function() {
var me = this;
if (App.fileDirectoriesSelector.selectedFolderId != null) {
var url = 'http://localhost:8080/api/secure/jsonws/dlapp/get-file-entries?repositoryId=%@'.fmt(repoId);
url += '&folderId=%@&p_auth=%@'.fmt(App.fileDirectoriesSelector.selectedFolderId, Liferay.authToken);
$.getJSON(url,function(data){
me.set('content', []);
$(data).each(function(index,value){
var t = App.FileEntry.create({
description: value.description,
extension: value.extension,
largeImageId: value.largeImageId,
mimeType: value.mimeType,
modifiedDate: value.modifiedDate,
name: value.name,
readCount: value.readCount,
size: value.size,
smallImageId: value.smallImageId,
title: value.title,
userId: value.userId,
userName: value.userName
});
me.pushObject(t);
})
});
}
}
});
Voici quelques explications concernant le contenu du fichier javascript :
En synthÚse, selectedFolderId est directement lié à la valeur du sélecteur HTML et toute modification de sa valeur provoquera un appel à la fonction liée à la propriété selecteFolderIdChanged. Elégant, non ?
Pour teminer et uniquement pour des aspects purement esthétiques, on va utiliser le fichier main.css suivant, qui va décorer les boites correspondant à chacun des fichiers trouvés :
#p_p_id_emberportlet_WAR_emberportlet_ {
font-family: 'tahoma', sans-serif;
background: #eeeeee;
}
#file-entries-frm {
margin: 0 auto 15px auto;
text-align: center;
}
#file-entries-content {
border: 1px solid blue;
margin: 0 auto;
}
#file-entries ul {
padding: 0;
border: 1px solid #999999;
}
#file-entries ul li {
text-align: left;
margin: 0;
padding: 10px;
list-style: none;
border-bottom: 1px solid #999999;
min-height: 50px;
background: #eeeeee; /* Old browsers */
background: -moz-linear-gradient(top, #eeeeee 0%, #dddddd 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eeeeee), color-stop(100%,#dddddd)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* IE10+ */
background: linear-gradient(top, #eeeeee 0%,#dddddd 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#dddddd',GradientType=0 ); /* IE6-9 */
}
#file-entries ul li:hover {
background: #cfe7fa; /* Old browsers */
background: -moz-linear-gradient(top, #cfe7fa 0%, #6393c1 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#cfe7fa), color-stop(100%,#6393c1)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* IE10+ */
background: linear-gradient(top, #cfe7fa 0%,#6393c1 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cfe7fa', endColorstr='#6393c1',GradientType=0 ); /* IE6-9 */
}
#file-entries ul li span {
float: right;
font-size: 8pt;
color: #888888;
}
#file-entries ul li img {
float: left;
margin: 0 10px 0 0;
width: 48px;
height: 48px;
}
#file-entries ul li h3 {
font-size: 11pt;
margin: 0;
}
#file-entries ul li p {
margin: 0;
font-size: 10pt;
}
Lancement de la compilation et du déploiement
Reste maintenant à compiler et déployer le tout, par une commande du type :
mvn -Pemberlf package liferay:deploy
ATTENTION, la portlet est relativement simpliste et ne fonctionne que pour un utilisateur logguĂ©. Donc, placez la sur une page secondaire et identifiez-vous avant d’y accĂ©der.
Pour que la dĂ©monstration soit pertinente, il faut Ă©galement que la bibliothĂšque contiennent des rĂ©pertoires et des documents, histoire d’avoir des choses Ă afficher !
Vous devez dorénavant obtenir une portlet du type :

Pour information, voici la vue Back-office standard de Liferay sur ma bibliothĂšque de document, pour le mĂȘme rĂ©pertoire :

En moins de 200 lignes de code et avec une lisibilitĂ© trĂšs correct, on arrive donc Ă mettre en place un fonctionnement AJAX Ă©voluĂ© sans gros effort. C’est beau le Javascript, non ?
Le printemps des conférences informatiques parisiennes se poursuit, aprÚs Devoxx puis le Scrum Day place aux DevopsDays qui ont eu lieu le 18 et le 19 avril dernier.
Le format de ces journées est assez atypique car elles sont découpées en deux parties distinctes :
Des conférences le matin concernant la culture devops
Des âopen spacesâ lâaprĂšs-midi afin de favoriser les Ă©changes entre les participants.
Différents types de profils étaient présents : les 100% ops qui cherchent à en savoir plus sur le monde du dev, les devops (50% dev, 50% ops) qui viennent parfaire leurs connaissances et trouver de nouvelles idées, les 100% devs qui cherchent quant à eux, à en savoir plus sur le monde des ops (je me range dans cette catégorie). Vous verrez, en lisant la suite, que le contenu de ces deux jours comblera les attentes des différents profils.
Â
Les confĂ©rencesÂ
1Úre présentation : CustomerOps ou le devops appliqué au service client.
Cette premiĂšre prĂ©sentation nous explique comment la culture devops permet dâamĂ©liorer le service client et la qualitĂ© de support chez Datadog. Leur dĂ©finition du devops tient en 4 Ă©lĂ©ments :
Culture – Tous les dĂ©veloppeurs se succĂšdent sur les tĂąches de support client afin de parfaire leur connaissance du produit.
Automatisation – Automatiser un maximum de processus pour gagner et rĂ©activitĂ© et mĂȘme pouvoir ĂȘtre pro-actif. Automatiser Ă©galement les sources de retour dâutilisation de lâapplication (email, rĂ©seaux sociaux etc …)
Mesure – Utilisation de diffĂ©rentes mĂ©triques afin de mesurer tout ce qui se passe sur le produit.
Partage – Exposer ces mĂ©triques
2Úme présentation : Améliorer ses développements grùce aux devops
https://speakerdeck.com/skade/how-devops-improved-my-dev
Ici le speaker nous explique avec un cas concret comment la culture devops lui a permis dâamĂ©liorer la qualitĂ© et lâorganisation de ses dĂ©veloppements.
Grùce à la communication avec les ops il a pu rendre son application plus maintenable et plus facilement déployable en production.
Il a ensuite insistĂ© sur le besoin dâavoir des mĂ©triques et du log dans chacune des applications que lâon dĂ©veloppe afin dâavoir un maximum de retour sur son utilisation.
Le dernier point important Ă ses yeux est la polyvalence des dĂ©veloppeurs; ils doivent pouvoir passer facilement dâun rĂŽle de dev front Ă personne en charge du dĂ©ploiement de lâapplication.
Â
3Úme présentation : Projet ou produit ?
https://speakerdeck.com/elpicador/how-products-can-improve-projects
Cette prĂ©sentation nous montre tout dâabord les diffĂ©rences entre un produit (totalement orientĂ© client) et un projet plus gĂ©rĂ© en fonction de son coĂ»t et des dĂ©lais impartis.
Ensuite le speaker nous prĂ©sente quels sont Ă ses yeux les clĂ©s du succĂšs dâun produit :
Construire rapidement un MVP : Minimum Viable Product
Mesurer en ayant des feedbacks réguliers sur son produit
Apprendre de ses erreurs afin de construire un produit meilleur
Ces Ă©lĂ©ments ne sont pas valables seulement pour un produit mais aussi pour un projet : âThink product, do projectâ
Â
4Úme présentation : Transformer des devs en devops
Fabrice Bernhard nous présente les éléments mis en place chez Theodo pour former ses développeurs junior à la culture devops.
La clĂ© est dâintĂ©resser ces nouveaux dĂ©veloppeurs aux problĂ©matiques des ops en les confrontant Ă la production et en organisant du âpair devopsingâ lors des phases de dĂ©veloppement et de dĂ©ploiement de lâapplication. Il faut ensuite les sensibiliser Ă lâutilisation des bons outils (mise en place de bacs Ă sable pour effectuer des tests) et aux problĂ©matiques de performances.
Cependant cela ne fait pas tout et un bon dev ne devient pas devops grĂące Ă des outils. LâexpĂ©rience et la responsabilitĂ© de la plateforme sont des bons leviers pour devenir devops.
Â
5Úme présentation : How we release software for gov.uk
Retour dâexpĂ©rience sur  la âsuccess storyâ anglaise du moment : la refonte du site du gouvernement.
Tout part dâun rapport intitulĂ© âRevolution not evolutionâ qui prĂ©conise de crĂ©er un centre dâexcellence pour rationaliser les services existants puis mettre en place les nouveaux services numĂ©riques du gouvernement. Sâen suit une une accĂ©lĂ©ration des cycles de livraison (4h pour envoyer un dĂ©veloppement en production, 20 dĂ©ploiements par jour),  une simplification des interfaces, une plus grande transparence (publication sur GitHub, ouverture des API), une refonte graphique (titre de âDesign of the year 2013â). Leur mot dâordre pour dĂ©velopper ce site est âdigital services so good that people prefer to use themâ.
Le site est effectivement, clair, pratique et utilisable depuis dâautres applications car toutes les donnĂ©es sont accessibles via une API ou en JSON. Exemple de question simple dâutilisation : Quand sâeffectue le prochain changement dâheure ? https://www.gov.uk/when-do-the-clocks-change ou https://www.gov.uk/when-do-the-clocks-change.json
Toujours dans un esprit de transparence et de partage leur façon de travailler est expliquĂ©e sur ce mĂȘme site : https://www.gov.uk/service-manual
Â
6Úme présentation : Map & Territory: A story of visibility
Cette prĂ©sentation part du principe quâune fois un produit ou projet en production on passe la majeure partie de son temps Ă effectuer des corrections. Si lâon veut rĂ©duire ces temps de corrections on a besoin dâextraire des informations qui ont un sens depuis des sources de donnĂ©es hĂ©tĂ©rogĂšnes (logs, base de donnĂ©es, …). Ces informations nous permettront de mieux comprendre lâutilisation faite du produit.
Avant de les extraire il faut définir des métriques clés qui indiqueront quels sont les éléments à surveiller aussi bien techniques que métiers.
Le speaker explique ensuite lâapproche âevent streamâ : âPlenty of small producers, few big consumersâ. Tout ce qui bouge doit ĂȘtre loggĂ© pour ĂȘtre ensuite agrĂ©gĂ© puis corrĂ©lĂ© avec les autres mĂ©triques. Suite Ă cela, une dĂ©cision peut ĂȘtre prise sur le plan dâaction Ă mener pour corriger ou enrichir une fonctionnalitĂ©.
Lâensemble de ces mĂ©triques forme donc une carte de lâapplication qui nous permet de surveiller le territoire (application).
Â
7Ăšme prĂ©sentation : Les 10 piĂšges Ă Ă©viter lors dâune transition devops
Dans cette prĂ©sentation les speakers nous indiquent les piĂšges dans lesquels il ne faut pas tomber lors de la mise en place dâune approche devops dans un projet.
Ces quelques conseils rĂ©sument bien lâensemble de ces deux jours :
Devops ce nâest pas que de lâoutillage mais un ensemble outil + processus + culture
Il ne faut pas penser quâau dĂ©ploiement de lâapplication mais plutĂŽt Ă la vie de lâapplication dans son ensemble.
Il ne suffit pas de dĂ©signer des Ă©quipes devops, la transition doit ĂȘtre faite par les Ă©quipes elles mĂȘme. Lâutilisation dâun coach Devops peut ĂȘtre nĂ©cessaire pour les aider.
Les aspects culturels ne sont pas Ă nĂ©gliger et certains Ă©lĂ©ments de la transition agile peuvent ĂȘtre utilisĂ©s :
Amélioration continue
Collaboration entre les équipes
Transparence
Il faut mesurer un maximum de choses afin dâĂ©valuer les progrĂšs effectuĂ©s
Ne pas oublier lâamĂ©lioration continue
Suite aux conférences quelques Ignite Talks (présentations de 5 min chronométrées) ont eu lieu. Dur de creuser un sujet en ce court laps de temps mais quelques slides sympas :
Si Devops avait été inventé par Coca-Cola : http://www.slideshare.net/devopsdays/what-if-devops-was-invented-by-coca-cola
Tests de performance en continue : http://devopsdays.org/events/2013-paris/proposals/PerformancesPerpetuellesIgnite/
Â
Les openspaces sont des espaces de discussion libres oĂč les rĂšgles suivantes sâappliquent :
Les personnes qui se présentent, sont les bonnes.
Ce qui arrive, est la seule chose qui pouvait arriver.
Ăa commence quand ça commence.
Quand câest fini, câest fini.
Les thĂšmes des diffĂ©rents openspaces sont proposĂ©s au prĂ©alable par les personnes prĂ©sentes aux DevopsDays, puis chacun sâinscrit aux discussions de son choix. Les participants aux openspaces ne sont pas obligĂ©s de rester tout le long de la discussion et sont mĂȘme invitĂ©s Ă aller de salle en salle pour assister Ă diffĂ©rentes discussions.
Ce format est assez intĂ©ressant car il permet de recueillir et dâĂ©changer rapidement et facilement des idĂ©es assez variĂ©es sur un mĂȘme sujet. Cependant les discussions Ă©taient parfois dĂ©cousues ou sâĂ©loignaient assez rapidement du sujet de base. Dur pour un pur dev de rentrer dans certaines discussions mais nĂ©anmoins quelques discussions intĂ©ressantes oĂč lâon sentait que les ops veulent mieux comprendre le monde des devs afin dâamĂ©liorer la qualitĂ© de leur travail et inversement.
Â
ConclusionCes deux jours ont Ă©tĂ© trĂšs intĂ©ressants et plutĂŽt surprenants. Je mâĂ©tais prĂ©parĂ© (man page sur les genoux) Ă assister Ă des confĂ©rences trĂšs techniques qui parleraient de virtualisation, de configuration rĂ©seaux, de scripts de dĂ©ploiement, etc … Pas du tout, les confĂ©rences Ă©taient parfaitement accessibles et trĂšs orientĂ©es cycle de vie du projet.
LâĂ©lĂ©ment le plus souvent citĂ© est le fait de mesurer un maximum de choses sur une application. De ces mesures dĂ©couleront un meilleur retour sur lâutilisation et une meilleure rĂ©activitĂ© des Ă©quipes en charge de la maintenance du produit.
Dâautres Ă©lĂ©ments prĂ©sentĂ©s rejoignent aussi des arguments dĂ©jĂ entendus dans des confĂ©rences agiles : amĂ©liorer la communication entre les Ă©quipes, rĂ©duire les silos, apprendre en continue de ses erreurs, chercher Ă sâamĂ©liorer, partager ses connaissances, âŠ
Suite Ă ce printemps de lâinformatique, on se rapproche donc tout doucement de la recette magique pour dĂ©velopper rapidement une application de qualitĂ© : des Ă©quipes impliquĂ©es, une grande dose de communication, une cuillĂšre dâagilitĂ© le tout agrĂ©mentĂ© de mĂ©triques permettant dâavoir un retour constant.
Â
En bonus quelques bons mots des devopsdays :
âI donât want to be woken up at night, so I call myself a developperâ, Florian Gilcher
âSpeed is important but momentum is everythingâ, Kushal Pisavadia
âItâs not the big that eat the small, itâs the fast that eat the slowâ, Fabrice Bernhard
âThink product, do projectâ, RĂ©my-Christophe Schermesser
Au pays des frameworks JavaScript MVC, AngularJS est une valeur montante. En rutpture avec les autres frameworks MVC, Anugular est fondé sur une approche déclarative et la mise en oeuvre de composants pour concevoir les IHM web. Il adapte et étend le HTML traditionnel pour servir le contenu dynamique via un mécanisme de data-binding permettant la synchronisation automatique des modÚles et des vues. Bref, AngularJS réduit considérablement le besoin de manipuler le DOM HTML et produit du code plus concis et facile à tester.
Lors de cet Ippevent, nous n’aurons pas 1 mais 3 speakers :
Une fois nâest pas coutume, il ne sâagit ni dâun post technique ni dâune annonce concernant les Ippevents, mais ayant publiĂ© une quarantaine dâarticles sur ce blog depuis 2009 je me suis permis de lâutiliser pour vous dire au revoir.
Le 27 mai prochain je quitterai le monde de l’ESN (avant on disait SSII mais ça, c’Ă©tait avant) pour commencer une nouvelle aventure en tant que âSenior Software Engineerâ chez Red Hat. Conscient de ce que je dois Ă Ippon, je souhaitais revenir sur mon parcours et donner une idĂ©e de comment une carriĂšre peut se dĂ©rouler au sein de la sociĂ©tĂ©.
Je suis arrivĂ© chez Ippon en Septembre 2009 avec le rĂŽle de âManager Technique en charge de la capitalisation des savoirs faireâ. En plus dâun poste de consultant classique je disposais dâun mi-temps pour recenser lâexpertise au sein de la sociĂ©tĂ© et communiquer sur cette expertise pour la faire connaĂźtre Ă lâextĂ©rieur et contribuer au rayonnement de lâentreprise. Deux rĂŽles pour le mĂȘme poste, en somme.
Dans mon premier rĂŽle de consultant au sein du pĂŽle conseil, jâai Ă©tĂ© servi : prĂšs de 20 missions en 3 ans et demi comportant des prestations critiques (audit technique ou dâarchitecture) ou dĂ©cisives (conseil au choix dâoutils ou de frameworks). Il sâest donc agit en majoritĂ© de conseil Ă haute valeur ajoutĂ©e des missions courtes aux enjeux importants : ouverture de compte, dĂ©cisions engageantes.
Dans mon deuxiĂšme rĂŽle, Ippon mâa laissĂ© carte blanche, me permettant dâexpĂ©rimenter un certain nombre de choses. Pour mener Ă bien cette tĂąche de capitalisation jâai repris en main le blog (en incitant et aidant mes collĂšgues Ă contribuer), créé et animĂ© les comptes Twitter et Facebook de la sociĂ©tĂ© et testĂ© des approches diffĂ©rentes pour le recrutement des nouveaux collaborateurs.
LâannĂ©e 2011 a Ă©tĂ© celle de la crĂ©ation des Ippevents qui rencontrent toujours un beau succĂšs (et qui permettent Ă des consultants Ippon de faire leur premiĂšres armes de confĂ©rencier) et en 2012 mes premier pas de speaker dans les Jugs puis Ă Devoxx.
Câest grĂące Ă Ippon, que je me suis rendu Ă Devoxx en novembre 2010 et que jâai rencontrĂ© mes premiers contacts chez Red Hat. Soucieux de rester crĂ©dible dans mes missions de conseil, je cherchais un moyen de garder le contact avec le dĂ©veloppement (tĂąche difficile quand on effectue des missions courtes sur des aspects conseils) et la contribution open source mâest apparue comme la meilleure solution pour ne pas me rouiller sur le dĂ©veloppement. Câest ainsi quâavec le soutien dâIppon je commençais Ă travailler sur le projet Seam Social devenu Agorava depuis, et participer au JCP sur CDI 1.1 et une tentative de JSR avortĂ©e avec Java Social (JSR 357)
Alors pourquoi partir ?Tout cela aurait pu durer encore longtemps si je nâavais pas eu cette opportunitĂ© qui fait partie des quelques rares susceptibles de me faire quitter Ippon. En fait, câest plus le monde du service (dans lequel jâĂ©volue depuis 17 ans) que je quitte, quâIppon Technologies pour aller donner dans le dĂ©veloppement open source professionnel.
Et une chose est sĂ»re, sans Ippon je nâaurai certainement pas pu accĂ©der Ă cette nouvelle carriĂšre. Les nombreuses missions internes et externes mâont permis dâapprendre plein de choses et de nouer les contacts qui me permettent aujourdâhui de tourner cette page. Jâai clairement bĂ©nĂ©ficiĂ© de lâexcellence dâIppon pour dĂ©crocher ce job.
Je mâen vais donc vers de nouvelles aventures en laissant un poste vacant au sein dâIppon Technologies. Ce poste de manager en charge de la capitalisation des savoir faire possĂšde suffisamment de facettes pour que chacun sây retrouve. Il comporte quelques figures imposĂ©es pas forcĂ©ment dĂ©sagrĂ©ables (blog, organisation des Ippevents) et pas mal de figures libres (contribution Ă des projets Open Sources, relation avec la communautĂ©, organisation dâateliers internes, etc…) et un mi-temps pour le faire. Si tout ça vous tente (et jâespĂšre vous avoir donnĂ© envie) contactez Julien Dubois (jdubois {at} ippon.fr) notre directeur du pĂŽle conseil.
Pour ma part, je dis âau revoir Ippon et merci !â