Want to dive even deeper?

Take the course Building an Architectural Walkthrough Using Unity by Stefan Boeykens and become an expert!
Building an Architectural Walkthrough Using Unity
by Stefan Boeykens

Check it out!
You're watching a preview of this video, click the button on the left to puchase the full version from Atomikos ExtremeTransactions Certification.

Slick vs. ORM

Slick is not an object-relational mapper, but a functional-relational mapper leading to unique benefits. Using Slick efficiently may be counter-intuitive to people familiar with ORM systems. This talk explains how common ORM use cases should me implemented differently using Slick and what the benefits are. In short, ORM systems suffer from the consequences of the object-relational impedance mismatch, where in contrast Slick's mapping to functional programming constructs is rather straight forward. This allows for tight integration with Scala and highly re-useable code for composing queries.

Published on
  • 6.766
  • 43
  • 1
  • 18
  • 0
  • Slick vs ORM Jan Christopher Vogt, EPFL Stefan Zeiger, Typesafe
  • Object-Orientation + Relational
  • Functional + Relational
  • Functional + Relational
  • • Slick is a Functional-Relational Mapper • embraces relational (not hidden) • natural fit (no impedance mismatch) • stateless (not stateful) • Slick is to ORM what Scala is to Java
  • 8 Reasons for using Slick
  • Sample App Data Model Device id:  Long price:  Double acquisi5on:  Date
  • Scala collection-like API for ( d <- Devices; if d.price > 1000.0 ) yield d.acquisition Query(Devices) .filter(_.price > 1000.0) .map(_.acquisition) Device id:  Long price:  Double acquisi5on:  Date
  • Configuration • Do mappings in Scala • No XML, no "magic" behind the scenes • Connect to a JDBC URL or DataSource – Use an external connection pool • Wrap raw JDBC connections for use with DI containers that handle the transaction management
  • Connect import scala.slick.driver.H2Driver.simple._ val db = Database.forURL( "jdbc:h2:mem:test1", "org.h2.Driver") db.withSession { implicit s: Session => … } db.withTransaction { implicit s: Session => … }
  • Keep Your Data Model Clean case class Device(id: Long, price: Double, acquisition: Date) class Devices extends Table[Device]("DEVICE") { def id = column[Long]("ID", O.PrimaryKey) def price = column[String]("PRICE") def acquisition = column[Date]("ACQUISITION") def * = id ~ price ~ acquisition <> (Device.apply _, Device.unapply _) } val Devices = new Devices
  • Keep Your Data Model Clean ...or  omit  it class Devices extends Table[(Long, String, Date)]("DEVICE") { def id = column[Long]("ID", O.PrimaryKey) def price = column[String]("PRICE") def acquisition = column[Date]("ACQUISITION") def * = id ~ price ~ acquisition } val Devices = new Devices
  • Keep Your Data Model Clean case class Device(id: Long, price: Double, acquisition: Date) …but  keep  iden5ty  explicit
  • Custom Column Types case class Device(id: DeviceId, …) class DeviceId(val id: Long) extends AnyVal
  • Custom Column Types case class Device(id: DeviceId, …) class DeviceId(val id: Long) extends AnyVal implicit val deviceIdType = MappedTypeMapper.base [DeviceId, Long](_.id, new DeviceId(_))
  • Custom Column Types case class Device(id: DeviceId, …) class DeviceId(val id: Long) extends AnyVal implicit val deviceIdType = MappedTypeMapper.base [DeviceId, Long](_.id, new DeviceId(_)) class Devices extends Table[Device]("DEVICE") { def id = column[DeviceId]("ID", O.PrimaryKey)
  • Custom Functions
  • Custom Functions def dayOfWeek(c: Column[Date]) = SimpleFunction[Int]("DAY_OF_WEEK").apply(Seq(c))
  • Custom Functions def dayOfWeek(c: Column[Date]) = SimpleFunction[Int]("DAY_OF_WEEK").apply(Seq(c)) val dows = Query(Devices).map { d => (d.id, dayOfWeek(d.acquisition)) }.run
  • Work With Any DB Schema • You define the schema: class Devices extends Table[Device]("DEVICE") { def id = column[Long]("ID", O.PrimaryKey) def price = column[String]("PRICE") def acquisition = column[Date]("ACQUISITION") def * = id ~ price ~ acquisition <> (Device.apply _, Device.unapply _) } val Devices = new Devices
  • Work With Any DB Schema • You define the schema: class Devices extends Table[Device]("DEVICE") { def id = column[Long]("ID", O.PrimaryKey) def price = column[String]("PRICE") def acquisition = column[Date]("ACQUISITION") def * = id ~ price ~ acquisition <> (Device.apply _, Device.unapply _) } val Devices = new Devices Map  to  anything
  • Work With Any DB Schema • You define the schema: class Devices extends Table[Device]("DEVICE") { def id = column[Long]("ID", O.PrimaryKey) def price = column[String]("PRICE") def acquisition = column[Date]("ACQUISITION") def * = id ~ price ~ acquisition <> (Device.apply _, Device.unapply _) } val Devices = new Devices Use  any  func5on Map  to  anything
  • Execution is always explicit Device val query = for { d <- Devices if d.price > 1000.0 } yield d.acquisition val results = query.run id:  Long price:  Double acquisi5on:  Date
  • Execution is always explicit Device val query = for { d <- Devices if d.price > 1000.0 } yield d.acquisition val results = query.run id:  Long price:  Double acquisi5on:  Date (session)
  • Execution is always explicit Device val query = for { d <- Devices if d.price > 1000.0 } yield d.acquisition val results = query.run id:  Long price:  Double acquisi5on:  Date
  • Example Data Model Device id:  Long price:  Double acquisi5on:  Date
  • Example Data Model Device id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Transferred data ORM 3  statements, complete  Device  object  loaded val device = Device.byId(123L) : Device val site = Site("New York") Device device.site = site ORM.save id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String Slick val device = Queries(Devices).byId(123L) : Query[Devices,Device] val site = Site(None,"New York") val siteId = Sites.autoInc.insert( site ) device.map(_.siteId).update(siteId)
  • Transferred data ORM 3  statements, complete  Device  object  loaded val device = Device.byId(123L) : Device val site = Site("New York") Device device.site = site ORM.save id:  Long 2  statements, price:  Double nothing  loaded, acquisi5on:  Date Slick Site n 1 id:  Long name:  String device  re-­‐usable  as  query  components val device = Queries(Devices).byId(123L) : Query[Devices,Device] val site = Site(None,"New York") val siteId = Sites.autoInc.insert( site ) device.map(_.siteId).update(siteId)
  • Predictable SQL structure Query(Devices) .filter(_.price > 1000.0) .map(_.acquisition) .selectStatement select x2."aquisition" from "DEVICE" x2 where x2."price" > 1000.0
  • Plain SQL support val price = 1000.0 val expensiveDevices: List[Device] = sql"select * from device where price > $price" .as[Device].list Device id:  Long price:  Double acquisi5on:  Date
  • Plain SQL support val price = 1000.0 val expensiveDevices: List[Device] = sql"select * from device where price > $price" .as[Device].list Device id:  Long price:  Double acquisi5on:  Date implicit val getDeviceResult = GetResult(r => Device(r.<<, r.<<, r.<<))
  • Plain SQL support val price = 1000.0 val expensiveDevices: List[Device] = sql"select * from device where price > $price" .as[Device].list Device id:  Long price:  Double acquisi5on:  Date implicit val getDeviceResult = GetResult(r => Device(r.<<, r.<<, r.<<))
  • Enforce schema consistency • Generate DDL from table objects • Slick 2.0: Generate table objects and mapped classes from database
  • Compile-Time Safety • Spelling mistake in column name? • Wrong column type? • Mapped to the wrong class?
  • Compile-Time Safety • Spelling mistake in column name? • Wrong column type? • Mapped to the wrong class? scalac  sees  it  all!
  • Compile-Time Safety • Error messages can destroy the illusion
  • Compile-Time Safety • Error messages can destroy the illusion
  • Relationships • ORM – device.getSite : Site – site.getDevices : List[Device]
  • Relationships • ORM – device.getSite : Site – site.getDevices : List[Device] • Slick – use relational queries with joins Device id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Joins val sitesToDevices = (s:Sites,i:Devices) => s.id === i.siteId val sites = Query(Sites) .filter(_.id === 1L) val devices = Query(Devices).filter(_.price > 1000.0) sites.join( devices ).on( sitesToDevices ) sites join devices on sitesToDevices Device id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Auto joins (1-n) implicit def autojoin1 = joinCondition [Sites,Devices] (_.id === _.siteId) sites autoJoin devices devices autoJoin sites sites.autoJoin( devices, JoinType.Left ) Device id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Join types sites leftJoin devices on sitesToDevices sites rightJoin devices on sitesToDevices sites outerJoin devices on sitesToDevices sites.autoJoin( devices, JoinType.Left ) sites.autoJoin( devices, JoinType.Right ) sites.autoJoin( devices, JoinType.Outer ) Device id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Example Data Model Device Computer Id:  Long Name:  String companyId:  Int 1 n id:  Long price:  Double acquisi5on:  Date Site n 1 id:  Long name:  String
  • Modifying relationships • query for what you want to modify • insert / update that query val device = Queries(Devices).byId(123L) val site = Site(None,"New York") val siteId = Sites.autoInc.insert( site ) device.map(_.siteId).update(siteId) Site id:  Long name:  String
  • What about Inheritance?
  • Inheritance • Relational does not support inheritance • Use relationships instead, you won’t loose (think “has role” instead of “is a”)
  • Example Data Model Site id:  Long name:  String 1 n ResearchSite id:  Long siteId:  Long size:  Size 1 n Produc5onSite id:  Long siteId:  Long volume:  Int
  • Joining all “sub-classes” • a re-usable query that joins Sites with ResearchSites and ProductionSites sites .autoJoin( researchSites, JoinType.Left ) .autoJoinVia( productionSites, JoinType.Left )(_._1) : Query[_,((Site,ResearchSite),ProductionSite)]
  • You can do inheritance Site id:  Long name:  String size:  OpCon[Size] class Sites extends Table[Site]{ ... def * = ... <> ( {case (id,name,Some(size),_) => ResearchSite(id,name,size) case (id,name,_,Some(volume)) => ProductionSite(id,name,volume) }, {case ResearchSite(id,name,size) => (id,name,Some(size),None) case ProductionSite(id,name,volume) => (id,name,None,Some(volume)) } ) }
  • Mental paradigm shift The ORM Way: Executor APIs (DAOs) DevicesDAO .inPriceRange( 500.0, 2000.0 ) : List[Device]
  • Mental paradigm shift The ORM Way: Executor APIs (DAOs) DevicesDAO .inPriceRange( 500.0, 2000.0 ) : List[Device] The Slick Way: Query libraries ( devices : Query[_,Device] ) .inPriceRange( 500.0, 2000.0 ) : Query[_,Device]
  • Mental paradigm shift The ORM Way: Executor APIs (DAOs) DevicesDAO .inPriceRange( 500.0, 2000.0 ) : List[Device] The Slick Way: Query libraries ( devices : Query[_,Device] ) .inPriceRange( 500.0, 2000.0 ) : Query[_,Device] some  stuff  with  criteria  queries,  but  Slick  for  everything  including  joins,  groupBy
  • Write query libraries
  • Row functions class Sites extends Table[Site]{ def name = column( ... ) ... def nameLike( pattern:Column[String] ) : Column[Boolean] = name.toLowerCase like pattern.toLowerCase } Query(Sites).filter( _.nameLike(“EPFL”) )
  • Row functions trait HasName{ this:Table[_] => def name = column( ... ) ... def nameLike( pattern:Column[String] ) : Column[Boolean] = this.name.toLowerCase like pattern.toLowerCase } class Sites extends Table[Site] with HasName class Computers extends Table[Computer] with HasName
  • Query functions def byName[E,T <: Table[E] with HasName] ( q:Query[T,E], pattern:Column[String] ) = q.filter( _nameLike.(pattern) ) byName( Query(Sites), “EPFL” )
  • Refinements • method extensions (implicit conversions) • Option support using Slick’s OptionMapper
  • Suggested Slick app architecture View Controller Database  Session
  • Suggested Slick app architecture View Table  objects HasName{    def  nameLike(  Column[…]  )        :  Column[  …  ] }, Devices, Sites … Controller Database  Session
  • Suggested Slick app architecture View Controller Table  objects Query  Library HasName{    def  nameLike(  Column[…]  )        :  Column[  …  ] }, Devices, Sites … def  byName(    Query[…],    Column[…] )  :  Query[  …  ] def  byId(  Column[…]  )  :  Query[  …  ] … Database  Session
  • Suggested Slick app architecture View Controller Database  Session Table  objects Query  Library Executor  API  /  DAO HasName{    def  nameLike(  Column[…]  )        :  Column[  …  ] }, Devices, Sites … def  byName(    Query[…],    Column[…] )  :  Query[  …  ] def  byName(  String  )  :  List[…] def  byId(  id:Long  )  :  Site def  byId(  Column[…]  )  :  Query[  …  ] …
  • Outlook
  • Slick 2.0 • Coming Q3 / 2013 • Query scheduling • Improved driver architecture – BasicProfile >: RelationalProfile >: SqlProfile >: JdbcProfile • Generate Slick code from database schemas – Proper "type providers" need new Scala • More to come
  • slick.typesafe.com @cvogt @StefanZeiger hYp://slick.typesafe.com/talks/2013_scaladays/2013_scaladays.pdf hYps://github.com/slick/play-­‐slick/tree/scaladays2013

Comments

jose farfan 2 years ago
Hi
The download file has not extension ( pdf )

Login to add comments!

Thumbnail for: Caching reboot: javax.cache & Ehcache 3

Caching reboot: javax.cache & Ehcache 3

Louis Jacomet

free
Thumbnail for: Applications Concurrentes Polyglottes avec Vert.x

Applications Concurrentes Polyglottes avec Vert.x

Julien Viet

free
Thumbnail for: Groovy et son process de release: nous l’avons rendu « grooooooovy » !

Groovy et son process de release: nous l’avons rendu « grooooooovy » !

Guillaume Laforge , Fred Simon , Cédric Champeau

free
Thumbnail for: Machine Learning avec Spark, MLLib et D3.js

Machine Learning avec Spark, MLLib et D3.js

Hayssam Saleh

free
Thumbnail for: Gitflow in action

Gitflow in action

Cécilia Bossard

free
Thumbnail for: Datomic, la base de données qui n'oublie rien

Datomic, la base de données qui n'oublie rien

HIRAM MADELAINE

free
Thumbnail for: Comprendre enfin JavaScript

Comprendre enfin JavaScript

Thierry Chatel

free
Thumbnail for: Allons plus loin avec CDI 1.2

Allons plus loin avec CDI 1.2

Antonin Stefanutti , Antoine Sabot-Durand

free
Thumbnail for: Développement web : ce qui vous attend en 2015

Développement web : ce qui vous attend en 2015

Romain Linsolas

free
Thumbnail for: Oserez vous remplacer JPA par un micro ORM?

Oserez vous remplacer JPA par un micro ORM?

Youen Chéné

free
Thumbnail for: Les nouveaux outils du développeur web

Les nouveaux outils du développeur web

Philippe Antoine

free
Thumbnail for: Scaling Docker with Kubernetes

Scaling Docker with Kubernetes

Carlos Sanchez

free
Thumbnail for: Tout ce que vous avez toujours voulu savoir sur les clients Java HTTP concurrents, asynchrones, sans oser demander!

Tout ce que vous avez toujours voulu savoir sur les clients Java HTTP concurrents, asynchrones, sans oser demander!

Fred Simon

free
Thumbnail for: De la cryptographie dans le navigateur avec WebCrypto API

De la cryptographie dans le navigateur avec WebCrypto API

Jean-Christophe Sirot

free
Thumbnail for: Déboguage de JavaScript

Déboguage de JavaScript

Christophe Jollivet

free
Thumbnail for: Jeu de rôle en ligne massivement multijoueur avec Firebase

Jeu de rôle en ligne massivement multijoueur avec Firebase

Thomas Guerin , Alexis Moussine-Pouchkine

free
Thumbnail for: UX : le Poids des Mots...

UX : le Poids des Mots...

Grégory Weinbach

free
Thumbnail for: Priming Java for Speed

Priming Java for Speed

Gil Tene

free
Thumbnail for: Flux, l'architecture de Facebook

Flux, l'architecture de Facebook

Florent DUVEAU

free
Thumbnail for: Des tablettes d'écriture aux tablettes pour écrire

Des tablettes d'écriture aux tablettes pour écrire

Clarisse Herrenschmidt , Betty Moreau

free
Thumbnail for: Venez découvrir CDI, la perle de Java EE !

Venez découvrir CDI, la perle de Java EE !

Antonio Goncalves

free
Thumbnail for: InfluxDB : la base de données chronologique OpenSource autonome

InfluxDB : la base de données chronologique OpenSource autonome

Nicolas Muller

free
Thumbnail for: Quand Java prend de la vitesse, Apache Maven vous garde sur les rails

Quand Java prend de la vitesse, Apache Maven vous garde sur les rails

Arnaud Héritier , Hervé Boutemy

free
Thumbnail for: DevOps with Java EE

DevOps with Java EE

Arun Gupta

free
Thumbnail for: Building fault tolerant microservices

Building fault tolerant microservices

Christopher Batey

free
Thumbnail for: Elasticsearch - De l'importance du mapping

Elasticsearch - De l'importance du mapping

Jérôme Mainaud

free
Thumbnail for: Les développeurs aussi maîtrisent le systemd

Les développeurs aussi maîtrisent le systemd

Jean-Eudes Couignoux

free
Thumbnail for: Comprendre l'IOT grâce à une boule ... mais pas que

Comprendre l'IOT grâce à une boule ... mais pas que

Laurent HUET , Philippe Charrière

free
Thumbnail for: Java Mission Control for Earthlings

Java Mission Control for Earthlings

James Weaver

free
Thumbnail for: Les monoïdes démystifiés, en Java et avec des verres de bière

Les monoïdes démystifiés, en Java et avec des verres de bière

cyrille martraire

free
Thumbnail for: Anatomie de l'infrastructure de prédiction @Criteo: machine learning, log management, Hadoop.

Anatomie de l'infrastructure de prédiction @Criteo: machine learning, log management, Hadoop.

Jean-Baptiste Note , Laurent Vion

free
Thumbnail for: Créer des applications cognitives avec IBM Watson Engagement Explorer et Bluemix

Créer des applications cognitives avec IBM Watson Engagement Explorer et Bluemix

Philippe Comte

free
Thumbnail for: Un monde où 1 ms vaut 100 M€

Un monde où 1 ms vaut 100 M€

Thierry Abaléa , Alexandre Victoor

free
Thumbnail for: JHipster, le générateur d'applications Spring Boot + AngularJS

JHipster, le générateur d'applications Spring Boot + AngularJS

Julien Dubois

free
Thumbnail for: Refactoring to Functional

Refactoring to Functional

Hadi Hariri

free
Thumbnail for: Level Up your Dev Skills with Static Analysis

Level Up your Dev Skills with Static Analysis

David Lindsay

free
Thumbnail for: De zéro à héros avec Spring Boot

De zéro à héros avec Spring Boot

Stéphane Nicoll , brian clozel

free
Thumbnail for: Utilisation de SparkSQL pour analyser vos données Cassandra en Java, Scala et Python

Utilisation de SparkSQL pour analyser vos données Cassandra en Java, Scala et Python

Alexander DEJANOVSKI , Maxence Lecointe

free
Thumbnail for: Avro: la souplesse du JSON, les performances du binaire

Avro: la souplesse du JSON, les performances du binaire

Alexandre Victoor

free
Thumbnail for: Développer des applications multiplateformes facilement à l'aide de Ionic Framework

Développer des applications multiplateformes facilement à l'aide de Ionic Framework

Stéphanie MOALLIC

free
Thumbnail for: Faites votre Guignol : le bazar des modules Puppet

Faites votre Guignol : le bazar des modules Puppet

Sylvain Veyrié

free
Thumbnail for: Les Cast Codeurs Podcast : table ronde

Les Cast Codeurs Podcast : table ronde

Emmanuel Bernard , Vincent Massol

free
Thumbnail for: Keynote de l’équipe Devoxx France

Keynote de l’équipe Devoxx France

Zouheir Cadi , Antonio Goncalves , Nicolas Martignole

free
Thumbnail for: Eclipse is much more than just an IDE!

Eclipse is much more than just an IDE!

Benjamin Cabé , Wayne Beaton

free
Thumbnail for: "No one at Google uses MapReduce anymore" - Cloud Dataflow explained for dummies

"No one at Google uses MapReduce anymore" - Cloud Dataflow explained for dummies

Martin Görner , Didier Girard

free
Thumbnail for: 15' minutes to setup and try Apache Spark using the Spark Notebook and Docker

15' minutes to setup and try Apache Spark using the Spark Notebook and Docker

andy petrella

free
Thumbnail for: Ask the Architect Questions and Answers

Ask the Architect Questions and Answers

Brian Goetz

free
Thumbnail for: Programmation Lock-Free : les techniques des pros

Programmation Lock-Free : les techniques des pros

Jean-Philippe Bempel

free
Thumbnail for: TypeScript, le JavaScript statiquement typé

TypeScript, le JavaScript statiquement typé

Benoit Lemoine

free
Thumbnail for: Comment "Akka persistence" fera de vous un meilleur développeur !

Comment "Akka persistence" fera de vous un meilleur développeur !

Fred CECILIA (Na!Ky)

free
Thumbnail for: RxJava - From Future To Rx

RxJava - From Future To Rx

Brice Dutheil , David Wursteisen

free
Thumbnail for: Les idées reçues de l'informatique : Quand nos erreurs de raisonnement nous limitent.

Les idées reçues de l'informatique : Quand nos erreurs de raisonnement nous limitent.

Ludovic Cinquin

free
Thumbnail for: Holo to Material Design Transition

Holo to Material Design Transition

Quentin Sallat

free
Thumbnail for: JDBC / JPA / Hibernate: Sans maîtrise la puissance n'est rien

JDBC / JPA / Hibernate: Sans maîtrise la puissance n'est rien

Brice Leporini

free
Thumbnail for: Why postgres SQL deserve noSQL fan respect

Why postgres SQL deserve noSQL fan respect

Quentin Adam

free
Thumbnail for: On n'est pas que des cobayes: ORM et NoSQL sont-ils solubles?

On n'est pas que des cobayes: ORM et NoSQL sont-ils solubles?

Emmanuel Bernard

free
Thumbnail for: API Asynchrones en Java 8

API Asynchrones en Java 8

José Paumard

free
Thumbnail for: Livrer chaque jour ce qui est prêt ! Points clés du développement d'un produit avec une livraison par jour.

Livrer chaque jour ce qui est prêt ! Points clés du développement d'un produit avec une livraison par jour.

Dimitri BAELI , Benjamin Degerbaix

free
Thumbnail for: Un News Feed temps réel personnalisé pour 65 millions d’utilisateurs

Un News Feed temps réel personnalisé pour 65 millions d’utilisateurs

Greg Truchetet , Fabrice Robini , Quentin Suire

free
Thumbnail for: Machine learning et régulation numérique

Machine learning et régulation numérique

Guillaume Laforge , Didier Girard

free
Thumbnail for: Keynote de l'équipe Devoxx France

Keynote de l'équipe Devoxx France

Antonio Goncalves , Rodolphe Gelin , Eric Filiol , Dan Allen , Nicolas Martignole

free
Thumbnail for: L'expérience utilisateur est importante pour nous

L'expérience utilisateur est importante pour nous

Florence Herrou

free
Thumbnail for: UBFC - Ultimate Bug Fighting Championship

UBFC - Ultimate Bug Fighting Championship

Aurélie Ballet , Gaëlle BOURVEN

free
Thumbnail for: Intégrer et exploiter le format de données ouvert GTFS. Fails et succès, ce qui marche et ce qui ne marche pas !

Intégrer et exploiter le format de données ouvert GTFS. Fails et succès, ce qui marche et ce qui ne marche pas !

Alexis Kinsella

free
Thumbnail for: Devops my code

Devops my code

Zouheir Cadi

free
Thumbnail for: OptaPlanner ou comment optimiser les itinéraires, les plannings et bien plus encore...

OptaPlanner ou comment optimiser les itinéraires, les plannings et bien plus encore...

Geoffrey De Smet , Frederic Hornain

free
Thumbnail for: Recettes CQRS, pour bien cuisiner son architecture

Recettes CQRS, pour bien cuisiner son architecture

Thomas JASKULA

free
Thumbnail for: Algorithmes distribués pour le Big Data

Algorithmes distribués pour le Big Data

DuyHai DOAN

free
Thumbnail for: Se préparer dès maintenant à l'arrivée d'Angular 2

Se préparer dès maintenant à l'arrivée d'Angular 2

Romain Linsolas

free
Thumbnail for: Comment manager des Geeks

Comment manager des Geeks

Luc Legardeur

free
Thumbnail for: Comment rater ses benchmarks ?

Comment rater ses benchmarks ?

Pierre Laporte

free
Thumbnail for: Du 100% pur Guice !

Du 100% pur Guice !

Pauline Iogna

free
Thumbnail for: Migration d'une webapp Tomcat vers Vert.x

Migration d'une webapp Tomcat vers Vert.x

Florian Boulay

free
Thumbnail for: Je déploie dans mon datacenter virtuel avec OpenStack

Je déploie dans mon datacenter virtuel avec OpenStack

Sylvain Avril

free
Thumbnail for: Le retour en force de GWT

Le retour en force de GWT

Sami Jaber

free
Thumbnail for: Comment créer un Web Component en moins de 30 minutes

Comment créer un Web Component en moins de 30 minutes

Christophe Jolif

free
Thumbnail for: Reading and Writing in 20 years

Reading and Writing in 20 years

Dan Allen

free
Thumbnail for: La phygitalisation, le super pouvoir du développeur pour créer des objets connectés!

La phygitalisation, le super pouvoir du développeur pour créer des objets connectés!

Cyril Lakech , Bertrand Gressier

free
Thumbnail for: La problématique du contrôle des Technologies de l’information

La problématique du contrôle des Technologies de l’information

Eric Filiol

free
Thumbnail for: Proxy 2.0

Proxy 2.0

Remi Forax

free
Thumbnail for: Java EE 8, a snapshot overview

Java EE 8, a snapshot overview

David Delabassee

free
Thumbnail for: Un Jenkins amélioré avec Docker, Mesos et Marathon

Un Jenkins amélioré avec Docker, Mesos et Marathon

Jean-Louis Rigau

free
Thumbnail for: Développeur sous influence

Développeur sous influence

Guillaume Duquesnay

free
Thumbnail for: Coder sans peur du changement, avec la "même pas mal !" architecture hexagonale

Coder sans peur du changement, avec la "même pas mal !" architecture hexagonale

cyrille martraire , Thomas PIERRAIN

free
Thumbnail for: Web Components, Polymer and Material Design

Web Components, Polymer and Material Design

Horacio Gonzalez

free
Thumbnail for: Présentation de Rust, le langage le plus excitant depuis l'arrivée de Scala

Présentation de Rust, le langage le plus excitant depuis l'arrivée de Scala

Mathieu Poumeyrol , Pierre Baillet

free
Thumbnail for: OpenBCI ou comment lire dans les pensées en Java

OpenBCI ou comment lire dans les pensées en Java

Mathieu ANCELIN

free
Thumbnail for: La Google Cloud Plaform - Au delà des simples démos University

La Google Cloud Plaform - Au delà des simples démos University

David Gageot , Ludovic champenois

free
Thumbnail for: Construire des applications Big Data avec Docker et Mesos.

Construire des applications Big Data avec Docker et Mesos.

Sam Bessalah

free
Thumbnail for: Concurrency in Enterprise Java

Concurrency in Enterprise Java

Arun Gupta

free
Thumbnail for: Plugin Gradle, prenez le contrôle du build !

Plugin Gradle, prenez le contrôle du build !

Cédric Champeau , Eyal LEZMY

free
Thumbnail for: Groovy avec le style !

Groovy avec le style !

Guillaume Laforge

free
Thumbnail for: IoT, Java, and Autonomous Drones

IoT, Java, and Autonomous Drones

James Weaver

free
Thumbnail for: Unit testing concurrent code

Unit testing concurrent code

Rafael Winterhalter

free
Thumbnail for: L'ecosysteme Docker sur Azure

L'ecosysteme Docker sur Azure

Patrick Chanezon

free
Thumbnail for: Tour d’horizon des outils pour être un développeur web productif

Tour d’horizon des outils pour être un développeur web productif

jean-francois Garreau , Julien Landuré

free
Thumbnail for: Hashons peu mais hashons bien

Hashons peu mais hashons bien

Olivier Croisier

free
Thumbnail for: Making Java more dynamic

Making Java more dynamic

Rafael Winterhalter

free
Thumbnail for: Ceylon Idioms

Ceylon Idioms

Gavin King

free
Thumbnail for: App Engine Managed VMs et Fluent-http, un mariage heureux

App Engine Managed VMs et Fluent-http, un mariage heureux

David Gageot

free
Thumbnail for: Le Continuous Merge chez LesFurets.com

Le Continuous Merge chez LesFurets.com

Pflieger Arnaud

free
Thumbnail for: Stockage et analyse temps réel d'événements avec Riak chez Booking.com

Stockage et analyse temps réel d'événements avec Riak chez Booking.com

Damien Krotkine

free
Thumbnail for: React, une autre façon de penser vos composants graphiques

React, une autre façon de penser vos composants graphiques

Mathieu ANCELIN

free
Thumbnail for: I don't always write Reactive applications, but when I do, it runs on Raspberry Pi

I don't always write Reactive applications, but when I do, it runs on Raspberry Pi

Alexandre Delegue , Mathieu ANCELIN

free
Thumbnail for: HAProxy level 2 : des bases aux problématiques de scaling

HAProxy level 2 : des bases aux problématiques de scaling

Nicolas Helleringer

free
Thumbnail for: Elles ressemblent à quoi mes données ?

Elles ressemblent à quoi mes données ?

David Pilato , Colin Surprenant

free
Thumbnail for: Barbus et Barbares

Barbus et Barbares

François le Droff , Romain PELISSE

free
Thumbnail for: 10 trucs que j'ai appris en lisant le code source de Chrome OS

10 trucs que j'ai appris en lisant le code source de Chrome OS

François Beaufort

free
Thumbnail for: La révolution hors-ligne du Web arrive avec les Service Workers

La révolution hors-ligne du Web arrive avec les Service Workers

Hubert Sablonnière

free
Thumbnail for: Write in AsciiDoc, Publish Everywhere!

Write in AsciiDoc, Publish Everywhere!

Dan Allen , Maxime Gréau

free
Thumbnail for:  Dans 20 ans des robots humanoïdes pour tout le monde

Dans 20 ans des robots humanoïdes pour tout le monde

Rodolphe Gelin

free
Thumbnail for: CSS pour les nuls

CSS pour les nuls

Hubert Sablonnière

free
Thumbnail for: Changing the wheel of a moving car - faire évoluer l'infra sans interruption

Changing the wheel of a moving car - faire évoluer l'infra sans interruption

Nicolas De Loof

free
Thumbnail for: Modern Enterprise Java Architectures with Spring 4.1

Modern Enterprise Java Architectures with Spring 4.1

Juergen Hoeller , Stéphane Nicoll

free
Thumbnail for: Ma grand-mère Excel en grammaire Antlr

Ma grand-mère Excel en grammaire Antlr

Florent Ramière

free
Thumbnail for: Finally, Security API JSR 375

Finally, Security API JSR 375

Alex Kosowski

free
Thumbnail for: Infinite Infinispan

Infinite Infinispan

Ray Tsang

free
Thumbnail for: Uniformisez vos postes de développement avec Fig

Uniformisez vos postes de développement avec Fig

Etienne Peiniau

free
Thumbnail for: Streaming/Kafka Avancé

Streaming/Kafka Avancé

Jonathan Winandy , Alexis Guéganno

free
Thumbnail for: Trois heures à l’assaut d’une application réactive

Trois heures à l’assaut d’une application réactive

Nicolas Jozwiak , Xavier Bucchiotty , Vincent Spiewak

free
Thumbnail for: Logstash: l’arme secrète pour vaincre le coté obscur de vos logs

Logstash: l’arme secrète pour vaincre le coté obscur de vos logs

Colin Surprenant

free
Thumbnail for: Java 8 in Anger

Java 8 in Anger

Trisha Gee

free
Thumbnail for: Comment git a sauvé notre projet (ou presque)

Comment git a sauvé notre projet (ou presque)

Cécilia Bossard

free