Venez découvrir le concept de Fold !
Hérité de la programmation fonctionnelle, le Fold abstrait l'itération sur vos structures de données, et améliore l'expressivité de votre code.
Avec de vrais bouts de Java 8 et une pincée de Haskell !
...par Raphaël Javaux, le 25 mars 2015.
Copie pour permettre le téléchargement L'original se trouve ici : https://docs.google.com/presentation/d/1A87M-e3u1uXlsQddGsI60EZXHVqiehaNy_SCfj7hUeQ/pub?start=false&loop=false&delayms=3000&slide=id.p
Swift est désormais open source ! "Google considérerait Swift comme un langage « de première classe » pour Android" pouvait-on lire en avril sur le réseau. Et enfin un portage Android du langage a été "merge" dans la base de code officielle de Swift.
Bon tout ceci est un bon prétexte pour apprendre ce nouveau langage et les possibilités qu'il peut nous apporter en terme de développement. Une comparaison avec Java sera notamment proposée afin de montrer les similitudes et differences entre ces deux langages .
...par Raphaël Javaux, le 25 mars 2015.
Copie pour permettre le téléchargement L'original se trouve ici : https://docs.google.com/presentation/d/1A87M-e3u1uXlsQddGsI60EZXHVqiehaNy_SCfj7hUeQ/pub?start=false&loop=false&delayms=3000&slide=id.p
Swift est désormais open source ! "Google considérerait Swift comme un langage « de première classe » pour Android" pouvait-on lire en avril sur le réseau. Et enfin un portage Android du langage a été "merge" dans la base de code officielle de Swift.
Bon tout ceci est un bon prétexte pour apprendre ce nouveau langage et les possibilités qu'il peut nous apporter en terme de développement. Une comparaison avec Java sera notamment proposée afin de montrer les similitudes et differences entre ces deux langages .
Au sein d’une démarche DevOps, le build et le déploiement continue sont les premiers piliers à mettre en place.
Cette session avancé de notre NighClazz “Build Tools & Continuous Delivery” a pour objectif de présenter les modes de déploiement "Blue-Green Deployment" et "Feature toggle" ainsi que les principes d'automatisation des schémas de base de données.
A technical description of http2, including background of HTTP what's been problematic with it and how http2 and its features improves the web.
See the "http2 explained" document with the complete transcript and more: http://daniel.haxx.se/http2/
(Updated version to slides shown on April 13th, 2016)
Java SE 8 est sûrement la version la plus importante et la plus impactante pour les développeurs. Deux ans après sa sortie, ce talk propose des retours sur les bonnes ou moins bonnes utilisations des principales fonctionnalités de Java 8. Une connaissance de ces fonctionnalités est requise.
Microbox : Ma toolbox microservices - Julien Royekino
Malgré les bénéfices indéniables des architectures microservices, elles apportent une complexité non négligeable. Durant cette session, je vous présenterai la collection d’outils open source ou développé en interne que nous utilisons sur nos différents projets microservices pour limiter les délais de mise en oeuvre de ce type d’architecture. Depuis la gestion des sources jusqu’au monitoring en passant par la génération de projets et l’usine de build nous parcourrons en live l’utilisation de ces différents outils.
Le terme ‘Microservices’ fait le buzz depuis plusieurs mois déjà dans l’ingénierie logicielle. Durant cette soirée, Zenika vous propose de décrire en détail cette technique de décomposition de son système d’information.
La première partie de la soirée présente les enjeux des MicroServices et les différents cas d’utilisation.
La seconde partie aborde différents frameworks Java qui peuvent être utilisés pour la mise en place d’une architecture MicroServices.
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
This session explains how JAX-RS and CDI became reactive capable in Java EE 8. We put some new features of JAX-RS 2.1 and CDI 2.0 into perspective and show some reactive patterns to improve your application. Add Java 8 CompletionStage to the mix and this API trio becomes your best bet to easily go reactive without leaving the Java EE train.
Au sein d’une démarche DevOps, le build et le déploiement continue sont les premiers piliers à mettre en place.
Cette session avancé de notre NighClazz “Build Tools & Continuous Delivery” a pour objectif de présenter les modes de déploiement "Blue-Green Deployment" et "Feature toggle" ainsi que les principes d'automatisation des schémas de base de données.
A technical description of http2, including background of HTTP what's been problematic with it and how http2 and its features improves the web.
See the "http2 explained" document with the complete transcript and more: http://daniel.haxx.se/http2/
(Updated version to slides shown on April 13th, 2016)
Java SE 8 est sûrement la version la plus importante et la plus impactante pour les développeurs. Deux ans après sa sortie, ce talk propose des retours sur les bonnes ou moins bonnes utilisations des principales fonctionnalités de Java 8. Une connaissance de ces fonctionnalités est requise.
Microbox : Ma toolbox microservices - Julien Royekino
Malgré les bénéfices indéniables des architectures microservices, elles apportent une complexité non négligeable. Durant cette session, je vous présenterai la collection d’outils open source ou développé en interne que nous utilisons sur nos différents projets microservices pour limiter les délais de mise en oeuvre de ce type d’architecture. Depuis la gestion des sources jusqu’au monitoring en passant par la génération de projets et l’usine de build nous parcourrons en live l’utilisation de ces différents outils.
Le terme ‘Microservices’ fait le buzz depuis plusieurs mois déjà dans l’ingénierie logicielle. Durant cette soirée, Zenika vous propose de décrire en détail cette technique de décomposition de son système d’information.
La première partie de la soirée présente les enjeux des MicroServices et les différents cas d’utilisation.
La seconde partie aborde différents frameworks Java qui peuvent être utilisés pour la mise en place d’une architecture MicroServices.
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
This session explains how JAX-RS and CDI became reactive capable in Java EE 8. We put some new features of JAX-RS 2.1 and CDI 2.0 into perspective and show some reactive patterns to improve your application. Add Java 8 CompletionStage to the mix and this API trio becomes your best bet to easily go reactive without leaving the Java EE train.
HTTP2 : ce qui va changer par Julien LanduréZenika
HTTP1 est omniprésent en 2016 et HTTP2 est pourtant "sorti" le 15 mai 2015. Qu'est-ce qu'on y gagne, nous développeurs ? Les principes d'optimisation Web seront-ils toujours d'actualités ? Venez découvrir HTTP2, le futur protocole du Web !
Dans la continuité de la conférence Java Concurrency and Non-blocking IO Lecture animée par Heinz Kabutz, Zenika vous propose d'assister à la NightClazz Java 8 - Découverte.
Cette présentation aura pour objectif d’introduire le langage de programmation Scala. Ce dernier bénéficie depuis plusieurs mois d’un véritable engouement qui se reflète au regard de la communauté française croissante.
Pour cela Ludwine Probst et Florent Lagrede reviendront donc sur les notions fondamentales, illustrées d’exemples sur des problèmes récurrents de programmation, afin de dégager les spécificités de ce langage et certains de ses atouts.
Aucune connaissance de Scala n’est donc nécessaire, seulement l’envie de découvrir un nouveau langage.
Ce document vise à présenter la programmation fonctionnelle sous Scala.
Les points abordés sont le paradigme fonctionnel, fonction anonyme, fonction d’ordre supérieur, Clôture, fonction partielle, la récursivité, Curryfication. Chaque notion est accompagnée par des exemples.
Objectif général : Acquérir les connaissances nécessaires à la programmation avec le langage Python
Objectifs opérationnels :
- Mémoriser des données primitives
- Traiter des données
- Communiquer avec l’extérieur
- Contrôler le flux d’exécution des instructions
- Mémoriser des données composites
- Découper et réutiliser du code
Chapitre8: Collections et Enumerations En JavaAziz Darouichi
Voici le chapitre 8 sur les collections et les énumerations en Java.
Si vous avez des remarques ou suggestions afin de le parfaire.
N’hésitez pas à me contacter via mon email:
pr.azizdarouichi@gmail.com.
Bonne lecture.
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
Ces nouvelles fonctionnalités introduites à partir de Java 7 nous permettent de parallèliser nos traitements simplement, voire gratuitement. Nous allons donc pouvoir utiliser pleinement nos multicoeurs avec un minimum d'efforts. Quels sont ces nouveaux patterns, quels gains en performance pouvons-nous en attendre, à quels nouveaux bugs serons-nous confrontés ? Une heure pour répondront à chacun de ces points, en introduisant les nouveaux problèmes et leurs solutions. Une heure pour comprendre comment nos habitudes de programmation vont devoir évoluer, et à quoi la programmation parallèle en Java ressemblera-t-elle demain.
Quelques pages intéressantes sur Python avec des exemples, et en particulier en 1.4 le programme de calcul d'une intégrale par la méthode des rectangles, des trapèzes et de Simpson.
(1) Ce document provient de : https://www.apprendre-en-ligne.net/pymath/support.pdf (au 27 mars 2019)
(2) Il est extrait du site : https://www.apprendre-en-ligne.net/index.php
Similaire à WTF - What's The Fold - Bordeaux JUG 2013 (20)
La Data science au service de l'IoT : l'IoT est encore un domaine émergent et de nos jours, les systèmes compris dans les solutions constructeurs (exemple : Hue, nest...) envoient des directives aux objets en se basant essentiellement sur des moteurs de règles (définies par les utilisateurs ou pas).
Nous allons voir quelles sont les limites de tels systèmes, et quels peuvent être les apports d'une approche basée sur des solutions issues du monde du machine learning.
Matinale Agile Wake Up #4 : les tests et l'agilitéZenika
La 4ème édition de l'Agile Wake Up avait pour thématique les Tests. L'équipe Kai vous a proposé de faire un tour d'horizon des différents tests réalisables dans le cadre de l'agilité.
Se concentrer sur l’expérience et non sur le livrable, tel est le pari du Lean UX. Comment cette démarche permet-elle de s’assurer, au plus vite, que ce qui est imaginé répond bien aux attentes des utilisateurs. En se basant sur les 3 principes : Lean start-up, L’esprit design et le développement Agile, il est possible de mettre en place le cycle vertueux : Observer, Apprendre et Concevoir.
Agile Wake Up #3 : La transformation Agile de Kisio DigitalZenika
Kisio Digital (ex-Canal TP) est engagé dans une transformation agile depuis de nombreux mois. Dans cette démarche, pas toujours facile, Kisio est accompagné par des consultants de Zenika (coach agile, Product Owner, Scrum Master). C'est ce quotidien dont nous allons vous parler.
Agile Wake Up #3 : la contractualisation AgileZenika
Porteuses de grandes promesses, les méthodes agiles impliquent néanmoins des droits et devoirs pour les prestataires et les directions Achats. La contractualisation agile est donc un sujet brûlant pour lequel il est nécessaire de consigner dans un cadre légal adéquat ces droits et devoirs respectifs de toutes les parties prenantes.
Après un panorama du Big Data / Data Science, nos experts font le focus sur Spark, l’un des composants de la stack SMACK.
Spark est un framework de cluster computing qui permet de faire du traitement de larges volumes de données de manière distribuée. Le modèle de programmation proposé par Spark est plus simple que celui d'Hadoop et jusqu'à 100 fois plus rapide en temps d'exécution.
Nous découvrons ensuite Zeppelin, un outil graphique simple et rapide à mettre en oeuvre se plaçant au-dessus de Spark.
Pour terminer, nous nous intéressons au Machine Learning, aujourd’hui en plein essor. Pourquoi cela ? Quels sont ses principaux domaines d'applications et ses apports ? Quelles sont les principales stratégies utilisées dans le domaine de l'analyse prédictive ? Il est temps d'y voir plus clair et de comprendre les enjeux de cette discipline !
Motivation 3.0 : sens, autonomie et maîtrise.Zenika
Les méthodes traditionnelles de management qui reposent sur la politique de « la carotte et du bâton » sont un échec. Un nouveau paradigme est né au milieu du XXe siècle grâce à Douglas McGregor, professeur de Management au MIT, qui repose sur 3 facteurs : sens, autonomie et maîtrise. Découvrez les clés de la « Motivation 3.0 », prérequis indispensable dans un contexte agile.
React est la librairie orientée composant, produite par Facebook, qui est venue bousculer le paysage JavaScript ces dernier mois. Peut-être en avez-vous entendu parler mais vous avez du mal à positionner cette librairie dans une architecture orientée Web ? Découvrez les raisons pour lesquelles React fait le buzz.
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinZenika
Pour ce mois de mars, nous vous proposons une thématique Big Data autour de Spark et du Machine Learning !
Nous attaquerons par une présentation d'Apache Spark 1.5 : son architecture distribuée et ses possibilités n'auront plus de secret pour vous.
Nous enchaînerons ensuite avec les fondamentaux du Machine Learning : vocabulaire (pour enfin comprendre ce que raconte les data scientists / dataminer ! ), usages et explication des algorithmes les plus populaires ... Promis la présentation ne comporte pas de formules de maths barbares ;)
Puis nous mettrons en pratique ces deux présentations en développant ensemble votre première application prédictive avec Apache Spark et Apache Zeppelin !
Pour ce mois de mars, nous vous proposons une thématique Big Data autour de Spark et du Machine Learning !
Nous attaquerons par une présentation d'Apache Spark 1.5 : son architecture distribuée et ses possibilités n'auront plus de secret pour vous.
Nous enchaînerons ensuite avec les fondamentaux du Machine Learning : vocabulaire (pour enfin comprendre ce que raconte les data scientists / dataminer ! ), usages et explication des algorithmes les plus populaires ... Promis la présentation ne comporte pas de formules de maths barbares ;)
Puis nous mettrons en pratique ces deux présentations en développant ensemble votre première application prédictive avec Apache Spark et Apache Zeppelin !
Entreprise libérée : Du mythe à la réalité ?Zenika
Présentation faite à Agile Grenoble 2015 :
Le buzz actuel autour des entreprises libérées fascine tout autant qu'il fait peur. Certains voient en ce concept le Graal du bonheur et du plaisir au travail, alors que d'autres redoutent une utopie extrémiste inventée par des gourous soixante-huitards, qui mènerait droit à l'anarchie puis à la faillite !
Je vous invite à vous éloigner de ces débats d'experts passionnés le temps d'un talk et à réfléchir ensemble, de manière pragmatique et dépassionnée, au moyen de rendre ce rêve à la fois réel et efficace.
Je vous propose pour cela de voyager dans l'histoire vraie de Zenika, la société que je participe à développer, et qui, dès sa création il y a 10 ans, bien avant la mode de l'entreprise libérée, s'est construite sur les bases de ses piliers fondateurs que sont le plaisir au travail, l'excellence et l'innovation, la croissance et la rentabilité.
Ce retour d'expérience réel, basé sur l'histoire d'une "banale SSII", illustre de manière concrète la démarche progressive mise en place, les grands succès et les petites victoires, mais aussi les problèmes rencontrés, les doutes survenus et quelques écueils à éviter.
Après avoir abordé les différentes problématiques autour d'AngularJS, du Continuous Delivery et de Java 8 :
les NightClazz sont de retours en 2015.
Zenika a hébergé le Docker Tour de France, en décembre dernier, souhaitant poursuivre notre investissement sur cette technologie nous vous proposons d'assister à la NightClazz Docker - Découverte.
Au sein d’une démarche DevOps, le build et le déploiement continue sont les premiers piliers à mettre en place.
Cette session découverte de notre NighClazz “Build Tools & Continuous Delivery” a pour objectif de présenter les enjeux de l’automatisation, d’introduire les principaux outils de builds Java, de comprendre le mécanisme de livraison logicielle et de déploiement continue.
Support de la présentation "Deadlock Victim" à Devoxx-fr 2012, par Heinz Kabutz (javaspecialists.eu) et Olivier Croisier (zenika.com, thecodersbreakfast.net).
Support de la présentation de Seren, librairie de sérialisation Java, à la conférence DevoxxFR.
Présentation par Olivier Croisier (zenika.com, thecodersbreakfast.net)
4. FOLD ?
Définition en Haskell
foldl :: (a → b → a) → a → [b] → a
… Pas de panique !
5. FOLD ?
Exercice 1
Soit une liste d'entiers
→ Les additionner
List<Integer> nums = Arrays.asList(1,2,3,4,5);
6. FOLD ?
Exercice 1
Soit une liste d'entiers
→ Les additionner
List<Integer> nums = Arrays.asList(1,2,3,4,5);
public Integer sum(List<Integer> nums) {
Integer sum = 0;
for (Integer num : nums) {
sum = sum + num;
}
return sum;
}
7. FOLD ?
Exercice 2
Soit une liste d'entiers
→ Les multiplier
List<Integer> nums = Arrays.asList(1,2,3,4,5);
8. FOLD ?
Exercice 2
Soit une liste d'entiers
→ Les multiplier
List<Integer> nums = Arrays.asList(1,2,3,4,5);
public Integer product(List<Integer> nums) {
Integer product = 1;
for (Integer num : nums) {
product = product * num;
}
return product;
}
9. FOLD ?
Pattern commun
Accumulateur ← valeur initiale
Boucle sur la liste
Opération (accumulateur, élément)
public Integer foo(List<Integer> nums) {
Integer accu = <init>;
for (Integer num : nums) {
accu = accu <op> num;
}
return accu;
}
10. FOLD ?
Type de l'accumulateur
Type des éléments de la liste
public <A, E> A fold (BiFunction<A, E, A> op,
A init,
List<E> list) {
A accu = init;
for (E num : list) {
accu = op.apply(accu, num);
}
return accu;
}
11. FOLD ?
BiFunction<Integer,Integer,Integer> plus =
new BiFunction<>() {
public Integer apply(Integer accu, Integer elem) {
return accu + elem;
}
};
BiFunction<Integer,Integer,Integer> mult =
new BiFunction<>() {
public Integer apply(Integer accu, Integer elem) {
return accu * elem;
}
};
Integer sum
= fold (plus, 0, nums);
Integer product = fold (mult, 1, nums);
13. FOLD ?
Java 8 : Références de méthodes
Class::staticFunction
Integer sum = fold (Integer::plus, 0, nums);
public class MathUtil {
public static Integer mult(Integer x,Integer y) {
return x * y;
}
}
Integer prod = fold (MathUtil::mult, 1, nums);
14. FOLD ?
Définition en Haskell
foldl :: (a → b → a) → a → [b] → a
fonction
(a,b) → a
accumulateur
de type a
résultat
liste<b>
15. PRINCIPES
Définition
“
En programmation fonctionnelle, l'opération fold
(ou reduce) est une famille de fonctions d'ordre
supérieur qui traitent une structure de données
dans un certain ordre pour produire un résultat.
– http://www.haskell.org/haskellwiki/Fold
16. PRINCIPES
Avantages
Mécanisme très générique
Fonction d'ordre supérieur
Encapsulation de l'itération
Expressivité ("quoi" vs "comment")
Optimisation des opérations associatives
Famille de fonctions
foldl, foldr, foldl1, foldr1
scanl, scanr, scanl1, scanr1
19. PRINCIPES
Fold left vs Fold right
Opérations non commutatives
(soustraction, division...)
foldl
foldr
(-)
(-)
0
0
[1..5]
[1..5]
quiz !
Performances
Plus efficace d'ajouter en tête des listes
→ foldr : élément à gauche, liste à droite
20. PRINCIPES
Autres folds
foldl1, foldr1
Même principe que foldl et foldr
Accumulateur ← 1° élément de la liste
foldl (+) 0 [1..5]
foldl1 (+) X [1..5]
valeur initiale implicite
21. PRINCIPES
Autres folds
scanl, scanr
scanl1, scanr1
Même principe
Renvoient toutes les valeurs intermédiaires
scanl (+) 0 [1..5]
[0,1,3,6,10,15]
scanr (+) 0 [1..5]
[15,14,12,9,5,0]
22. USAGES
Folds complexes
Fold sert de base à beaucoup d'algorithmes
impliquant le parcours d'une liste
Le résultat peut être une valeur unique ("reduce")
ou une autre liste !
Dépend de l'accumulateur et de l'opération
On peut effectuer une opération complexe
par composition de fonctions simples
f(g(x)) ↔ (f ⋅ g)(x)
23. USAGES
Fonction map
Applique une fonction f à chaque élément
[1,2,3,4,5] → [f(1),f(2),f(3),f(4),f(5)]
Implémentation avec foldr
Accumulateur ← liste cible vide
Pour chaque élément e :
- Calculer f(e)
- Ajouter f(e) à la liste cible
fonction
composée
25. USAGES
Fonction map
List<Integer> accu = new ArrayList<>();
BiFunction<List<Integer>,Integer,List<Integer>> op =
(l,e) -> {
l.add(0, e * 2);
return l;
};
List<Int> result = foldr(op, accu, nums);
26. USAGES
Fonction filter
Sélectionne uniquement les éléments qui
répondent à un prédicat p
[1,2,3,4,5] –-(garder si >3)--> [4,5]
Implémentation avec foldr
Accumulateur ← liste cible vide
Pour chaque élément e :
- Vérifier p(e)
- Si p(e), ajouter e à la liste cible
fonction
composée
27. USAGES
Fonction filter
ajout de l'élément à
l'accumulateur
let op e list = if e
then
else
> 3
(e:list)
list
result = foldr op [] [1..5]
28. USAGES
Fonction filter
List<Integer> accu = new LinkedList<>();
BiFunction<List<Integer>,Integer,List<Integer>> op =
(l, e) -> {
if (e > 3) l.add(0,e);
return l;
};
List<Int> result = foldr(op, accu, nums);
29. USAGES
Fonction count
Compte le nombre d'éléments dans la liste
[1,2,3,4,5] → 5
Implémentation avec foldl
Accumulateur ← 0
Pour chaque élément e :
- Incrémenter l'accumulateur
31. USAGES
Fonction max
Renvoie le plus grand élément de la liste
[1,2,3,4,5] → 5
Implémentation avec foldl
Accumulateur ← 0
Pour chaque élément e :
- Si e > accumulateur, alors accumulateur = e
32. USAGES
Fonction max
let op e m = if e
then
else
> m
e
m
result = foldl op 0 [1..5]
Integer max = foldl((e,m)-> e>m?e:m, 0, nums);
33. IMPLEMENTATIONS
Java 8
Notion de Stream (java.util.stream.Stream)
Pipeline de transformation
Spécialisé par type (IntStream…)
Implémente reduce (foldl restreint à 1 type)
T reduce( T identity,
BinaryOperator<T> reducer );
List<Integer> nums = Arrays.asList(1,2,3,4,5);
int sum = nums.stream()
.reduce(0, Integer::sum);
34. IMPLEMENTATIONS
Javascript
Sur les tableaux
reduce (foldl) et reduceRight (foldr)
array.reduce
(func,
array.reduceRight(func,
initval)
initval)
var nums = new Array(1,2,3,4,5);
var sum = nums.reduce(
function(a,e) {return a+e;},
0);
35. IMPLEMENTATIONS
Scala
Sur les listes et tableaux
foldLeft (/:) et foldRight (:)
List.foldLeft (initval)(func)
List.foldRight(initval)(func)
val nums = Array(1, 2, 3, 4, 5)
val sum = nums.foldLeft(0)(_+_)
val sum = (0 /: list)(_+_)
37. CONCLUSION
Alors, What's The Fold ?
Un principe simple, puissant et générique
Socle pour d'autre opérations
map, filter, count...
Déjà présent dans vos langages
reduce, inject, foldLeft...
Apprenez à le reconnaître !