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

Kotlin in production, one year later

ekito people - ven, 02/24/2017 - 16:21

We have been talking about Kotlin for a while now on this blog. As Kotlin early adopters,  at ekito we have successfully pushed in production Kotlin applications. Today, while version 1.1 of the JetBrains’ language should be soon released, I want to share our feedbacks after one year of daily development with Kotlin for production applications.

In the remarkable aspects of this JVM language, we can speak of its ease of project setup and its excellent Java interoperability (don’t throw away your Java knowledge). We have encountered almost no difficulties in injecting Kotlin into an existing Java project. Without such ease, it is impossible to start testing in a serious context, or to avoid the “big bang” effect in your project. To get started with it, it is therefore important to start introducing Kotlin with real and specific needs.

Jetbrains has made a great job on tools. You get the feeling that those tools are mature. Android studio is ready to setup your gradle project in one click. The real thing is to understand what Kotlin can bring you (I already have made some presentations about it, past year for ekito’s geek breakfast and devfest toulouse).

Successful projects upgrade

On our projects in conversion, we are now paying attention to some aspects. Here are a few typical situations.

The “magic” conversion of a Java class to the Kotlin class is often well done, but sometimes need to be reviewed. It is better to target small or simple Java classes at beginning. Don’t try to convert directly the hearth of your application. Each time you use the conversion shortcut, pause yourself a minute, reread and rewrite (if needed) your code. Quickly, you will be able to write things in simpler way.

While migrating our projects to Kotlin, we become easily aware of one thing: our APIs are not as secure as they should be! Optionals & Smartcasts help you manage objects nullity, and you will no longer need secured operators to work with these objects.

Optional types & smartcasts

Kotlin’s tooling push you to use immutable values when possible (val against var objects). If you use only variable types, you will have concurrent use problems warnings (which is too much quickly forgotten in Java). In Android, this also helps you to fight memory leaks. This way you will write applications that are less exposed to uncontrolled states, and your code becomes more easily testable.

One tricky thing to look for is the use of frameworks that use proxy generation (Realm database for example). Kotlin classes are public and closed by default. Be careful to open needed classes and methods!

Opening class for Realm database

The default function arguments in the Kotlin is an extremely valuable feature, in terms of coherence and time gain. But once you go back to Java, you feel a bit naked. We can use this enough to calm the pain: the @JvmOverloads annotation.

Function with defaults arguments

Java function overloads generate by Kotlin

Daily working with Kotlin

Daily Android development with Kotlin is a real breath of fresh air! We have now bunch of good practices. You can get rid of some regularly used frameworks. No need for Dagger as dependency injector or Butter Knife to manage your widget instantiation! Also forget Retrolambda for those who want to write lambdas and functional code.

“Object” are singleton classes. Don’t hesitate to use them for component assembling and injection, and take care to not leak any Android context object.

The Kotlin extensions allow you to inject any widget of your layout xml, with its Id. Check your imports to be sure to use widget injection and not its Id then

Catégories: Blog Société

Java Code Coverage Mechanics

Alpes JUG - mer, 02/22/2017 - 16:40

L’Alpes JUG aura le plaisir d’accueillir Evgeny Mandrikov pour parler de JaCoCo et de la JVM. La prĂ©sentation sera en anglais.

La conférence

Jacoco
Internals of Java Virtual Machine based on challenges and experience in implementation of one of the most popular code coverage tools for Java – JaCoCo that is backbone of award-winning Eclipse EclEmma Plugin.

In this presentation we will dive into bosom of JVM (bytecode, restrictions, classloaders) answering on following questions:

  • How by developing JaCoCo we find bugs in OpenJDK? You also can!
  • How JaCoCo manages to work in OSGi environment?
  • What makes it fastest?
  • And which changes were required to support Java 8? Java 9?
Le conférencier


Software Gardener, addicted to open source and code quality, hired by SonarSource after creation of improved open source analogs of their commercial products. Currently working as Language Team Technical Leader, responsible for development of source code analyzers for languages like Java, C/C++, C#, JavaScript, Python, COBOL, PL/SQL; implementator of cross project duplication detection. In a spare time working on other projects like for example JaCoCo, Eclipse EclEmma.

Inscription

https://www.meetup.com/fr-FR/AlpesJUG/events/237898799/

Cette soirĂ©e se dĂ©roulera sur le campus au Laboratoire LIG – Bâtiment IMAG, 700 avenue Centrale, Saint-Martin-d’Hères, Ă  partir de 19h. Attention, l’entrĂ©e se fera par la gauche du bâtiment (par rapport Ă  l’entrĂ©e principale), Ă  cotĂ© du parking Ă  vĂ©lo.

Catégories: Association

RĂ©trospective Agile: Mes exercices favoris

Qualitystreet - Jean Claude GROSJEAN - dim, 02/19/2017 - 22:37

Les rĂ©trospectives sont des moments clĂ©s dans la vie d’une Equipe et d’un projet… Voici pour vous qui ĂŞtes amenĂ©s Ă  les animer frĂ©quemment, les exercices de base sur lesquelles je m’appuie! Evidemment tout commence par le Postulat de la RĂ©trospective (en Ouverture) et par un Plan d’action en fin de retro:     Pour…

The post RĂ©trospective Agile: Mes exercices favoris appeared first on QualityStreet - Blog Agile depuis 2007.

Catégories: Blog Individuel

jeudi 26 avril 2017 - Suivez le lapin blanc ! Exploration au coeur de la JVM

JUG Toulouse, Groupe d'utilisateur Java - mar, 02/14/2017 - 01:00

Adresse : A définir

Pour cette nouvelle soirée du Java User Group Toulousain, nous allons rentrer dans les entrailles de notre plateforme préférée avec Sylvain Wallez (@bluxte) aux commandes.

Pour le programme plus en détails, référez-vous aux informations de l’événement meetup.

Catégories: Association

jeudi 23 mars 2017 - Programmation concurrente dans l'univers Java

JUG Toulouse, Groupe d'utilisateur Java - mar, 02/14/2017 - 01:00

Adresse : A définir

Cet évènement sera l’occasion de découvrir les solutions de programmation concurrente dans l’univers Java , des plus simples telles que Thread, synchronized ou Executor, au plus avancées comme StampedLock, fork/join ou CompletableFuture.

Pour le programme plus en détails, référez-vous aux informations de l’événement meetup.

Catégories: Association

jeudi 2 mars 2017 - Eclipse DemoCamp

JUG Toulouse, Groupe d'utilisateur Java - mar, 02/14/2017 - 01:00

Adresse : A définir

Cet évènement sera l’occasion de découvrir les dernières nouveautés autour d’Eclipse. Venez échanger avec d’autres utilisateurs et rencontrer les contributeurs Eclipse.

Pour le programme plus en détails, référez-vous aux informations de l’événement meetup.

Catégories: Association

User Story… L’essentiel en 5 images

Qualitystreet - Jean Claude GROSJEAN - lun, 02/13/2017 - 00:04

En direct de mes sessions de perfectionnement destinĂ©es aux Product Owners… DÉFINITION 3C INVEST USER VOICE STRATÉGIES DE DÉCOUPAGE Pour plus de dĂ©tails sur le contenu de chaque image, vous trouverez votre bonheur dans cet article : « User stories: Back to Basics » D’autres articles pour nos chers PO: Coaching de Product Owner Product Owner: Back…

The post User Story… L’essentiel en 5 images appeared first on QualityStreet - Blog Agile depuis 2007.

Catégories: Blog Individuel

Feature Teams Design Event

Qualitystreet - Jean Claude GROSJEAN - dim, 02/05/2017 - 23:54

ou si vous prĂ©fĂ©rez « l’EvĂ©nement d’auto-organisation des Equipes », entre Chaos et Alignement… L’idĂ©e est simple: pour la mise en place de Feature Teams, laisser les Ă©quipes elle-mĂŞmes se former sur la base d’un cadre proposĂ© par le Management. La mis en place d’Ă©quipes Agiles auto-organisĂ©es: très beau sujet…  beaucoup en parlent mais au final très…

The post Feature Teams Design Event appeared first on QualityStreet - Blog Agile depuis 2007.

Catégories: Blog Individuel

jeudi 8 février 2017 - Functional web applications avec Kotlin and Spring

JUG Toulouse, Groupe d'utilisateur Java - mar, 01/10/2017 - 01:00

Adresse : Harry Cow ( 13 rue sainte Ursule, Toulouse (Plan).

Nous avons l’honneur en ce début du mois de février de recevoir Sébastien Deleuze, qui travaille chez Pivotal dans l’équipe de développement de Spring Framework.

Pour le programme plus en détails, référez-vous aux informations de l’événement meetup.

Catégories: Association

10 ans ! Et voilà…

Qualitystreet - Jean Claude GROSJEAN - lun, 01/09/2017 - 01:23

A peine plus jeune que ma fille; Ă  peine plus âgĂ© que mon fils, Qualitystreet a 10 ans! Alors merci Ă  vous chers lecteurs d’ĂŞtre toujours prĂ©sents après ces quelques annĂ©es… Merci aussi Ă  vous qui assistez Ă  mes confĂ©rences & mes training avec toujours autant d’enthousiasme… Merci Ă  vous chers clients pour votre confiance…

The post 10 ans ! Et voilĂ … appeared first on QualityStreet - Blog Agile depuis 2007.

Catégories: Blog Individuel

JS et Programmation Fonctionnelle - Part 1

Taverne d'Arma - Programmation - mar, 09/13/2016 - 11:20

Je vais me lancer sur une série d'articles concernant la programmation fonctionnelle, appliquer au monde JS. L'objectif pour moi est de préparer, à terme, une présentation sur le sujet. Aujourd'hui, je vais donc commencer par les bases : c'est quoi au juste la programmation fonctionnelle.

Du rĂ´le de la fonction

Fonctionnelle comme fonction. Mais la fonction dont on parle ici correspond-elle au mots-clés 'function' de notre langage ? Presque, mais pas tout à fait. En fonctionnel, une fonction est un élément prévisible qui prend des paramètres entrants et qui renvoies une nouvelle valeur. Cela implique que :

  • Les paramètres entrants ne sont pas modifiĂ©s
  • Le retour de la fonction est un nouvel objet ou une nouvelle valeur
  • Tout appel avec des paramètres identiques renvoi le mĂŞme rĂ©sultat

Les avantages de ce type de fonction sont multiples :

  • Meilleure testabilitĂ© : elles ne dĂ©pendent pas d'un Ă©tat.
  • Meilleure reproductibilitĂ© : si l'on trouve un bug, il suffit de rappeler la fonction avec les mĂŞmes paramètres pour obtenir les mĂŞmes rĂ©sultats.
  • Meilleurs "scalabilitĂ©" : on ne mute pas les objets, il n'y aura donc pas de problème de concurrences sur des threads diffĂ©rents.
De l'immutabilité

Je viens de glisser le point dans le dernier avantage, mais l'un des grands principes de la programmation fonctionnelle est de tirer à maximum parti d'objet immutable : c'est-à-dire un objet qui ne peut pas être modifié. La conséquence, c'est qu'à chaque fois que l'on veut modifier un objet, nous allons créer une nouvelle instance complètement indépendant de l'objet.

Encore une fois les avantages sont multiples :

  • La scalabilitĂ©, comme abordĂ© plus haut.
  • La limitation des effets de bord : vu que l'on ne modifie pas un objet, l'on ne risque pas de modifier par inadvertance un objet qui aurait Ă©tĂ© transmis Ă  d'autres parties de l'application.

Bien entendu, la plupart des applications ne peuvent pas être 100% immutable : l'idée est d'isoler au maximum les endroits où un état est mémorisé et de ne faire ces mutations que de manières conscientes et complètement volontaire.

De la programmation déclarative

La programmation impérative met en avant le "comment" : ajoute 1 au compteur, passe à l'élément suivant, modifie tel caractère, ... L'objectif de la programmation déclarative est de s'attacher au "quoi". Pour s'approcher au maximum de ce style, la programmation fonctionnelle, mais en avant non pas les données, mais les traitements : le but est de décrire des chaînes de traitement qui vont s'appliquer aux données.

Prenons l'exemple très simple d'une somme. En impératif :

function sum(vals) {
  var total = 0;
  for(var i = 0; i < vals.length; i++) {
    total = total + vals[i];
  }
  return sum;
}

Et en fonctionnelle :

function sum(vals) {
  return vals.reduce(add);

  function add(e1, e2) {
    return e1 + e2;
  }
}

Le code est équivalent, mais dans le second cas, il décrit l'intention : réduire la liste en additionnant ses éléments.

Pour résumé

La programmation fonctionnelle a pour objectif :

  • d'amĂ©liorer la lisibilitĂ© du code (style impĂ©ratif).
  • de faire du code plus facile Ă  tester et Ă  debugger (pas d'effet de bord).
  • d'ĂŞtre plus rĂ©sistant aux concurrences.

Par contre, l'immutabilité est une contrainte qui demande une certaine discipline à l'usage.

Fonctionnelle versus POO

Souvent, ces deux paradigmes de programmations sont mis en oppositions. Faut-il faire de la POO, ou faut-il faire du fonctionnelle ? Aujourd'hui, je pense sincèrement qu'il faut faire les deux :

  • La POO permet de bien structurer son application et d'y faciliter la navigation
  • Le fonctionnelle permet de rendre son code plus lisible

Utiliser les deux, c'est avoir accès aux forces de chacun. Pourquoi se priver ?

Catégories: Blog Individuel

Specification by example et documentation vivante

Specification by example & documentation vivanteEn 2015,  avec Brice nous avons prĂ©sentĂ© une session Ă  Agile Grenoble intitulĂ©e “Specification by example : venez assister Ă  la naissance d’une documentation vivante”. Depuis nous avons prĂ©sentĂ© Ă  plusieurs reprises cette session qui est Ă  chaque fois accueillie avec enthousiasme. Elle se compose en 3 parties : prĂ©sentation de la thĂ©orie, un exemple concret interactif et un retour d’expĂ©rience. La collaboration Ă©tant ag15_logo_speaker_blancau cĹ“ur de ce processus, cette mĂ©thode implique tous les intervenants d’un projet : analystes mĂ©tier, dĂ©veloppeurs, testeurs et managers.

Des exemples utiles à différentes phases du projet

Comme l’explique le livre de Gojko Adzic, travailler avec des exemples est intéressant lors des différentes phases du projet :

  • ComprĂ©hension partagĂ©e : en amont du dĂ©veloppement, travailler avec des exemples permet de lever des ambiguĂŻtĂ©s et de s’assurer que l’on parle bien des mĂŞmes choses. De plus si tous les intervenants sont impliquĂ©s Ă  cette phase, cela joue aussi sur la dynamique d’équipe.
  • Acceptance test : dès le dĂ©but du dĂ©veloppement, l’exemple est entrĂ© dans l’outil d’automatisation. Il devient un « acceptance test » de la double boucle TDD. Il prend alors un  rĂ´le de pense bĂŞte : il reste rouge tout le long du dĂ©veloppement et passe vert lorsque le logiciel satisfait toutes les exigences.
  • Regression test: une fois vert l’exemple change encore d’objectif. Il sert maintenant Ă  dĂ©tecter les rĂ©gressions. Un bon exemple nous indique dans quelle fonctionnalitĂ© s’est glissĂ© le bug.
  • Documentation vivante: un autre aspect est maintenant de jouer un rĂ´le  documentaire de l’application. Cette documentation Ă©volue en mĂŞme temps que le logiciel et est vĂ©rifiĂ©e en continu.  Il arrive parfois que l’ajout d’une fonctionnalitĂ© rende obsolète certaines contraintes qui avaient Ă©tĂ© ajoutĂ©es prĂ©cĂ©demment. En passant rouge, les exemples nous indiquent l’impact du changement.
Où se trouve la poule aux œufs d’or ?

8218-FX-6-0-13-6-9-0-90-5-5-95-95Cette mĂ©thode n’est pas magique. Son implĂ©mentation demande des efforts et un changement culturel. Aussi j’insiste rĂ©gulièrement sur le fait que cette mĂ©thode apporte Ă©normĂ©ment de valeur sur l’Ă©tape de comprĂ©hension partagĂ©e et de documentation vivante.

A mon sens, il n’y a pas d’autres mĂ©thodes qui challengent autant l’expression du besoin et la documentation. Aussi comme trop d’information tue l’information, quand je suis face Ă  des questions sur l’exhaustivitĂ© oĂą la qualitĂ© des exemples, j’essaye d’identifier Ă  quelle phase profite l’exemple. Si j’investis sur la documentation, l’exemple a certainement de la valeur. Par contre si je rajoute des exemples uniquement pour me protĂ©ger de la rĂ©gression, j’essaye de voir si je ne peux pas les rajouter dans d’autres tests (robustesse, intĂ©gration, etc…)

La phase de compréhension partagée porte en elle même beaucoup de valeur. A cette étape c’est le besoin qui est challengé. Les « product owners » doivent illustrer le besoin par des exemples concrets. En ayant des représentants de l’équipe métier, développement et test, l’interaction des différents points de vue va enrichir l’idée initiale.

Dans l’exemple pratique de la présentation, nous tentons d’illustrer l’impact du changement en ajoutant une règle qui est incohérente avec une autre. Sur cette simulation cela semble simpliste, mais nous avons récemment vécu cette illustration :

Nous voulions légèrement modifier un calcul affiché à l’écran. Il était difficile, tant le système était complexe, de détecter que cela rendait obsolète une autre fonctionnalité.

Pour moi l’efficacitĂ© de cette mĂ©thode est Ă  rapprocher du principe « Mutal Benefit » de eXtrem Programming : une mĂŞme activitĂ© (la rĂ©daction d’un exemple) apporte de la valeur dès l’instant prĂ©sent. Le principe est d’Ă©crire un exemple parce que cela est utile maintenant pour dĂ©finir ce que doit faire l’application. Pas uniquement parce qu’un jour il va potentiellement servir. En automatisant la vĂ©rification de l’exemple on rĂ©cupère les fruits de cet investissement tout au long de la vie du projet.

Emblem-question.svgLes questions qui reviennent souvent

Lors de nos diverses présentations certaines questions sont récurrentes. En voici quelques-unes :

  • Vous parlez de pyramide des tests, n’êtes-vous pas en train de faire une pyramide inversĂ©s ?
    • Effectivement, le nombre d’exemples augmente avec le temps et le besoin de documentation. Cependant ce n’est qu’une partie des tests. Nous nous en servons comme test d’acceptance et de nombreux tests unitaires sont Ă©crits en mĂŞme temps que le code. Notez que cette documentation est très utile pour les testeurs pendant les recettes lors des phases de livraison.
  • Est-ce que l’approche est similaire Ă  celle du TDD ? C’est-Ă -dire que si on n’arrive pas Ă  tester c’est qu’il y a un problème de design ?
    • Par le fait d’automatiser des exemples, il y a forcĂ©ment une influence sur le design. Cependant ce n’est pas son objectif, le besoin est beaucoup plus chahutĂ© par cette approche. Si le besoin n’est pas très clair, on a une opportunitĂ© de s’en rendre compte dès la phase de comprĂ©hension partagĂ©e. A ce stade le changement coĂ»te moins cher.
  • A propos de l’impact au changement, n’y a-t-il pas moyen de l’identifier avant le dĂ©veloppement ?
    • Effectivement si une incohĂ©rence n’a pas Ă©tĂ© levĂ©e lors de la 1ère phase, ce n’est que lorsque le code va ĂŞtre modifiĂ© que l’on va savoir quel est l’impact du changement. Cependant comme cette incohĂ©rence est connue, cela permet de statuer et de mettre Ă  jour la documentation. On a alors une nouvelle source de vĂ©ritĂ© sur ce que fait l’application (l’autre Ă©tant le code).
  • Quel est le coĂ»t pour la mise en place de cette mĂ©thode ?
    • Ce n’est pas facile de rĂ©pondre Ă  cette question quantitativement. Cela dĂ©pend de l’organisation mise en place. Sur notre projet, les dĂ©veloppeurs ont pris en charge une bonne partie (~20-30% temps de dĂ©veloppement). Cependant tout le monde s’accorde pour dire que cela vaut le coup : l’application a peu de bug, il y a moins d’incomprĂ©hension. C’est aussi l’unique documentation utilisĂ©e par le mĂ©tier, les dĂ©veloppeurs et les testeurs.

J’espère vous avoir donné envie de tenter l’aventure Specification by example. La présentation est disponible sous SlideShare et le code sous GitHub.

The post Specification by example et documentation vivante appeared first on Agilité, Architecture, C++ "in the mix".

Catégories: Blog Individuel

Ouvrir avec l’explorateur vos bibliothèques #SharePoint et #OneDrive…

Le blog de Patrick Guimonet - sam, 09/10/2016 - 16:47
C’est l’une des demandes les plus fréquentes des utilisateurs, comment manipuler les fichiers stockés dans SharePoint et OneDrive dans l’explorateur de Windows. En effet malgré des améliorations significatives dans l’interface, ...
Catégories: Blog Individuel

Contenu Festival #SharePoint et #Office 365 de mai 2016 Ă  Paris #SPSParis

Le blog de Patrick Guimonet - sam, 09/10/2016 - 15:44
Merci à tous pour votre participation au Festival #SharePoint et #Office 365 de mai 2016 à Paris ! En effet, c’est grâce à vous que ces évènements et en particulier le SharePoint Saturday Paris ont été un très grand succès ! Si ce...
Catégories: Blog Individuel

Productivité personelle - Mon organisation

Taverne d'Arma - Programmation - sam, 09/03/2016 - 09:10

J’ai récemment effectué une présentation au boulot concernant la productivité personnelle. Le but était de parler des grands principes partagés par différentes méthodologies (Personal Kanban, GTD, ...). Je comptais partager les slides ici mais, en eux-même, ils n’ont guère d'intérêt. A la place je me suis dit que parler de ma propre organisation serait probablement plus intéressant.

Personal Kanban

Vous avez surement déjà aperçu ses tableaux de post-it a colonne multiple, contenant en général au minimum “Todo, En-Cours, Done”. Personal Kanban est une méthode qui se base dessus et dont les grands principes sont :

  • Toutes nos actions sont des tâches Ă  mettre dans ce tableau.
  • Une tâche va toujours de l’avant, elle ne doit pas reculer.
  • Les colonnes correspondent au “en-cours” sont limitĂ© au nombre de tâche qu’elles peuvent contenir. Quand l’on arrive au plafond, il faut s’arranger pour terminer des tâches.
  • On choisit la tâche que l’on effectue en fonction du contexte (temps dispo, niveau de concentration, lieu, …) et non pas seulement en fonction de la prioritĂ©.

Bref, on retrouve le principe de base des méthodes d’organisations, le recensement des tâches, et on y adjoint un mécanisme nous forçant à terminé les tâches commencés plutôt que d’en prendre une nouvelle.

Au quotidien j’utilise :

  • Des post-it papier, si possible, pour le boulot
  • Un outil informatique (Trello), pour le perso (histoire d’y avoir accès de partout)

Quel que soit l’outil, le point important est de créer une tâche “rapidement” avec un libellé, et potentiellement une “catégorie” (un projet par exemple).

C’est léger et souple d’utilisation, bref, c’est une méthode qui me correspond bien. J’ai tellement fait rentrer le mono-tasking dans mes habitudes qu’en général mon en-cours n’excède pas une tâche.

Pomodoro

En complément du Kanban, je pratique de temps à autres la méthode Pomodoro. C’est en quelque sort mon “mode de productivité” quand j’ai besoin d’être concentré, d’aller vite, et d’abattre beaucoup de travail. Cette méthode est à mon sens très efficace et présente quelques avantages :

  • On se rend compte du temps qui passe.
  • On se force Ă  des crĂ©neaux ininterrompu de concentration.
  • Mais en se prĂ©voyant les breaks nĂ©cessaire Ă  ne pas saturer.

Revers de la médaille : elle demande une discipline que j’ai du mal à appliquer en permanence. C’est pour cela que je la pratique “à la demande” uniquement.

Autres petites pratiques

En dehors de ces méthodologies, il y a aussi quelques principes que j’applique pour booster ma productivité :

  • Pas de notification visuel, ou très peu. Ma boĂ®te reçoit ses mails discrètement et je les consulte quand j’en ai envie, et non dès qu’ils arrivent. J’évite aussi de laisser ouvert les rĂ©seaux sociaux et autres petites pollutions de ce genre. Je prĂ©fère me rĂ©server des moments pour aller les consulter.
  • Je connais mes moments “productifs” : ces pĂ©riodes de la journĂ©es oĂą vous abattez deux fois plus de boulot qu’à tout autre moment. Personnellement c’est entre 7h et 11h que je suis le efficaces. Entre 11h et midi, c’est la catastrophe. Je regagne un peu de productivitĂ© en dĂ©but d’après midi et, fin d’après midi, je commence Ă  saturer et Ă  avoir du mal. Du coup je m’assure de faire les tâches difficile dans ces crĂ©neaux lĂ .
  • Je profite de mes temps de transport pour faire ma veille. Dès qu’un article intĂ©ressant arrivent dans mon flux RSS, je l’envoi sur pocket pour que ma liseuse le rĂ©cupère. Cela m’évite de lire Ă  un moment oĂą je pourrais faire quelque chose de plus profitable. Cerise sur gâteau, je sais aussi que je lit mieux sur ma liseuse que sur Ă©cran.
Catégories: Blog Individuel

Code fonctionnel en PHP

Taverne d'Arma - Programmation - lun, 08/29/2016 - 12:38

Ah le php... Une technologie que je n'apprécie guère pour des tas de bonnes et mauvaises raisons. Mais il faut bien lui reconnaître une qualité : il est très facile de lui trouver un hébergement.

Mais là n'est pas le sujet du jour ! Un nouveau projet s'ouvre à moi et, bien qu'il soit en php, je n'ai pas envie de mettre de coté mon centre d'interêt du moment : la programmation fonctionnelle. Me voilà donc à chercher comment la mettre en oeuvre en php.

PHP et Closure.

La base de la programmation fonctionnelle, c'est de manipuler des fonctions. Et l'un des outils très utile autour des fonctions, ce sont les Closures : des fonctions qui "embarque" avec elle des variables en plus de leur paramètre entrant.

En php, la closure est un peu particulière car il faut expliciter les variables qui sont utilisable à l'intérieur de la fonction. Elle se déclare ainsi :

function ($param) use ($varEmbarque1, $varEmbarque2) {
    // Mon corps de méthode
    // $varEmbarque1 et $varEmbarque2 sont accessible
}

Un exemple d'utilisation ?

public function raise($event) {
    Arrays::each($this->listeners, function($fn) use($event) {
        call_user_func($fn, $event);
    });
}

Je reviendrai plutard sur le Arrays::each. Ce qui est important ici c'est que each appelle la méthode pour chaque élement du table. La valeur de l'élement est alors donné en paramètre. Ici ma fonction a besoin de deux élements pour fonctionner : une callback contenue dans le tableau, et un évènement à transmettre. L'un est passé en paramètre, l'autre est passé via la closure.

Et si comme moi vous n'aimez pas spécialement les fonctions anonymes (question de lisibilité), vous pouvez appliquer le pattern builder :

public function raise($event) {
    Arrays:each($this->listeners, $this->emit(event));
}

// (DomainEvent) -> (Fn) -> ()
private function emit($event) {
    return function($fn) use($event) {
        call_user_func($fn, $event);
    };
}
Manipulations de collections et plus si affinité.

map, filter, ... Ces petites fonctions de manipulations de collections sont le premier outil issue du fonctionnel que j'ai utilisé. Je les trouve tellement confortable que je n'ai pas envie de m'en passer.

Malheureusement les fonctions fournies par php sont limitées (map, filter et reduce uniquement). En fouillant un peu sur internet, je suis tombé sur underscore.php, une librairie très sympathique qui fournit le panel complet des fonctions de ce genre (all, any, find, ...).

Petit bonus, elle nous offre aussi des fonctions de manipulations de fonctions tels que compose, memoize, once et throttle qui peuvent s'avérer très pratique.

Et enfin, les monades

Dernier outils du fonctionnel : les monades. Je ne les utilise pas encore tout à fait naturellement mais je reconnaîs ce qu'elles peuvent apporter. Cette fois-ci j'ai envie de les utiliser davantage et pour cela, j'ai trouvé la librairie php-functional.

Les monades, ce sont des outils très utiles tels que Either qui présente deux "chemins" (réussite ou échec), avec deux types de retours différents, ou Maybe qui est une autre façon de gérer l'abscence de valeur.

Un exemple d'utilisation :

// (String, String) -> Either[FunctionalError, User]
protected function checkAuthentification($login, $password) {
    return $this->userRepository
        ->findByLogin($login)
        ->bind($this->checkPassword(Password::fromValue($password)));
}

$this->userRepository->findByLogin() est une fonction qui renvoi un Either. Bind permet d'appliquer à la valeur retourné une autre fonction qui renverra elle aussi un Either uniquement dans le cas Right (chemin de succès). La fonction donné à bind sera appellé avec la valeur en paramètre.

A l'intérieur de findByLogin, on va retrouvé deux retour possible :

\Monad\Either\Right::of($user);

ou

\Monad\Either\Left::of(new FunctionalError("Utilisateur inconnu"));

Dans un code classique, j'aurai utilisé un mécanisme d'exception qui aurait pas forcément été aussi lisible.

En sortie de checkAuthentification j'ai toujours une Either. L'appellant pourra donc faire quelque chose comme cela :

// (String, String) -> Either[FunctionalError, User]
public function exec($login, $password) {
    $user = $this->checkAuthentification($login, $password);
    $user->map($this->storeInSession())
         ->map($this->raiseUserConnected());
    return $user;
}

En cas de succès de l'authentification, j'effectue deux fonctions :

  • Stockage en session
  • Lever d'un Ă©vènement

Quand je veut extraire définitivement la valeur de la monade, je peut faire ceci :

$myEither->extract()

Je m'arrêterais ici dans l'explication sur les monades : ils faudraient un article entier (voir plus) pour vraiment démontrer leurs valeurs.

Des commentaires Ă©tranges ?

Vous avez pu apercevoir au-dessus de mes fonctions des commentaires ayant cette forme :

// (String, String) -> Either[FunctionalError, User]

Ces commentaires sont uniquement présent à des fins de documentations. C'est une manière de donner des indications sur les types utilisés sans passé par une phpDoc bien plus verbeuse : je trouve toujours les javadocs / phpdocs aussi useless...

Ces quelques indications me sont bien plus précieuses et sont suffisament légère pour que je garde la discipline de les rajouter à chaque fois.

Catégories: Blog Individuel

[Article extérieur] Déployer Let’s Encrypt sur Heroku et nom de domaine custom chez [OVH]

Mathieu Robin - ven, 08/26/2016 - 09:49

Salut à tous ! ça faisait un bail !

J’ai publiĂ© sur Medium (j’ai voulu essayer), un article nommĂ© « DĂ©ployer Let’s Encrypt sur Heroku et nom de domaine custom chez [OVH]« .

Je vous laisse tout le plaisir de le lire en cliquant sur le lien ci-dessus. Bonne lecture !

Flattr this!

Catégories: Blog Individuel

The Mostly Adequate Guide to FP

Taverne d'Arma - Programmation - jeu, 08/04/2016 - 07:19

En continuant mes recherches a propos de programmation fonctionnelle en javascript, je suis tombé sur un ouvrage disponible gratuitement : The Mostly Adequate Guide to FP. Disponible en ebook ou pour une lecture «en ligne», ce livre d’environ 150 pages abordent les différents aspects de la programmation fonctionnelle de manière plutôt didactique.

Au sommaire : currying, composition, monades et applicative. A mon sens les explications sont un peu moins facile à appréhender que celle-présente dans «Functional Programming in Javascript» mais elles sont tout de même facile à suivre.

Mention spéciale pour le chapitre sur la composition que je trouve vraiment très complet. Ici l’auteur nous présente vraiment une autre manière de développez et d’agencer nos fonctions. Les exemples donnés sont vraiment très parlant et illustre l’intérêt de cette approche. Je pense notamment à des déclarations comme celle-ci qui sont un exemple de concision :

var loudLastUpper = compose(exclaim, toUpperCase, head, reverse);

loudLastUpper(['jumpkick', 'roundhouse', 'uppercut']);
//=> 'UPPERCUT!'

Après la lecture de ces deux ouvrages, me voilà complètement armée pour passer à la pratique ! Et pour m’échauffer, j’ai suivi les exercices de NodeSchool sur le sujet ( «functional javascript» ). Ces exercices n’explore pas la composition ni les monades, mais le reste y passe.

Au passage pour ceux qui ne connaisse pas (et c’étais mon cas il y a quelques jours), NodeSchool est un site vraiment sympa bourré de «tutoriel» sous la forme d’exercice+corrigé. Vraiment très sympa :)

Catégories: Blog Individuel

Retour sur Devoxx 2016 : WildFly Swarm

Le blog des experts du groupe Infotel - ven, 05/20/2016 - 11:04
Cette annĂ©e Devoxx France s’est tenu pendant 3 jours du 20 au 22 avril au Palais des Congrès de Paris. Infotel a permis Ă  de nombreux collaborateurs de participer Ă  cette Ă©ventement. FrĂ©dĂ©ric JOSEPH nous fait un retour sur WildFly … Lire la suite →
Catégories: Blog Société

IaaR !

ĂŠtre Agile - Thierry Cros - ven, 03/04/2016 - 20:06

etre-agile.png IaaR ! est un acronyme :

  • Intention
  • Attention
  • Action
  • RĂ©pĂ©tition.

C'est un "protocole" de transformation qui fait appel aux trois maîtrises de la voie toltèque (Attention, Transformation, Intention).

Intention

D'abord poser une intention.
Respecter ces trois recommandations :

  • Visualisation++ : faire appel Ă  l'imagination pour visualiser une scène correspondant Ă  l'Ă©tat souhaitĂ© et atteint. Le "++" signifie que cette visualisation incorpore non seulement des images, Ă©galement des sons, des sensations... Bref fait appel Ă  plusieurs sens. Au-delĂ  de l'aspect sensoriel, cette visualisation crĂ©atrice possède une dimension Ă©motionnelle : l'esquisse d'un lĂ©ger sourire pourrait apparaitre sur le visage pendant cette visualisation crĂ©atrice ;
  • 100% d'accord : autrement dit "ZĂ©ro doute". Du cĂ´tĂ© du pratiquant c'est comme si c'Ă©tait dĂ©jĂ  fait dans le monde de l'Intention et qu'il restait simplement Ă  rĂ©ifier - rendre rĂ©elle - cette visualisation ;
  • UC 10 : Universe Compliant level 10 se souvenir simplement que nous sommes dans un monde soumis Ă  diffĂ©rentes lois (lĂ©galitĂ© du pays, lois physiques...) et que la rĂ©alisation de l'intention s'inscrit dans ces lois. UC 10 signifie ainsi que le rĂ©sultat dĂ©pend aussi de ces lois.
Attention

Alors, à quoi allons-nous prêter attention afin que cette Intention se réalise ?
Notre perception de la réalité est-elle suffisamment... réaliste ?
Quels indicateurs, quel management visuel, que "sur-veiller"...

Action

Si ce cadre fonctionne grâce à la force de l'Intention, il reste que nous sommes acteurs de la réalisation. Quelles actions envisageons-nous ?

Répétition

Probablement un ingrédient "secret" de ce processus : selon le changement, il est vain d'imaginer qu'une habitude engrammée pendant des décennies va disparaître subitement. Il faudra donc répéter... Et répéter encore jusqu'au succès.
D'autant plus que ce processus itératif offre un espace - bien connu des Agilistes - à la fois de feedback (l'inspection des Scrumiens) et d'amélioration.

Magie !

Lorsque je présente IaaR ! en formation ou accompagnement, j'insiste sur le côté "magique" de cette pratique, fortement inspirée par la voie toltèque telle qu'exprimée par Don Miguel Ruiz (IaaR est un acronyme que j'ai concocté à partir d'un protocole présenté par Don Miguel Ruiz).
Magique car elle fait appel à des "procédés psychologiques" peu ou pas connus généralement.
Magique car elle suppose un certain lâcher-prise, une confiance dans ce pouvoir de l'Intention.

Pratiquer !

Je ne peux que vous engager Ă  pratiquer IaaR !.
Démarrez par une intention simple, qui puisse se concrétiser dans la journée par exemple, pour vous entraîner à cette pratique.
Et faites confiance dans le pouvoir de votre Intention !
Intention ou Foi ou Amour.

teo-compressee.jpg

Toltèque Agile

Catégories: Blog Individuel

Partagez la connaissance

Partagez BlogsdeDeveloppeurs.com sur les réseaux sociaux