Skip to content

Blogs de Développeurs: Aggrégateur de Blogs d'Informatique sur .NET, Java, PHP, Ruby, Agile, Gestion de Projet

Forum Logiciel

Forum Logiciel : diffusion de connaissance et d’informations sur toutes les activités liées au développement d’applications informatiques en entreprise.

Agrégateur de flux

[ #Yammer ] From Mailbox to Yammer and back / De votre messagerie vers Yammer et retour !

Le blog de Patrick Guimonet - lun, 09/15/2014 - 10:31
    I notice everyday that email options in Yammer are not well known or used. Here is a quick summary. Je note chaque jour que les options de messagerie associées à Yammer ne sont pas bien connues, ni utilisée...
Catégories: Blog Individuel

Xebia participe Ă  la NSSpain 2014

nsspain

Cette annĂ©e, Xebia participe Ă  la NSSpain 2014 avec un talk sur les mĂ©triques de code. Ce sera l’occasion de prĂ©senter nos approches de qualitĂ© des dĂ©veloppements et d’Ă©changer avec de nombreux experts internationaux.

La NSSpain 2014, une confĂ©rence technique dĂ©diĂ©e au monde du dĂ©veloppement iOS et OS X, se tiendra comme l’annĂ©e dernière Ă  Logroño, dans la rĂ©gion de La Rioja en Espagne.

Cette Ă©dition aura lieu les 16, 17 et 18 septembre et aura parmi ses speakers Mike Ash, John Reid,  Matt Galloway, David Rönnqvist et beaucoup d’autres.

Xebia y participera avec un talk le vendredi 18 septembre. Le slot intitulĂ© "Be the quality you want to see: Code Quality Metrics" illustrera les techniques et les outils pour gĂ©nĂ©rer et analyser les mĂ©triques de qualitĂ© d’une base de code.

Si vous y participez en tant que spectateur, n’hĂ©sitez pas Ă  venir nous rencontrer sur place pour Ă©changer sur nos approches de dĂ©veloppement.

Catégories: Blog Société

La notion de don / contre-don à l’épreuve des startups

ekito people - dim, 09/14/2014 - 23:30

Depuis quelques annĂ©es, les articles de presse spĂ©cialisĂ©s, blogs et autres lieux d’expression des acteurs de l’entrepreneuriat et des startup faisant rĂ©fĂ©rence Ă  la sociologie maussienne font florès. Outre la tentation de « vernir »  son propos d’un label savant, la pertinence de cette rĂ©fĂ©rence semble faire sens pour beaucoup de commentateurs.

 

Donner-recevoir-rendre

En 1923-1924 dans l’AnnĂ©e Sociologique, l’anthropologue Marcel Mauss publie son « Essai sur le don . Forme et raison de l’Ă©change dans les sociĂ©tĂ©s archaĂŻques. » Comment ce texte ancien est-il aujourd’hui considĂ©rĂ© comme un cadre thĂ©orique pertinent de l’entrepreneuriat et tout particulier de l’Ă©cosystème startup ?

marcelmauss_2

A l’Ă©poque et Ă  l’aide d’exemples empruntĂ©s Ă  des sociĂ©tĂ©s diverses et mis en Ă©vidence par B. Malinovski dans son ouvrage « Les argonautes du Pacifique occidental » en 1922, l’auteur montre que le don est obligatoirement suivi d’un contre-don selon des codes prĂ©-Ă©tablis. Dons et contre-dons, articulĂ©s autour de la triple obligation de « donner-recevoir-rendre », crĂ©ent un Ă©tat de dĂ©pendance qui autorise la recrĂ©ation permanente du lien social.

Les trois actions : donner – recevoir – rendre, qui sont exercées en des lieux, des circonstances et des temps différents constituent au sein du marché, un système, par essence, jamais équilibré. Ce déséquilibre permanent représente le fondement même de l’échange social. Il place les acteurs dans une situation de réciprocité, d’endettement les uns vis-à-vis des autres. C’est le corps social dans son ensemble, par qui transite le don, qui est garant du fonctionnement du mécanisme.

   « Dans le don, il ne s’agit pas d’avoir pour avoir mais [...] d’avoir pour ĂŞtre »

Selon Marcel Mauss, le don est un phĂ©nomène commun Ă  toutes les sociĂ©tĂ©s humaines passĂ©es et prĂ©sentes. C’est une morale universelle et « Ă©ternelle » associĂ©e Ă  notre condition « d’animal politique ». Marcel Mauss fait une critique implicite des analyses classiques de l’Ă©conomie de marchĂ© et prend position pour ce type d’Ă©change naturel vers lequel, selon lui, nos sociĂ©tĂ©s tendraient Ă  revenir, contrairement aux idĂ©es dĂ©veloppĂ©es par l’Ă©conomie classique qui voient dans le troc la forme d’Ă©change naturelle, version simplifiĂ©e des Ă©changes marchands. « Le système que nous proposons d’appeler le système des prestations totales [...] constitue le plus ancien système d’Ă©conomie et de droit que nous puissions constater et con­ce­voir. Il forme le fond sur lequel s’est dĂ©tachĂ©e la morale du don-Ă©change. Or, il est exactement, toute proportion gardĂ©e, du mĂŞme type que celui vers lequel nous voudrions voir nos sociĂ©tĂ©s se diriger ».

Bien que participant du mĂŞme système de recherche d’intĂ©rĂŞt, le système du don/contre-don viserait prioritairement, non pas l’accumulation de richesse, mais prioritairement l’augmentation du prestige et de la renommĂ©e. « Dans le don, il ne s’agit pas d’avoir pour avoir mais [...] d’avoir pour ĂŞtre »

A la suite de Mauss de nombreuses Ă©tudes se sont penchĂ©es sur ces questions tentant de mettre en Ă©vidence que la logique du don se dĂ©marquerait radicalement de celle du marchĂ©. Parfois contestĂ©, ce “paradigme” fut structurant pour les Sciences Sociales jusqu’à aujourd’hui.

  Le don au cĹ“ur de l’Ă©cosystème startup

Quelles apports tirer pour l’entrepreneuriat modèle startup de ces thĂ©ories venues de l’anthropologie ? Il serait ainsi possible, dans le cadre d’un Ă©cosystème startup d’Ă©chapper, au moins partiellement, Ă  l’unicitĂ© du mode dĂ©veloppement entrepreneurial exclusivement financier. Lever des fonds ne serait pas alors suffisant et pourrait mĂŞme devenir un atout marginal, Ă  condition d’accumuler les Ă©changes et la rĂ©ciprocitĂ©  :

  1. La start-up vit dans un environnement social Ă  l’intĂ©rieur duquel elle doit, pour se dĂ©velopper, rechercher des synergies avec l’ensemble de ses partenaires. Or l’aide et l’entraide permettent une valorisation collective et personnelle, grâce Ă  l’image sociale très positive du “modèle” startup. Entreprendre dans cet Ă©cosystème serait pour les porteurs et ceux qui les aident (individus ou organisations), participer au « bien commun » de la crĂ©ation d’innovation, de valeurs et d’emploi et d’imagination du futur. En d’autres termes, la valorisation de entrepreneuriat innovant est en soi une rĂ©compense symbolique, non seulement pour les porteurs de projets, mais Ă©galement pour tout le système d’accompagnement qui en dĂ©coule.
  2. La dĂ©marche du partage dĂ©sintĂ©ressĂ© basĂ© sur la confiance est l’une de clĂ©s pour garantir sa survie et sa croissance ainsi qu’un système d’échange avec d’autres acteurs : programmes de coaching, partenariat actifs, participation des dirigeants Ă  des rĂ©seaux, accĂ©lĂ©rateurs, pĂ©pinières, associations de soutien, etc. La vox populi constate que les startup s’ouvrant Ă  leur environnement, pratiquant l’association dĂ©sintĂ©ressĂ©e et basant leurs relations sur la confiance, se dĂ©veloppent plus vite et deviennent naturellement plus rĂ©sistantes.

Entreprendre dans l’Ă©cosystème startup, finalement, pourrait ne pas ĂŞtre principalement et uniquement un projet Ă  vocation Ă©conomique mais l’accomplissement personnel et social des acteurs du système…

The post La notion de don / contre-don Ă  l’Ă©preuve des startups appeared first on ekito people.

Catégories: Blog Société

API RESTful, un retour d’expérience – Soirée Décalée au 24 Septembre

Alpes JUG - ven, 09/12/2014 - 15:48

Update : La soirée est décalée au 24 Septembre

De plus en plus de sites web fournissent à présent des APIs “REST” pour interagir avec leur données. Cependant, le fait de publier une API accessible via le web ne fait pas pour autant de celle-ci une API “RESTful” au sens précis du terme. Qu’est-ce donc qu’une API RESTful à proprement parler?

Nous essayerons d’apporter des éléments de réponse à cette question en décrivant tout d’abord les principes des architectures REST tels qu’ils ont été codifiés par Roy Fielding. Nous examinerons ensuite comment ces principes ont été mis en œuvre dans le cadre d’une implémentation d’une API RESTful permettant d’interagir avec une source de données JCR et nous considèrerons comment nous avons déviés aux principes et pour quelles raisons.

Infos et inscriptions : Inscriptions :https://plus.google.com/u/0/events/cbsfu2oi0fl4f2hbei29t7t403k Cette soirée se déroulera sur le campus à la Maison Jean Kuntzman le 24 Septembre à partir de 19h00.

Pour venir : Maison Jean Kuntzmann Université Joseph Fourier Grenoble 3 38400 Gières

Le conférencier :  Christophe Laprun est développeur chez Jahia

Slides

Les slides de la soirĂ©e : alpesjug – RESTful API

Catégories: Association

Ippevent MongoDB Ă  Bordeaux le 23 septembre avec Tugdual Grall

Blog d’Ippon Technologies - ven, 09/12/2014 - 15:08

MongoDB stocke les données dans des documents JSON. Les documents peuvent représenter des structures de données riches, tout en offrant une grande flexibilité. Nous avons donc de nombreuses alternatives pour stocker les données si on compare au modèle relationnel qui est lui très normalisé.

Durant cette présentation, en nous basant sur un site de e-commerce, nous verrons les différentes options de modélisation, les bénéfices et avantages des différentes approches. Nous verrons également comment travailler avec ces documents, et faire évoluer la structure de ces données.

Comme toutes nos soirées, les interactions avec le speaker sont clés, vous pourrez bien sûr poser de nombreuses questions!

Rendez-vous le Mardi 23 septembre, Ă  partir de 19h, Ă  l’EPSI Bordeaux qui a la gentillesse de nous accueillir sur son Campus.

Speaker : Tugdual Grall

Billetterie en ligne pour DROP YOUR TABLE ! MONGODB SCHEMA DESIGN réalisé par Eventbrite

Catégories: Blog Société

[ASP.NET] Katana


Les annonces récentes concernant ASP.NET vNext sont telles que nous savons maintenant que notre usage des technologies Web de Microsoft va prendre un nouvel essor et radicalement se redynamiser. Dans mon précédent billet, je suis revenu sur la spécification OWIN....
Catégories: Blog Société

Le TechTrends #4 dédié au mouvement Software Craftsmanship est enfin disponible !

techTrends-CraftsLe nouveau TechTrends by Xebia est arrivé ! Alors que le n°1 traitait du Big Data, le second du mouvement DevOps et le troisième de l’agilitĂ©, ce numĂ©ro 4 vous dĂ©voile toutes les tendances du mouvement Software Craftsmanship.

Le TechTrends est un document Ă  destination de toutes celles et ceux qui doivent opĂ©rer des choix structurants pour leur IT et souhaitent bĂ©nĂ©ficier du retour d’expĂ©rience terrain de ceux qui ont dĂ©jĂ  expĂ©rimentĂ© les technologies d’aujourd’hui et de demain. Ce n°4 vous permettra d’apprĂ©hender ce mouvement, prĂ´nant la qualitĂ©, et ses bonnes pratiques.

Vous y trouverez notamment des conseils sur :

  • la dĂ©finition d’un logiciel de qualitĂ©,
  • la constitution de vos Ă©quipes Crafts,
  • le choix des outils pour un dĂ©veloppement logiciel de qualitĂ©,
  • l’adoption des techniques Crafts,
  • la mise en place de bonnes pratiques afin que votre Ă©quipe continue de monter en compĂ©tences.

Toutes ces étapes sont indispensables pour intégrer le mouvement Craftsmanship au sein de votre process de développement. Nous espérons que ce TechTrends vous guidera dans les décisions importantes que vous aurez à prendre.

En complément, si vous souhaitez approfondir dès-à-présent vos connaissances sur le mouvement Craftsmanship, et en pratique, nous vous invitons à participer à notre Craft Day, le 30 septembre prochain.

Très bonne lecture à tous !

Catégories: Blog Société

Il est temps d’avoir déjà quitté jQuery

Mathieu Robin - jeu, 09/11/2014 - 15:44

Je rĂ©agis Ă  un article que @_kud a relayĂ© sur Twitter. L’article « Time to remove jQuery » a Ă©tĂ© Ă©crit par Rogchap fin aĂ´ut.

Dans cet article, Rogchap explique son souhait de quitter jQuery après l’avoir utilisĂ©, beaucoup, presque Ă  outrance, comme beaucoup d’entre nous. Maintenant il utilisĂ© des micro-librairies pour remplacer jQuery dans les usages que requièrent ses projets.

Je souhaitais rĂ©agir Ă  son article plus loin que par un simple commentaire. Aussi parce que pendant longtemps comme vous le savez, j’ai tenu sur ce blog, une chronique jQuery et de nombreux articles autour de jQuery.

Cet article me sert d’amorce au mien. Sur une sorte de ras le bol de cette mode de dĂ©foncer jQuery Ă  la première occasion venue sur des arguments parfois quasi foireux. Parfois justifiĂ©s aussi.

Un peu d’histoire

jQuery a Ă©tĂ© crĂ©Ă© par John Resig en janvier 2006. BientĂ´t 9 ans ! A l’Ă©poque, on avait dĂ©jĂ  des super stars comme Prototype (et son indissociable Scriptaculous) ou encore Yahoo UI, plus connue sous le nom de YUI. Autre star connue du milieu, citons Mootools. Vous aussi vous ressentez un peu de nostalgie pour cette Ă©poque ?
Sortons de l’histoire cul-cul pour nous pencher sur la rĂ©alitĂ© de l’Ă©poque. IE 6 Ă©tait ultra-dominant. IE 7 ne devait apparaĂ®tre qu’Ă  la fin de 2006. Firefox Ă©tait encore un logiciel pour geeks, la version 1 datant de fin 2004. Netscape Ă©tait plus que sur le dĂ©clin. Safari, dispo que sur mac depuis 2003. Opera Ă©tait lĂ  depuis 1995, mais restait assez peu reprĂ©sentĂ© auprès du grand public. J’Ă©tais encore en primaire en 1995, waouh ! Enfin Chrome… n’existait pas.

Petite excentricitĂ©, pour ceux qui s’y sont essayĂ©, il y avait aussi encore Ă  l’Ă©poque IE 5. Et le bonus : il y avait IE 5 pour Mac (sorti en 2003). Maintenant et depuis longtemps abandonnĂ©, Internet Explorer avait sa version spĂ©ciale Apple. Et elle Ă©tait pire que la version Windows. Vraiment pire. Au point que « Ă§a » n’est mĂŞme pas arrivĂ© jusqu’Ă  la version 6. Usage plutĂ´t rare, mais ça m’est arrivĂ© de devoir le prendre en compte Ă  l’Ă©poque.

Depuis quelques annĂ©es, on Ă©tait dans un monde oĂą JavaScript n’Ă©tait qu’une machine Ă  gaz immonde. OĂą Flash dominait en maĂ®tre absolu du cross plateform, cross browser.

Firefox, l’IDE de IE

A l’Ă©poque, on codait en JS sur Firefox parce que c’Ă©tait plus facile, merci Firebug. Mais ça c’Ă©tait entre nous, geeks, devs, etc. Pour le grand public, fallait aussi et surtout que ça marche sur IE. C’Ă©tait ça le cross browser de l’Ă©poque. On s’inquiĂ©tait aussi de savoir si l’utilisateur n’avait pas bloquĂ© l’exĂ©cution de JavaScript. Voire parfois le CSS. Qui existait Ă  peine Ă  l’Ă©poque d’ailleurs. Et souffrait des mĂŞmes problèmes de portabilitĂ©. D’ailleurs, chose que je suis sĂ»r que vous avez oubliĂ© tellement vous avez utilisĂ© Firebug, comme moi hein, mais mĂŞme Firefox 3.5 n’avait pas l’objet console natif. Si si, rĂ©installez le et essayez sans Firebug. Fatal error :)

JavaScript servait Ă  faire neiger sur les Ă©crans ou afficher des popups publicitaires. Dans les grandes lignes. Au point que JavaScript existait sur l’essentiel des navigateurs, mais pas sur Internet Explorer oĂą certes c’Ă©tait Ă  peu de choses près pareil mais suffisamment diffĂ©rent pour que ça n’est pas le mĂŞme nom ni certaines fonctionnalitĂ©s clĂ©s.

ArrĂŞtons nous d’ailleurs pour rappeler aussi qu’Ă  l’Ă©poque, il y avait aussi les applets Java qui essayaient de concurrencer Flash. Et les activeX comme plugins Ă  IE. CĂ´tĂ© Firefox, on devait dĂ©velopper des extensions avec XUL. Un truc assez moisi mais en comparaison d’activeX…

Bon en fait ne mĂ©langeons pas les torchons et les serviettes. Petite anecdote rigolote. Sur IE quand il y avait un bug vous aviez une grosse fenĂŞtre d’alerte qui vous pĂ©tait au nez. Si vous aviez le malheur de cliquer sur le bouton de rĂ©solution, ça lançait l’Ă©diteur VBA intĂ©grĂ© dans Office. Je me souviens, c’Ă©tait assez drĂ´le de voir les gens arrivĂ©s en panique sur les forums croyant qu’ils avaient cassĂ© le code de la machine.

Puis est arrivĂ© AJAX. Alors lĂ , fĂŞte du slip. Je me souviens avoir dĂ©barquĂ© en salle de cours de BTS pour gueuler Ă  mes camarades qu’on pouvait enfin changer le contenu d’une page sans la recharger entièrement et sans utiliser Flash. On s’est tous prĂ©cipitĂ©s sur nos PCs. C’est une rĂ©volution !

Pour rappel, les outils de compilation pour JavaScript comme Uglify et mĂŞme les IDE spĂ©cialisĂ©s n’existaient pas. Le plus avancĂ© Ă©tait Dreamweaver et ça dĂ©connait de partout. Au point que tout le monde se rabattait sur Notepad++. Je vous parle mĂŞme pas de grunt, gulp, brunch, npm, bower, jslint, …

Retour à la réalité

Et lĂ  mange ta claque. Il fallait faire un objet, un script pour chaque navigateur. Et ça rien que pour Ajax. Pour faire une conne modif du DOM, aucune fonction n’Ă©tait commune non plus d’ailleurs. Ce que vous faites avec jQuery pour l’essentiel des usages. A l’Ă©poque, les bibliothèques comme jQuery, Prototype, ExtJS, YUI, Mootools, etc. Ă©taient plus que nĂ©cessaires. Elles Ă©taient vitales pour ne pas se coller une balle. On tenait le Saint-Graal en fait.

Pour des raisons que je ne saurais expliquer, seuls Mootools et jQuery ont vraiment rĂ©ussi Ă  dĂ©coller et Ă  suivre l’Ă©volution. Concernant jQuery, j’ai tendance Ă  croire que le « jQuery-style » a dĂ» bien aidĂ©. Il y a aussi Sencha qui avait un large public mais dès le dĂ©but, ils allaient vraiment plus loin que ceux prĂ©cĂ©demment citĂ©s. Ils existent toujours mais parce qu’ils ont appliquĂ© une approche propriĂ©taire. Pourquoi pas.

A l’origine donc, jQuery & co rĂ©pondait Ă  une vraie problĂ©matique. Celle d’ĂŞtre un polyfill.

Il n’y avait pas encore jQuery UI ou jQuery Mobile. Ni mĂŞme les blockbusters animation, browser, … Un monolithe.

Puis est revenue plusieurs fois la question du poids de jQuery. De ses plugins. Ça pesait lourd. Et cĂ´tĂ© rĂ©fĂ©rencement c’Ă©tait pas top. Surtout que Chrome Ă©tait arrivĂ© sur le marchĂ©.

Rappelez vous l’arrivĂ©e de Chrome

C’Ă©tait fou. On Ă©tait vers septembre 2008. Une interface Ă©purĂ©e, allĂ©gĂ©e, une vitesse d’exĂ©cution annoncĂ©e et ressentie 8 fois supĂ©rieure. Et la cerise sur le gâteau, des extensions en HTML/CSS/JavaScript qui s’installaient sans avoir besoin de redĂ©marrer le navigateur.

Et comme un collègue qui ne mange pas son spéculoos avec son café, côté JS, ce qui marchait sous Firefox marchait sous Chrome. Et inversement. Encore une révolution!

Donc avec IE 6/7 qui perdaient des parts de marchĂ© face Ă  des Chrome et Firefox dĂ©chaĂ®nĂ©s pour nous offrir une expĂ©rience toujours plus rapide et dĂ©boguĂ©e, on pouvait enfin s’atteler Ă  faire du web. Le web moderne.

Ce n’est pas IE 8, arrivĂ© en mars 2009 qui changera la donne. Souvenez vous, il y a mĂŞme un petit bouton pour fonctionner en mode compatibilitĂ© avec IE 7. Preuve de l’Ă©chec de Microsoft Ă  faire Ă©voluer les mentalitĂ©s de ces utilisateurs. Mais preuve aussi de la prise de conscience Ă  l’Ă©poque qu’ils avaient un sĂ©rieux problème avec leurs vieux navigateurs.

De nouvelles priorités

On a commencĂ© Ă  se lâcher avec jQuery et Mootools, et leurs armĂ©es de plugins. Les compĂ©tences de ces frameworks ont littĂ©ralement explosĂ©es sous leurs poids. On en demandait toujours plus Ă  des outils qui n’Ă©taient pas conçus pour ça. On attendait des polyfills de structurer nos dĂ©veloppements, nos pratiques, nos applis web. C’Ă©tait comme construire des ponts toujours plus grands, toujours plus compliquĂ©s mais toujours avec les pierres ramassĂ©es sur la rive et disposĂ©es au petit bonheur la chance avec un peu de mortier.

Sont alors apparus des frameworks comme UI, jQuery.MVC ou encore un qui s’est bien dĂ©tachĂ© du lot : Knockout. ExtJS commençait mĂŞme enfin Ă  ĂŞtre vraiment utilisable. Les navigateurs rĂ©ussissant enfin Ă  le faire tourner sans ramer. Notons le choix pertinent Ă  l’Ă©poque de changer de nom pour Sencha, ils repartirent avec une nouvelle rĂ©putation bien propre.

2009, année prospère

Deux grands changements clés à mon sens en 2009.

L’arrivĂ©e de IE 9, c’est bĂŞte mais c’Ă©tait le premier navigateur potable de Microsoft. Enfin, on avait un truc qui arrĂŞtait de dĂ©conner toutes les deux heures, enfin l’outil de dĂ©bogue arrivĂ© avec IE 8 avait un panneau « Network ». Il Ă©tait enfin potable. Plus besoin d’utiliser Debug Bar.

Jeremy Ashkenas nous a offert cette annĂ©e lĂ , une des meilleures contributions au monde du dĂ©veloppement web : CoffeeScript. Qu’on aime ou qu’on n’aime pas (comme moi), on ne peut nier l’impact que CoffeeScript a eu sur le monde du JS.

L’expĂ©rience Backbone

On est en octobre 2010, on tourne depuis quelques annĂ©es maintenant avec des immondes entassements de couche de bibliothèques et dĂ©barque comme un pavĂ© dans la mare : BackboneJS. Un framework MVC correctement foutu. C’est la dĂ©ferlante des applis one-page accessible Ă  tous les devs. BasĂ© sur jQuery, il ne perturbe pas trop les dĂ©veloppeurs et a donc une courbe d’apprentissage abordable.

Un rappel que mĂŞme si on avait l’impression de stagner dans un monde encore franchement hĂ©sitant Ă  reconnaĂ®tre JS comme un vrai langage, oui, c’est un langage, Ă  nous de le faire grandir, nous la communautĂ© de tous les dĂ©veloppeurs web.

Et si on pétait jQuery [n'importe comment] ?

Qu’est-ce que j’ai haĂŻ la pĂ©riode qui se profilait alors. On entendait partout : « jQuery est trop gros, du coup, j’ai construit ma propre version allĂ©gĂ©e ». Et lĂ  bim, bim, bim, toutes les semaines une nouvelle rĂ©interprĂ©tation pourrie allĂ©gĂ©e de jQuery faisait son apparition. Toutes abandonnĂ©es au bout de quelques mois de maintenance. Seule jQLite a survĂ©cu, mais elle a eu un sponsor de taille. On en parlera plus loin.

Fut alors prise la dĂ©cision en interne de dĂ©couper jQuery. Il y avait dĂ©jĂ  Sizzle arrivĂ© en janvier 2009 qui avait extrait le moteur de sĂ©lecteurs du cĹ“ur de jQuery. C’Ă©tait dĂ©jĂ  un beau geste. Mais ils ont Ă©taient plus loin. Dehors jQuery.animation, dehors jQuery.browser. On Ă©tait de mĂ©moire, fin 2012. Pas si vieux hein.

Entre deux, on avait dĂ©jĂ  eu l’avènement du mobile. Android, iPhone  bien implantĂ©s dans nos quotidiens et mĂŞme Windows Phone avait revu sa copie et proposait des tĂ©lĂ©phones potables.

Courant 2012, il y avait aussi eu 2 Ă©normes missiles arrivĂ©s sur la planète du web. J’ai nommĂ© Angular et Ember. On va Ă©viter de troller, chacun ses dĂ©fauts et qualitĂ©s. Le monde du web a changĂ© de face en quelques mois. Et les deux avaient pour dĂ©pendance jQuery. Mais une dĂ©pendance minimale, puisque jQuery Ă©tait revenu Ă  son rĂ´le de polyfill.

Enfin des outils

On a pu célébrer avec plaisir, une espèce de vague voir une interminable série de vagues qui ont retourné le web dans tous les sens. Entre les minifiers, les gestionnaires de paquets, les outils de qualité de code, les IDE dédiés et un énième pavé dans la mare : NodeJS, JavaScript est enfin reconnu comme un vrai langage industrialisable.

Maintenant on a du JS full stack cross-[ce que tu veux]

Vous vous rendez compte ?!

En quelques années, le web est devenu une espèce de force de frappe pour les entreprises, et la techno a su suivre la cadence malgré quelques à-coups façon vieux moteurs diesel au début.

Maintenant, entre IE 10 bien installé, IE 6/7 quasi disparus, IE 8 en bon déclin. Firefox et Chrome ont explosé leurs numéros de version et font toujours la course à la qualité et à la vitesse. Les mobiles sont aussi puissants que des pc. On peut faire du code serveur en JS, certains équipements embarqués parmi les plus célèbres comme Arduino ou Raspberry supportent très bien JS aussi.

En une dizaine d’annĂ©es JavaScript est passĂ© du truc infâme, in-dĂ©veloppable comme le fut Basic Ă  son Ă©poque avec tellement de versions qu’on ne pouvait plus les compter Ă  un unique langage respectĂ© Ă  peu de choses près correctement par tous les acteurs.

Je bâcle la fin de l’historique

C’est tellement rĂ©cent toute cette conclusion parce qu’on est encore en plein dedans que mĂŞme les plus jeunes d’entre nous la connaisse.

Et pourtant, jQuery ramasse encore

Et pourtant oui, pourtant, je vois encore des articles Ă  la con oĂą un mec vient se secouer l’ego très très fort pour dire « j’ai pas besoin de jQuery moi ». C’est bien mec. Mais c’est pas un exploit. Alors oui, jQuery est dĂ©passĂ©, mais un polyfill de IE 6/7/8 dans un monde oĂą ils ont presque disparu (j’insiste sur le presque, je le soutiens encore pour de vraies raisons), c’est sĂ»r que c’est pas très utile.

Certains diront « ouais mais jQuery ça fait plus qu’ĂŞtre un polyfill ». Oui, ça sert aussi Ă  manipuler plein de choses simplement. C’est bien, c’est super mĂŞme, ça me sert encore beaucoup d’ailleurs, mais yep, ça ne devrait plus.

« Ouais mais jQuery c’est lourd, tu te rends compte ça fait 35k ». Alors non quitte Ă  chipoter sur quelques Ko, ça fait 32k pour la version 1.11 et si tu ne supportes pas les vieux navigateurs, tu devrais dĂ©jĂ  ĂŞtre passĂ© Ă  la 2.1.x qui elle n’en fait que 28. Et sinon sĂ©rieusement ? MĂŞme avec la 3G, 32k, c’est ridicule. Oui, c’est ça de gagnĂ©. Mais ton favicon en fait presque une dizaine. Si si, prends par exemple celui de Github, site que tu trouves qu’il se charge plutĂ´t vite, mĂŞme sur ton mobile. Bah il fait dĂ©jĂ  9k.

C’est parce que beaucoup de dĂ©veloppeurs sont encore des brĂŞles, des dĂ©butants et font n’importe quoi que jQuery est encore d’actualitĂ©. C’est parce que tout le monde n’utilise pas des frameworks lourds pour faire des choses simples. Parce que des fois un wordpress n’a souvent pas besoin de plus que jQuery. Peut-ĂŞtre aussi parce que WordPress existe encore. Ou que tous les gens qui utilisent jQuery ne sont pas des dĂ©veloppeurs confirmĂ©s.

Il est vrai que jQuery n’est plus tout le temps nĂ©cessaire. Mais pourtant, ce n’est pas de sa faute. Alors avant d’allumer la tronche de jQuery, dĂ©veloppeur qui blogue en crachant dessus, rĂ©flĂ©chis d’oĂą vient le problème moderne, pourquoi jQuery est lĂ , pourquoi jQuery est parti en sucette sur la fin, enfin plutĂ´t pourquoi son usage est parti en sucette. Et si finalement, le problème, ce n’est pas plutĂ´t les personnes plus que jQuery.

Ce qu’a permis jQuery pendant de nombreuses annĂ©es

Manipulation du DOM facilitée

Manipulation de Ajax facilitée

Manipulation des promises entrées dans les moeurs

Base solide pour de vrais frameworks de développement web modernes

Et ceci de façon cross-browsers, cross-platform. Favorisant enfin la disparition de Flash.

Maintenant il y a HTML 5, les web components, de gros frameworks. Mettons jQuery au placard, voire au cimetière, mais avec un peu d’honnĂŞtetĂ©. Ne serait-ce qu’en lui disant merci.

Enfin en disant merci aux gens qui ont contribué à cet outil et aux outils concurrents pour nous avoir facilité la vie, notre travail pendant des années.

flattr this!

Catégories: Blog Individuel

Xebia lance sa newsletter : venez la découvrir !

Xebia-Newsletter

Pour suivre toute l’actualitĂ© de Xebia mais aussi de son Ă©cosystème, venez dĂ©couvrir et vous inscrire Ă  sa Newsletter. 

Toute nouvelle et toute belle pour la rentrĂ©e, la newsletter vous tiendra au courant des Ă©vĂ©nements, des news, des articles publiĂ©s de Xebia, autour d’un sujet clĂ© tel que le Big Data, le Cloud, les objets connectĂ©s et bien d’autres.

Envoyée tous les deuxièmes jeudis du mois, elle sera répartie en 5 catégories (toujours autour du sujet clé du mois) : 

  • une rubrique blog, avec un ou 2 articles publiĂ©s,
  • une rubrique Ă©vĂ©nement qui vous prĂ©sente le prochain techevent ou journĂ©e dĂ©diĂ©e de Xebia,
  • une rubrique actualitĂ© qui reprend l’info du mois de l’Ă©cosystème qu’il ne fallait pas manquer,
  • et pour encore plus d’information, le lien vers un livre blanc, un techtrends, un article… Bref un outil pour aller encore plus loin !

Vous voulez voir ce que cela donne ? Voici la Newsletter n°1 dédiée au mouvement Craftsmanship.

Pour vous inscrire, il vous suffit de cliquez sur l’icĂ´ne "S’inscrire Ă  la Newsletter" en haut de la page  !

Bonne lecture Ă  tous.

Catégories: Blog Société

[ #Office 365 ] New service settings panel / Nouveau panneau de paramétrage des services

Le blog de Patrick Guimonet - jeu, 09/11/2014 - 07:50
As you know Office 365 is changing very usually and almost every day you can discover new things ! Yesyerday, I discovered a new service settings view with cards, similar to what we can find on Delve (and ...
Catégories: Blog Individuel

Rails Ă  la sauce JavaScript

L'actualité de Synbioz - mer, 09/10/2014 - 23:00

Pour ce billet nous allons embarquer vers la découverte d’un framework que je voulais essayer depuis un moment : Sails.

C’est un jeune framework JavaScript construit sur Node.js (vous le connaissez sûrement: il permet de construire un serveur en JavaScript), et Express.js (un ensemble d’outils destiné au développement d’applications Node.js).

Premier constat, son nom ressemble énormément à celui de Rails, ce qui n’est pas étonnant puisqu’il s’en inspire sur pas mal de points. Ensuite, comme dit sur leur site, il émule le modèle MVC, et a été dessiné pour servir des API orientées données. Pratique pour le développement de SPA.

Pour commencer vous aurez besoin de Node.js et npm (le gestionnaire de paquet pour Node.js) d’installés sur votre machine pour pouvoir installer Sails. Si vous rencontrez des problèmes d’installation dû au fait que l’executable node n’est pas trouvé, c’est parce-qu’il a été renommé en nodejs dans les versions récentes mais que certains programmes utilisent toujours node. Dans ce cas installez le paquet nodejs-legacy qui crée un lien symbolique entre /usr/bin/node et /usr/bin/nodejs. Puis :

L’option -g sert à installer un paquet de manière globale sur votre machine, de telle sorte que la commande sails soit accessible partout, d’où la nécessité de l’exécuter en tant que root. Après un certains temps, nous pouvons créer notre première application :

Lire la suite...

Catégories: Blog Société

Cloud Platform Roadshow de Pivotal au zlocalhost, le 25 septembre

Zenika - mer, 09/10/2014 - 13:30

Zenika a le plaisir d’héberger le Cloud Platform Roadshow de Pivotal qui aura lieu le jeudi 25 septembre à partir de 8h.

Pivotal Cloud Foundry

Construire et déployer une application sur une plateforme Cloud moderne Au cours de cette journée, par le biais de différents ateliers, vous aurez la possibilité de tester la plateforme Pivotal Cloud Foundry. En quelques heures, vous pourrez vous rendre-compte de la rapidité et de la facilité de déploiement d’une application Cloud Foundry. Les... Read Cloud Platform Roadshow de Pivotal au zlocalhost, le 25 septembre

Catégories: Blog Société

[ #Office365 ] Delve first impressions / Premières impressions sur Delve

Le blog de Patrick Guimonet - mar, 09/09/2014 - 15:57
Here are my first impressions on Delve ! Voici mes première impressions sur Delve ! First how do we get access to Delve ? Tout d’abord, comment accède-t-on à Delve ?...
Catégories: Blog Individuel

Multitâche sans thread 1/5 – Générateur


Programmation réactive

Depuis un moment, nous vous proposons une série d’articles sur le modèle réactif. Nous avons regardé d’où vient ce modèle et l’impact sur la gestion des threads. Mais comment ne pas se noyer dans un code trop complexe ?

Nous avons vu qu’une approche réactive, basée sur le traitement rapide et non bloquant d’événements, permettait des gains notables de performance.

Du point de vue du développeur, il n’est pas toujours facile de rédiger du code basé sur ce paradigme. En effet, comme aucun traitement ne doit être bloquant, il est nécessaire d’enchaîner des call-backs pour le moindre traitement un peu complexe.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function archiveOrders(date, cb) {
  db.connect(
    function(err, conn)
    { if (err) return cb(err);
      conn.query("select * from orders where date < ?", [date],
        function(err, orders)
        { if (err) return cb(err);
            helper.each(orders,
              function(order, next)
              { conn.execute("insert into archivedOrders ...", [order.id, ...],
              function(err)
              { if (err) return cb(err);
                conn.execute("delete from orders where id=?", [order.id],
                function(err)
                { if (err) return cb(err);
                  next();
                });
              });
        },
        function()
        { console.log("orders have been archived");
          cb();
        });
    });
  });
}

Ce type de code peu lisible est souvent appelĂ© : callback hell. Le lien explique que finalement, c’est un problème de qualitĂ© de code et qu’il est facile Ă  rĂ©soudre avec quelques patterns.

Néanmoins, les langages de développement proposent des évolutions pour éviter ce modèle de développement. L’objectif est de rédiger un traitement en apparence linéaire, mais dont chaque portion de code entre deux appels bloquants est exécutée dans un hard-thread différent.

Il existe cinq approches permettant de faciliter la rédaction de programmes réactifs :

  • GĂ©nĂ©rateur
  • Pattern Continuation
  • Co-routine
  • Pipelines / compositions
  • Await / async

Dans cette série d’articles, nous allons parcourir ces différentes solutions pour différents langages de développement. Commençons par la première approche.

Générateur

Un générateur est une routine spéciale permettant de gérer l’itération d’une boucle. La routine produit des valeurs à chaque étape et mémorise le contexte de la boucle pour pouvoir la reprendre plus tard.

Voici un exemple de générateur en Python :

1
2
3
4
5
# Filtre les chaines débutant avec ##
def filter2sharps(iterator):
  for l in iterator:
    if l.startswith("##"):
      yield l

Ce gĂ©nĂ©rateur parcourt un itĂ©rateur et n’émet une valeur que si elle commence par un double dièse. L’instruction yield (produire en français) est Ă©quivalente Ă  un return, Ă  la diffĂ©rence près qu’elle permet de mĂ©moriser l’état de la boucle.

Un usage de ce générateur peut être celui-ci :

1
2
3
4
5
# Utilise le filtre sur un fichier
source= file( ... )
for line in filter2sharps( source.readlines() ):
  print line
source.close()

Dans cet exemple, la boucle parcourt un fichier et affiche uniquement les lignes compatibles avec le gĂ©nĂ©rateur qui joue le rĂ´le de filtre. La boucle du gĂ©nĂ©rateur est mise « en pause » après chaque invocation de filter2sharps, lors du yield.

Le compilateur du langage effectue une transformation du code du générateur, comme nous allons le voir. Par exemple, le générateur C# suivant est compilé comme ci-dessous.

using System;
using System.Collections;
class Test {
  // Une fonction
  static IEnumerator GetCounter() {
    for (int c = 0; c < 10; c++) {
      yield return c;
    }
  }
}

Le code produit par le compilateur est proche de ce code :

// Une classe
private class GetCounter : IEnumerator
{
  private int _state = 0;
  public int _current;
  private int c = 0;
  public bool MoveNext() {
    switch (_state) {
      case 0: // Dans la boucle
        if (c > 10) {
          _current = c;
          c++;
          return true;
        }
        _state = -1;
        break;
    }
    return false;
  }
}

static IEnumerator GetCounter() {
    return new GetCounter();
}

On retrouve tous les éléments classiques d’une boucle : l’initialisation, la comparaison, l’incrémentation. Mais le code est transformé en automate à états et en objet pour mémoriser le contexte. L’appelant peut maintenir l’itérateur en vie, ce qui maintient le contexte de la boucle.

La transformation d’un gĂ©nĂ©rateur en Python est similaire.

1
2
3
4
5
6
7
8
9
# a generator that yields items
# instead of returning a list
def firstn(n):
  num = 0
  while num &lt; n:
    yield num
    num += 1
 
sum_of_first_n = sum(firstn(1000000))

Est généré ainsi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class firstn(object):
  def __init__(self, n):
    self.n = n
    self.num, self.nums = 0, []
  def __iter__(self):
    return self
  # Python 3 compatibility
  def __next__(self):
    return self.next()
  def next(self):
    if self.num &lt; self.n:
      cur, self.num = self.num, self.num+1
      return cur
    else:
      raise StopIteration()

Javascript 1.7 propose maintenant des générateurs. Pour cela, les functions doivent être suffixées d’une étoile.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Javascript
// Generateur infini
function* fibonacci() {
  let [prev, curr] = [0, 1];
  for (;;) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}
for (n of fibonacci()) {
  // truncate the sequence at 1000
  if (n &lt; 1000) break;
  print(n);
}

Un générateur Javascript est également utilisé par des frameworks pour proposer des co-routines (décrit dans un prochain article).

Pour la programmation réactive

Pour la programmation réactive, nous pouvons les utiliser comme une brique de base pour implémenter un scheduler.

Par exemple, dans l’extrait suivant (l’intĂ©graliĂ© du source est prĂ©sent ici), les appels thĂ©oriquement bloquants vers les API fichiers sont remplacĂ©s par des invocations asynchrones. Grâce Ă  l’utilisation de yield return, ces appels asynchrones semblent parfaitement sĂ©quentiels.

1
2
3
4
5
6
7
8
9
10
11
12
13
static IEnumerable CopyFileAsync(string origin, string destination)
{
    Console.WriteLine(String.Format("{0} - Read", origin));
    var readtask = ReadFileAsync(origin);
    yield return readtask;
 
    Console.WriteLine(String.Format("{0} - Write", origin));
    var file_content = readtask.Value;
    yield return WriteFileAsync(destination, file_content);
 
    Console.WriteLine(String.Format("{0} -  Work finished", origin));
    yield break;
}

Dans l’Ă©xĂ©cution ci-dessous, nous appellons ce code 3 fois. Vous pouvez constater que les appels sont entrelacĂ©s mĂŞme si le code parait Ă©crit de façon sĂ©quentielle.

ExĂ©cution entrelacĂ©eUn simple scheduleur maison permet alors d’entrelacer diffĂ©rents gĂ©nĂ©rateurs.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
{
  // Create pseudo threads
  var contexts = new List()
  {
    AsyncTask.Run(() =&gt; CopyFileAsync("Resources/file1.txt", "Resources/file1_copy.txt")),
    AsyncTask.Run(() =&gt; CopyFileAsync("Resources/file2.txt", "Resources/file2_copy.txt")),
    AsyncTask.Run(() =&gt; CopyFileAsync("Resources/file3.txt", "Resources/file3_copy.txt")),
  };
 
  // Sheduler - Un seul thread pour plusieurs traitements en //
  while (contexts.Any(at =&gt; at.Done == false))
  {
    foreach (var elt_task in contexts)
    {
      if (elt_task.CanMoveNext())
      {
        elt_task.MoveNext();
      }
    }
  }
}

Il faut alors proposer des mĂ©thodes ayant l’apparence de mĂ©thodes bloquantes, mais qui sont en rĂ©alitĂ© non-bloquantes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static AsyncStep&lt;byte[]&gt; ReadFileAsync(string origine)
{
  var asyncTask = new AsyncStep&lt;byte[]&gt;() { State = AsyncState.Await };
 
  var file = File.OpenRead(origine);
  var data = new byte[file.Length];
 
  asyncTask.Value = data;
  file.BeginRead(data, 0, (int) file.Length, (a) =&gt;
  {
    file.Close();
    // Update state
    asyncTask.State = AsyncState.Continue;
  }, null);
 
  return asyncTask;
}

Notre collègue Florent Jaby propose une approche similaire en Javascript pour node.js.

Pour conclure

Le tableau suivant résume les avantages et inconvénients de cette approche.

Générateur Usages Dans une boucle Limitations Retourne un Itérateur Local à une fonction Points forts Généré

Un gĂ©nĂ©rateur est un automate Ă  Ă©tats gĂ©nĂ©rĂ© lors de la compilation d’une boucle. Il s’agit d’un producteur d’élĂ©ments qui se met en pause a chaque itĂ©ration, en attente de l’invocation suivante.

Dans le prochain article de la sĂ©rie, nous traiterons de l’approche « continuation ».

Philippe PRADOS, Fabien Arcellier et l’Ă©quipe « RĂ©active »

Articles suggested :

  1. La genèse du modèle réactif
  2. Multitâches ou réactif ?
  3. Multitâche sans thread 2/5 – Continuation

Catégories: Blog Société

[ #Office365 ] How to change Administration console language ? / Comment changer la langue de la console d’administration ?

Le blog de Patrick Guimonet - mar, 09/09/2014 - 07:25
You have to go to the “Settings ” menu on the top right and then to “Office 365 settings” Vous allez sur le menu “Paramètres ” en haut à droite , puis sur “Paramètres Office 365” ...
Catégories: Blog Individuel

Utiliser les librairies Arduino dans Atmel Studio

Developpef - Paul-Emmanuel Faidherbe - lun, 09/08/2014 - 22:25

Dans cet article je vais vous présenter comment démarrer un projet simple (exemple Blink) avec un Arduino Due, Atmel Studio 6.2 et les librairies du projet Arduino.

Pour commencer, vous pouvez suivre cet article très clair et très simple pour initier l'environnement : http://www.engblaze.com/tutorial-using-atmel-studio-6-with-arduino-projects/

Datant cependant de 2012, il mérite quelques mises à jour : il vous faudra télécharger la dernière version du software Arduino capable de gérer le Due. Les chemins vers les répertoires à inclure seront donc légèrement différents, puisque spécifiques à la plateforme (par ex ".\hardware\arduino\sam\variants\arduino_due_x"). Il faudra également ajouter dans le Linker un lien vers la librairie libsam_sam3x8e_gcc_rel située sous ".\hardware\arduino\sam\variants\arduino_due_x".

Il se peut que vous rencontriez des petites erreurs de compilation, que vous pourrez résoudre à la main en commentant/déplaçant du code.

Voici maintenant la nouvelle version de l'exemple Blink :


#include "sam.h"
#include "Arduino.h"


int led = 53;

/**
* \brief SysTick_Handler.
*/
void SysTick_Handler(void)
{
/* Increment counter necessary in delay(). */
TimeTick_Increment();
}

/**
* \brief Application entry point.
*
* \return Unused (ANSI-C compatibility).
*/
int main(void)
{
/* Initialize the SAM system */
SystemInit();
SysTick_Config(SystemCoreClock / 1000); //1ms per interrupt

pinMode(led, OUTPUT);

while (1)
{
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000);
}
}

Pour faire fonctionner la méthode delay, il est nécessaire d'ajouter le code activant l'incrémentation du compteur systeme :


void SysTick_Handler(void)
{
/* Increment counter necessary in delay(). */
TimeTick_Increment();
}
...
SysTick_Config(SystemCoreClock / 1000); //1ms per interrupt

Ainsi, la méthode d'incrémentation TimeTick_Increment sera appelée par l'handler interne au processeur SysTick_Handler toutes les 1ms comme indiqué par SysTick_Config

Ne reste plus qu'Ă  indiquer la plateforme cible Ă  la compilation (processeur SAM3X8E) et lancer la programmation!

Edit : il est également possible d'appeler la méthode Arduino TimeTick_Configure(SystemCoreClock)

Catégories: Blog Individuel

Truc de Coach: 1- 2- 3 Demo! Notre protocole Demo

Qualitystreet - Jean Claude GROSJEAN - lun, 09/08/2014 - 16:47

Je vous prĂ©sentais il y a quelques annĂ©es le « Plan de Bataille » pour rendre la dĂ©mo de l’Equipe efficace et lui donner un aspect professionnel, prĂ©parĂ©, scĂ©narisĂ© et rythmĂ©,le tout dans une ambiance endiablĂ©e Rien que ça! Aujourd’hui, je vous prĂ©sente un petit protocole tout simple qui a prouvĂ© son efficacitĂ© avec les Equipes Agiles…

The post Truc de Coach: 1- 2- 3 Demo! Notre protocole Demo appeared first on QualityStreet - Blog Pro de Jean Claude Grosjean.

Catégories: Blog Individuel

Spring JavaConfig Tips : Lazy Init Proxy

Blog d’Ippon Technologies - lun, 09/08/2014 - 10:40

springiconSpring permet depuis (probablement) toujours de dĂ©clarer une dĂ©finition de bean “lazy” : l’idĂ©e Ă©tant que l’instance du bean n’est crĂ©Ă© par Spring qu’au moment oĂą il est demandĂ© (ou nĂ©cessaire) et non de manière systĂ©matique dans le cadre de l’initialisation de l’ApplicationContext comme l’ensemble des beans en scope singleton (le scope par dĂ©faut).

Son utilisation reste rare mais cela peut-ĂŞtre utile dans certains cas : si la crĂ©ation du bean est particulièrement coĂ»teuse en temps, s’il est nĂ©cessaire d’attendre l’initialisation complète de l’application (ou d’une autre application…) pour pouvoir crĂ©er le bean sans erreur, si la crĂ©ation d’un bean peut Ă©chouer et que cela ne doit pas empĂŞcher le contexte Spring de dĂ©marrer, etc. Une gestion d’erreur adĂ©quate sera alors gĂ©nĂ©ralement nĂ©cessaire.

En configuration XML, l’attribut lazy-init est utilisĂ© pour cela. Cela donne :

<bean id="serviceTarget" class="example.MyService" lazy-init="true">
  ...
</bean>

Pour les configurations Java, l’annotation @Lazy a Ă©tĂ© introduite et joue exactement le mĂŞme rĂ´le. Elle est utilisable :

  • sur un composant annotĂ© @Component (ou dĂ©rivĂ©e) qui sera dĂ©couvert automatiquement par Spring dans le cadre d’un scan de composant
  • sur une mĂ©thode annotĂ©e @Bean gĂ©nĂ©ralement au sein d’une classe @Configuration (JavaConfig) : 
@Bean
@Lazy
public MyService myService() {
  return new example.MyService();
}

Mais quel que soit son mode de configuration, activer ce paramètre ne suffit gĂ©nĂ©ralement pas…

En effet, si un bean singleton A nĂ©cessite l’injection en tant que dĂ©pendance d’un bean B marquĂ© Lazy, l’initialisation du bean A au dĂ©marrage du contexte forcera Spring Ă  aussi initialiser B afin de pouvoir l’injecter dans A, remettant entièrement en cause l’intĂ©rĂŞt de l’initialisation retardĂ©e…

Sans autre configuration, l’usage des beans marquĂ©s Lazy se limite donc gĂ©nĂ©ralement Ă  une rĂ©cupĂ©ration programmatique du bean en question au moment oĂą il est nĂ©cessaire :

MyService service = applicationContext.getBean("myService");

Ce qui n’est pas très en phase avec la philosophie gĂ©nĂ©rale de Spring, prĂ´nant plutĂ´t une utilisation systĂ©matique de l’injection de dĂ©pendance.

Les proxy Spring Ă  la rescousse

La rĂ©ponse de Spring pour Ă©viter cela passe par l’utilisation d’un proxy. Si A nĂ©cessite une dĂ©pendance B marquĂ©e Lazy, il faut crĂ©er un proxy B’ qui sera injectĂ© Ă  la place de B dans A. Le proxy B’ est alors en capacitĂ© d’intercepter tous les appels de mĂ©thode Ă©mis par A. Lors du premier appel, il peut faire crĂ©er le bean B Ă  Spring, et se contente ensuite de dĂ©lĂ©guer tous les appels vers ce bean B nouvellement crĂ©Ă©.

Spring fournit tous les Ă©lĂ©ments nĂ©cessaires Ă  la crĂ©ation d’un tel proxy : en particulier la classe LazyInitTargetSource. La javadoc de spring de cette classe montre l’utilisation de cette classe pour une configuration XML :

<bean id="serviceTarget" class="example.MyService" lazy-init="true">
  ...
</bean>

<bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="targetSource">
    <bean class="org.springframework.aop.target.LazyInitTargetSource">
      <property name="targetBeanName" ref="serviceTarget"/>
    </bean>
  </property>
</bean>

Avec cette configuration, deux beans Spring sont créés :

  • le bean cible nommĂ© “serviceTarget” qui est une instance de example.MyService
  • le bean proxy nommĂ© “service”
    • Si la classe example.MyService implĂ©mente une ou plusieurs interfaces, un Dynamic Proxy du JDK implĂ©mentant ces interfaces sera utilisĂ©
    • Dans le cas contraire, une sous-classe sera gĂ©nĂ©rĂ©e par Spring Ă  l’aide de Cglib et sera utilisĂ©e

On notera qu’il sera alors nĂ©cessaire d’injecter “service” et non “serviceTarget” dans les objets ayant une dĂ©pendance sur example.MyService pour que “serviceTarget” soit rĂ©ellement crĂ©Ă© de manière Lazy, ce qui nĂ©cessitera une injection par nom et non par type.

(A noter, la notion de bean marquĂ© primary (ou @Primary en java) qui permettrait l’utilisation de l’injection par type n’est pas utilisable ici car son utilisation entraĂ®ne malheureusement une initialisation de tous les beans candidats Ă  l’injection. Un bug existe sur ce point : SPR-8343.)

La création du proxy en JavaConfig

Oui, mais voilĂ … Les configurations Spring en XML sont devenues barbantes… Il nous faut trouver l’Ă©quivalent de cette configuration en JavaConfig.

Je vous propose ici deux versions :

  • une version prĂ©-Java 8 pour commencer, puisque nous sommes malheureusement encore beaucoup Ă  ne pas pouvoir bĂ©nĂ©ficier des amĂ©liorations de la dernière version de Java
  • une version Java 8 utilisant une lambda expression pour ĂŞtre un peu plus dans la tendance du moment ;-)

Ces versions JavaConfig ont l’avantage d’ĂŞtre plus fortement typĂ©es : la crĂ©ation du proxy rĂ©fĂ©rence directement la mĂ©thode crĂ©ant le bean target, Ă  la place du nom du bean dans le cas de l’utilisation de la configuration XML.

La version pré-Java 8 pour les malheureux

Tout d’abord, une TargetSource plus adaptĂ©e Ă  une utilisation dans une configuration Spring JavaConfig est nĂ©cessaire :

package fr.ippon.blog.javaconfig;

import org.springframework.aop.TargetSource;

/** Basé sur {@link org.springframework.aop.target.LazyInitTargetSource} */
public abstract class JavaConfigLazyInitTargetSource implements TargetSource {

	public JavaConfigLazyInitTargetSource(Class<?> targetClass) {
		this.targetClass = targetClass;
	}

	private Class<?> targetClass;
	private Object target;

	@Override
	public void releaseTarget(Object target) throws Exception {
		// Nothing to do here.
	}

	@Override
	public boolean isStatic() {
		return true;
	}

	@Override
	public Class<?> getTargetClass() {
		return targetClass;
	}

	@Override
	public synchronized Object getTarget() throws Exception {
		if(target == null) {
			target = createTarget();
		}
		return target;
	}

	protected abstract Object createTarget();
}

Voici maintenant un exemple complet de configuration sous forme d’un test unitaire (sans les assertions ici pour ne pas alourdir le listing) :

package fr.ippon.blog.javaconfig;

import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class LazyInitTest {

	@Configuration
	public static class TestConfiguration implements ApplicationListener<ApplicationContextEvent> {
		@Bean
		public MyBean myBean() {
			System.out.println("Creating proxy");

			TargetSource targetSource = new JavaConfigLazyInitTargetSource(MyBean.class) {
				@Override
				protected Object createTarget() {
					return myBeanTarget();
				}
			};

			return (MyBean) ProxyFactory.getProxy(targetSource);
		}

		@Bean
		@Lazy
		public MyBean myBeanTarget() {
			System.out.println("Creating MyBean");
			return new MyBeanImpl();
		}

		@Override
		public void onApplicationEvent(ApplicationContextEvent event) {
			System.out.println("Application Context Event : " + event.getClass().getSimpleName());
		}
	}

	@Inject
	@Named("myBean")
	MyBean bean;

	@Test
	public void beanIsAProxy() {
		System.out.println("Before using MyBean");
		System.out.println("bean type : " + bean.getClass());
		System.out.println("bean.doIt returns : " + bean.doIt());
	}

	public static interface MyBean {
		public String doIt();
	}

	public static class MyBeanImpl implements MyBean {
		@Override
		public String doIt() {
			return "From implementation";
		}

		@PreDestroy
		public void destroy() {
			System.out.println("in MyBeanImpl.destroy");
		}
	}

}

On obtient alors cette sortie, montrant qu’effectivement le bean n’est crĂ©Ă© que lorsque il est utilisĂ© (“Creating MyBean” après “Before using MyBean”) :

Creating proxy
Application Context Event : ContextRefreshedEvent
Before using MyBean
bean type : class com.sun.proxy.$Proxy14
Creating MyBean
bean.doIt returns : From implementation
Application Context Event : ContextClosedEvent
in MyBeanImpl.destroy
Une version Java 8 plus moderne

Voici une solution un peu plus élégante utilisant une lambda expression introduite dans Java 8 :

package fr.ippon.blog.javaconfig;

import java.util.Objects;
import java.util.function.Supplier;

public class Java8ConfigLazyInitTargetSource extends JavaConfigLazyInitTargetSource {

	public Java8ConfigLazyInitTargetSource(Class<?> targetClass, Supplier<Object> targetCreator) {
		super(targetClass);
		this.targetCreator = Objects.requireNonNull(targetCreator);
	}

	private Supplier<Object> targetCreator;

	protected Object createTarget() {
		return targetCreator.get();
	}
}

La création du proxy devient alors :

		@Bean
		public MyBean myBean() {
			System.out.println("Creating proxy");

			Supplier<Object> supplier = () -> myBeanTarget();
			TargetSource targetSource = new Java8ConfigLazyInitTargetSource(MyBean.class, supplier);

// Ou plus concis :	TargetSource targetSource = new Java8ConfigLazyInitTargetSource(MyBean.class, () -> myBeanTarget());

			return (MyBean) ProxyFactory.getProxy(targetSource);
		} 

Activation de l’auto proxying

La mĂ©thode dĂ©crite prĂ©cĂ©demment a l’avantage de ne pas ĂŞtre trop “magique” et, je l’espère, vous aura permis de comprendre les mĂ©canismes mis en oeuvre et la façon dont vous pouvez facilement, vous-mĂŞme, crĂ©er des proxy Spring en JavaConfig (et pas forcĂ©ment pour un besoin d’initialisation Lazy). Toutefois, elle devient lourde Ă  appliquer si vous avez de nombreux beans Lazy Ă  “proxyfier”.

Spring a prĂ©vu le coup depuis longtemps et fournissait une solution Ă  ce problème dès sa version 1.2 : un mĂ©canisme d’ “autoProxying” permettant de remplacer Ă  la volĂ©e tous les beans marquĂ©s Lazy par un proxy d’initialisation retardĂ©e grâce en particulier Ă  la classe LazyInitTargetSourceCreator.

Malheureusement, son utilisation sur des beans dĂ©clarĂ©s en JavaConfig (via @Bean donc), est longtemps restĂ© bugguĂ©e : SPR-10508. Mais Juergen Hoeller a pris le problème en main et l’a corrigĂ© deux jours avant la sortie de Spring 4.1 !

En Spring 4.1, il vous suffit donc de déclarer ces beans supplémentaires dans votre configuration JavaConfig pour que tous vos beans Lazy soient automatiquement remplacés par un proxy :

		@Bean
		public BeanNameAutoProxyCreator lazyInitAutoProxyCreator() {
			BeanNameAutoProxyCreator autoProxyCreator = new BeanNameAutoProxyCreator();
			TargetSourceCreator[] targetSourceCreators = {lazyInitTargetSourceCreator()};
			autoProxyCreator.setCustomTargetSourceCreators(targetSourceCreators);
			return autoProxyCreator; 
		}

		@Bean
		public LazyInitTargetSourceCreator lazyInitTargetSourceCreator() { 
			return new LazyInitTargetSourceCreator();
		}

(Il reste toutefois possible de le faire fonctionner en Spring 4.0.x mais sous certaines conditions. Je vous laisse étudier les commentaires du ticket JIRA pour les détails.)

Catégories: Blog Société

Effectuation, les 5 principes de l’entrepreneuriat pour tous

ekito people - dim, 09/07/2014 - 23:30

Ce billet est une introduction aux principes de l’effectuation. J’y prĂ©sente ce qu’est l’effectuation, les 5 principes, ainsi qu’une courte comparaison avec le Lean-Startup et le Design Thinking

Introduction

J’ai dĂ©couvert l’effectuation au cours d’un MOOC de Philippe Silbersahn consacrĂ© au sujet et sous-titrĂ© “les principes de l’entrepreneuriat pour tous”. C’est ce qui m’a interpellĂ©, puis ne pouvant suivre son cours intĂ©gralement mais accro au sujet, j’ai fini par acheter son livre et le lire avec le plus grand intĂ©rĂŞt.

Qu’est-ce que l’effectuation?

Le Larousse dĂ©finit l’effectuation comme une “action par laquelle une chose advient Ă  la rĂ©alité ». Et selon wikipedia : « L’Effectual correspond Ă  une rationalitĂ© qui s’oppose au mode causal ou prĂ©dictif ». L’Effectuation est un paradigme pragmatiste du management. Partant de la question de recherche « quel est le processus de dĂ©cision des entrepreneurs ayant rĂ©ussi ? En 2001, la chercheuse Saras Sarasvathy apporte un Ă©clairage nouveau quant Ă  la manière de concevoir le processus de prise de dĂ©cision de l’entrepreneur. »

Saras Sarasvathy a Ă©tudiĂ© la façon dont fonctionnent les entrepreneurs. Qu’ont-ils en communs? Ont-ils tous commencĂ© avec un idĂ©e faramineuse? N’ont-ils pas de peur du risque? Sont-ils des visionnaires ou des experts en prĂ©dictions?… Rien de tout ça! Ils sont comme nous tous. Ce qui en ressort est surtout liĂ© Ă  la façon dont ils ont vĂ©cu leur histoire entrepreneuriale : l’effectuation

Quel différence y-a-t-il entre logique causale et effectuale?

Dans la logique causale, il faut définir un but et déterminer les moyens pour l’atteindre.

logique_causale

Logique Causale

En effectuation, il s’agit d’Ă©valuer ses moyens et imaginer des buts possibles.

logique_effectuale

Logique Effectuale

 

Les 5 principes

Un tiens vaut mieux que deux tu l’auras

Logique Causale

Je veux créer une société de vente de produit bio, je dois trouver des producteurs, trouver un local, faire de la pub pour faire venir les clients, …

Logique Causale

Logique Causale

Logique Effectuale

Dans mon ancien boulot, j’ai pu faire un rĂ©seau de producteurs bio, l’un d’entre eux peut me prĂŞter un local (patchwork fou), il a dĂ©jĂ  des clients qui viennent directement chez lui, je peux monter une sociĂ©tĂ© de produits bio.

Logique Effectuale

Logique Effectuale

En fait, vous partez des moyens dont vous disposez:

  • Qui vous ĂŞtes?
  • Ce que vous connaissez?
  • Qui vous connaissez?

Perte acceptable

DĂ©finissez-vous des seuils. Tout comme en agile, on utilise des boites de temps (time boxing) et une forme de rĂ©trospective. Fixez-vous des limites, de temps, d’argent, et faĂ®tes le point une fois Ă  Ă©chĂ©ance. J’essaye pendant un an et je vois oĂą j’en suis. Ou j’ai 3000€, qu’est-ce que je peux faire avec. Certains ont commencĂ© avec moins que ça.

perte_acceptable

Perte acceptable

Qu’êtes-vous prêt à perdre?

  • La perte acceptable permet de contrĂ´ler votre risque
  • Refaites le point Ă  chaque Ă©tape
  • Ne perdez pas de temps Ă  estimer les gains possibles de manière prĂ©cise

 

Patchwork fou

C’est le principe que je vois le plus souvent en action. Pas plus tard qu’au dernier FailChat chez ekito, chacun des 5 speakers a exposĂ© son histoire semĂ©e de rencontres qui ont eu un impact sur leur acte entrepreneurial. Qu’il s’agisse d’une association, d’un premier client, d’une rencontre avec un expert,… Cette relation s’Ă©tant transformĂ©e en engagement du tiers dans l’entreprise. Le principe dĂ©coule des probabilitĂ©s:

patchwork_fou

Patchwork fou

  • Un Puzzle a forme finale est connue Ă  l’avance. Espace fini, solutions finies.
  • Le Loto, c’est de la probabilitĂ© dans un espace fixe, la probabilitĂ© reste figĂ©e par le nombre de boules. Espace fini, solutions non connues mais bornĂ©es finies.
  • Le Patchwork fou : c’est l’Ă©mergence de la forme en fonction des pièces. Espace infini, solutions infinies.

Donc:

  • Ne perdez pas de temps Ă  tout planifier
  • Construisez votre projet en suscitant l’engagement de parties prenantes
  • DĂ©terminez avec elles la direction de votre projet
  • Co-construire l’avenir (Tiens, on dirait du Agile with Guts!)

La limonade

C’est un peu en lien avec le premier principe, notamment sur ce que vous connaissez. Ici c’est ce que vous avez et surtout ce qui vous tombe dessus. En agile, on peut se rapporter au fameux Embrace change de Kent Beck. En fait, l’idĂ©e part du dicton : ” si la vie t’apporte des citrons, fais en de la limonade”.

limonade

Limonade

Sachez profiter des opportunitĂ©s qui s’offrent. Ne soyez pas bornĂ©s sur une route, sachez envisager des changements de vision. LĂ  est la diffĂ©rence fondamentale que j’y vois avec l’agilitĂ© qui est focalisĂ©e produit sur une vision.   En rĂ©sumĂ©:

  • Tirez parti des surprises
  • N’essayer pas de vous protĂ©ger de tous les risques : cela a un coĂ»t
  • Regardez les surprises comme une ressource

Le pilote dans l’avion

Ce principe est un peu plus complexe, parce que plus global. Il parle du contexte entrepreneurial en supposant que l’on peut le changer. En fait, l’effectuation ne le suppose pas, elle dit qu’il faut le faire. Il s’agit de changer son environnement pour l’adapter au projet. Comme le font les lobbyistes d’ailleurs. Comment vendre un produit, facile, y a qu’Ă  faire passer un loi, monter une boite et faire en sorte d’avoir les bons accord de marchĂ©, hop, vous avez en plus le monopole. Ça ne vous dit rien? l’Ă©cotaxe et Ă©comouve, le traitĂ© transatlantique, ou les voitures sans permis Ligier, copain de Mitterrand Ă  l’Ă©poque …

pilote_dans_avion

Pilote dans l’avion

  • Regardez l’environnement comment il pourrait ĂŞtre et pas comment il est ou les autres le voient
  • L’avenir dĂ©pend de ce que chacun fait.
  • Il n’y a pas d’évolution inĂ©vitable, l’avenir n’est pas Ă©crit

Effectuation, Lean Startup et Design Thinking.

 Le Lean Startup se focalise sur le produit, l’effectuation se focalise sur l’acte entrepreneurial lui-mĂŞme. Les deux sont complĂ©mentaires. Je dirai que l’effectuation permet de dĂ©dramatiser l’acte entrepreneurial, de ne pas avoir peur de se lancer, puis il est possible d’appliquer le Lean Startup pour vĂ©rifier ses hypothèses ensuite.   Quant au Design Thinking: L’effectuation voit le marchĂ© comme un processus de dĂ©couverte, de crĂ©ation, puis de transformation. Une idĂ©e entraĂ®ne plusieurs opportunitĂ©s. Le Design Thinking parle d’idĂ©ation : divergence / convergence. De phases itĂ©ratives et de prototypages.

 

Voilà, après cette brève introduction, vous pouvez vous lancer et monter votre boite!

Sinon, pour plus d’information sur le sujet, je vous renvoie sur le blog de Philippe Silberzahn http://philippesilberzahn.com/tag/effectuation/, son livre est truffĂ© d’exemple, d’histoires fascinantes, très facile Ă  lire et passionnant. Ou le site en anglais : http://www.effectuation.org/

 

The post Effectuation, les 5 principes de l’entrepreneuriat pour tous appeared first on ekito people.

Catégories: Blog Société

LCC 108 - Ouaf ouaf

Les cinq cast codeurs font leur épisode de rentrée et nous parlent de plein plein de choses. Scala, Java EE, Asciidoctor, le Kindle etc etc. Ils lancent aussi le concept de crowdcasting et retournent le micro vers vous. Plus d’infos sur http://lescastcodeurs.com/crowdcasting/.

Enregistré le 4 septembre 2014

Téléchargement de l’épisode LesCastCodeurs-Episode–108.mp3

News Langages Scala

Le futur de Scala
Un fork de Scala
Réponse de TypeSafe

Groovy

Le New York Times adopte Groovy pour son appli Android
Groovy 2.4 beta 3 avec bytecode réduit (sympa pour Android justement)
Retro lambda

Java

Bonnes pratiques de codage en Java
Bonnes pratiques pour stocker des mots de passe en Java
Visualisation d’algorithmes de Garbage Collection
JHipster 1.0
String Deduplication – A new feature in Java 8 Update 20

Jigsaw (Java 9 ou pas :-) )

JavaScript

ECMAScript 6, quoi de neuf

Java EE 8

MVC 1.0
Ed Burns rassure les JSF fanboys et compare le MVC sauce JSF vs action-based MVC (à la Spring MVC)
No Java EE Configuration for EE8

Middleware

Aerogear Push Server 1.0
Hibernate et le dirty checking
Nodyn: node.js dans la VM
Tutorial sur Spring Boot
Podcast JBoss Asylum

Cloud

OpenShift dans une VM
Google BigQuery et la plus grosse base de données d’événements

Mobile

Release de RoboVM 1.0 alpha 1

Outillage

Git 2.1 et What’s new since Git 1.7 un très bon résumé de ce qu’il faut savoir par Christophe Porteneuve
GitBook.io
Maven 3.2.3
Asciidoctor 1.5 et la migration de syntaxe
AsciidoctorJ 1.5.0

Humains

Ne faites pas ce que vous aimez
L’Oregon attaque Oracle en justice
This is why you never end up hiring good developers donne des clefs intéressantes sur ce qu’il faut (ne pas) faire pour faire passer un entretien à un futur developpeur

Divers

La structure d’un ZIP
Le zoo des foundations de hash
Prédire le prochain random
Les Ninjas sortent un livre sur AngularJS
Crash course sur les API fluentes
Qu’est-ce qui fait un bon CHANGELOG ?
Un éditeur de prompt
Le livre XKCD: turtules all the way down (zoom infini à tester)
Finalement, la Spec Markdown dont rêvait Jeff “Coding Horror” Atwood prends forme. Quid de Asciidoc(tor) vs Markdown?
Github rajoute le “split diff”
Sysadmins Cast Site avec des resources intéressantes pour les(dev)ops

Les mains dans le cambouis

Une Google Hangout pour toute la journée dans les équipes distribuées.

@danveloper: “The Prime Directive: Never Trust a Test You Haven’t Seen Fail” @rfletcherEW on #tdd http://t.co/pkDwTaPEV8

Kindle et veille technologique

Expérience crowdcasting

Enregistrer un morceau des cast codeurs et envoyez le nous. On en fera un épisodes.

Plus d’infos sur la page crowdcasting.

Conférences

ng Europe
Jenkins User Meet-up in Paris Paris 10 Sept
DroidCon

BDX.io
DevFest Nantes
BlendWebMix : Lyon 29 & 30 octobre
Codeurs en seine
Devoxx BE
JUG Summer Camp

Nous contacter

Contactez-nous via twitter http://twitter.com/lescastcodeurs
sur le groupe Google http://groups.google.com/group/lescastcodeurs
ou sur le site web http://lescastcodeurs.com/
Flattr-ez nous (dons) sur http://lescastcodeurs.com/
En savoir plus sur le sponsoring? sponsors@lescastcodeurs.com

Catégories: Blog Individuel

Partagez la connaissance

Partagez BlogsdeDeveloppeurs.com sur les réseaux sociaux