• Like
Enib   cours c.a.i. web - séance #5 : scala play! framework
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Enib cours c.a.i. web - séance #5 : scala play! framework

  • 994 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
994
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
52
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Conception dApplications Interactives : Applications Web et JEE Séance #5 Scala / Play! Framework
  • 2. Langages alternatives pour la JVM
  • 3. Langages alternatives pour la JVM Java ≠ JVM● Java : Langage qui compile vers du bytecode● JVM : Machine virtuelle qui exécute du bytecode
  • 4. La JVM en tant que plate-forme● Build once, run everywhere ○ Des implémentations de JVM pour la plupart du hardware et OS ○ Bytecode format pivot indépendant de la plate-forme● Tendance à saffranchir de lOS ○ Côté client : navigateur comme plate-forme ○ Côté serveur : JVM comme plate-forme
  • 5. Pourquoi des nouveaux langages If all you have is a hammer, everything looks like a nailJava est un très bon langage généraliste, maispas la solution ultime● Scripting ?● Programmation fonctionnelle ?● Simplification et réduction du boilerplate ?
  • 6. Pourquoi des nouveaux langagessur la JVM● Le target est le bytecode ○ Pas besoin dimplémenter la compilation vers le format natif de chaque OS● Profiter de lécosystème Java ○ Bibliothèques, serveurs, outils... ○ Courbe dadoption moins ardue● Support pour langages à typage dynamique ○ JSR 292, invokedynamic ○ Intégrée à la JVM depuis Java 1.7
  • 7. Quels sont ces langages ?● Des langages nouveaux : ○ Clojure, Groovy, Scala, Ceylon, Kotlin...● Des implémentations dautres langages ○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...
  • 8. JythonInterprète Python écrit en Java, créé en 1997● Compilation de code Python en bytecode● Héritage de classes Java par des classes Python● Scripting de code Python dans un programme Java● Utilisation dobjets Java dans du code PythonTrès utilisé pour prototypage, scripting et exploration desclasses Java http://www.jython.org/
  • 9. JRubyInterprète Ruby écrit en Java, créé en 2001● Equivalente de Jython pout Ruby● Capable de faire tourner Rails● Plus rapide que limplémentation de référence ○ Option JIT http://www.jruby.org/
  • 10. GroovyLangage de POO destiné à la plate-forme Java● Inspiré de Python, Ruby et Smalltalk● Syntaxe très proche de Java● Compilé ○ soit à la volée dynamiquement ○ soit classiquement vers bytecode● Typages statique et dynamique● Support natif pour listes, maps, et expressions régulières● Fermetures ou clôtures (closures)● Surcharge des opérateurs http://groovy.codehaus.org/
  • 11. CeylonNouveau langage pour la JVM par RedHat● "Java tel quils serait si il avait été développé aujourdhui"● Typage statique ○ Types union et intersection● Syntaxe régulière ○ Sucre syntactique ajouté● Modulaire ○ Dépôt Ceylon Herd http://www.ceylon-lang.org/
  • 12. ScalaLangage de programmation multi-paradigme ○ Programmations orientée objet et fonctionnelle● Typage statique, syntaxe concise● Compilé vers bytecode● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 13. Le développeur multi-lingue● Environnement JVM en mouvement continu ○ Nouveaux langages ○ Nouveaux frameworks ○ Nouveaux outils● Ne pas se tenir à jour, ne pas apprendre = stagner, régresser. ○ Un nouveau langage par an ○ Un nouveau framework tous les 3 mois
  • 14. Introduction à Scala
  • 15. ScalaLangage de programmation multi-paradigme ○ Programmations orientée objet et fonctionnelle● Typage statique, syntaxe concise● Compilé vers bytecode● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 16. La console REPLREPL : Read Event Print Loop● Console intéractive pour linterprétation de Scala horacio@horacio-laptop:$ scala Welcome to Scala version 2.10.0-RC3 (Java HotSpot(TM) Server VM, Java 1.6.0_31). Type in expressions to have them evaluated. Type :help for more information. scala> val revolution : Int = 1789 revolution: Int = 1789 scala>
  • 17. val et var● var : variables (mutables)● val : valeurs (constantes, inmutables) scala> val revolution : Int = 1789 revolution: Int = 1789 scala> revolution = 1917 <console>:8: error: reassignment to val revolution = 1917 ^ scala> var variable : String = "Ma variable" variable: String = Ma variable scala> variable = "Notre variable" variable: String = Notre variable scala>
  • 18. Classes● Pas besoin de déclarer les attributs privés et les getters et setters ○ Le constructeur suffit● Constructeur avec des valeurs par défaut scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val guest = Employee() guest: Employee = Employee(guest,30,DevCode) scala> val guestAge = guest.age guestAge: Int = 30 scala>
  • 19. Classes● Définition explicite des paramètres lors des appels aux méthodes● Méthode copy pour créer des copies des objets scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val luke = Employee("Luke", company="LucasArt") luke: Employee = Employee(Luke,30,LucasArt) scala> val yoda = luke.copy("Yoda", age=800) yoda: Employee = Employee(Yoda,800,LucasArt) scala>
  • 20. Collections● Les listes et les maps sont des types natifs ○ Immuables par défaut● Simplification des génériques Java ○ Inférence des types scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> for (n <- numbers) println("Number "+n) Number 1 Number 2 Number 3 scala>
  • 21. Collections● Le for est "très Java" ○ Façon Scala : Utiliser des fonctions functionName { input => body } scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> numbers.foreach { n:Int => // Enter to continue on the next line | println("Number "+n) | } Number 1 Number 2 Number 3 scala>
  • 22. Collections● Dautres exemples des fonctions sur des listes scala> val reversedList = numbers.reverse reversedList: List[Int] = List(3, 2, 1) scala> val numbersLessThan3 = numbers.filter { n => n < 3 } numbersLessThan3: List[Int] = List(1, 2) scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 } oddNumbers: List[Int] = List(1, 3) scala> val higherNumbers = numbers.map { n => n + 10 } higherNumbers: List[Int] = List(11, 12, 13) scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) => | total + element | } sumOfNumbers: Int = 6 scala> val sumOfNumbers = numbers.sum sumOfNumbers: Int = 6 scala> val higherNumbers = numbers.map(_+10) higherNumbers: List[Int] = List(11, 12, 13) scala>
  • 23. Comment apprendreScala ?Je ne vais pas passer une heure à vos passerdes slides● Méthode peu éfficaceTentons quelque chose de nouveau● Approche pratique Essayons les Scala Koans !Scala Koans ? Kesaco ?
  • 24. KoansUne nouvelle façon dapprendre un langage● Des petits cas pratiques ○ Sous la forme de suites de tests unitaires● Chaque cas orienté pour un concept ○ Et un ensemble de tests qui ne passent pas● Objectif : réparer les tests pour quils passent ○ Et apprendre le langage en passantMéthode dapprentissage différente et éfficace !
  • 25. Scala Koans :Learn Scala with the Koans http://www.scalakoans.org/
  • 26. Scala Koans1. Telecharger le .zip sur http://www.scalakoans.org/2. Extraire tout et exécuter le fichier ./sbt3. Compiler les tests avec : > test:compile4. Exécuter tous les koans avec : > ~test-only org.functionalkoans.forscala.Koans ou Exécuter un koan en concret : > ~test-only org.functionalkoans.forscala.AboutAsserts5. Ouvrir le fichier source du koan, léditer et voir si ça passe
  • 27. Cest lheure des Scala Koans !
  • 28. Play! FrameworkPlay 2.0, a Web framework for a new era
  • 29. Le projet Play!Play! est un framework pour● faire du développement web● avec une haute productivité● avec létat de lart des technologies web● sur la JVM
  • 30. Play! : productivité et plaisir● Conçu par des développeurs web pour des développeurs web● Gestion simple, flexible et puissante du protocole HTTP ○ Framework web -> HTTP au centre ○ Stateless, request-response● Facilité de démarrage ○ Courbe dapprentissage douce● Rapidité et simplicité : change le code et recharge la page !● Framework complet, full-stack
  • 31. Play! : pas un jouet● Modèle de programmation HTTP asynchrone● Architecture scalable de haute performance● Modèle reactive, non bloquant● Typage fort
  • 32. Suivons le web ! When a web framework starts an architecture fight with the web, the framework loses.● PHP et Ruby on Rails lont bien compris ○ Si on fait du web, on sadapte au web !● Exemples : session, bouton back...● Play! a une architecture stateless basé sur HTTP
  • 33. Modifiez, rechargez, cest fait !● Devoir redémarrer le serveur après une modif ?● Redéployer car on a changé un fichier ?● A nouveau, regardons PHP ou Ruby on Rails ○ Si on fait du web, on sadapte au web !● Avec Play! il suffit de recharger la page et la modif est prise en compte ○ Ca, cest de la productivité !
  • 34. Play! ne se bat pas contre le web● Des URL à ralonge avec des paramètres techniques ? Cest pas du web, ça !● Play! utilise HTTP comme protocole, avec sa semantique ○ il ne cherche pas à faire son meta-protocole au dessus
  • 35. Le web a évolué● On est au bord dune nouvelle évolution : ○ Les requêtes asynchrones en temps réel ○ Des énormes flux de données ○ Les BDD non relationnelles● Les frameworks classiques ont du mal à sadapter
  • 36. Les limites des frameworksclassiques● Chaque utilisateur connecté consomme des ressources ○ Mémoire, threads...● Modèles basés sur lattente active ○ Synchronisme entre requête et réponse ○ On bloque un thread côté serveur● Les I/O sont bloquantes
  • 37. Play! utilise un modèle réactif● Inversion de contrôle ○ On agit que lorsquon a quelque chose à faire● Sans perte de contrôle ○ Mais on est capable de garder le contrôle● Iteratee/Enumerator IO
  • 38. Play! Framework Voici une petite démo