SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Spring, Hibernate and more, while doing less




                             Gavin Hogan – Software Architect, CommerceHub
A little bit about me.



• Software Architect at CommerceHub
• Working with Java and Groovy for 8 years
• Working with Grails for 3 years
•   Grails in a nutshell
•   Some Grails patterns and philosophy
•   Spring in Grails
•   Object Persistence
•   Grails web technologies
•   Grails plugin ecosystem
•   A closer look at groovy
•   Live demo
•   Q&A
… and a little history



• Grails is a rapid web application development
  framework
• Grails is a full stack framework, not simply a web
  development framework
• Grails Leverages Groovy and Spring extensively
• Modular and extensible though the plugin
  infrastructure
… and a little history



• Backed by SpringSource/VMWare
• Grails is mature, project started in 2005, current
  version is 2.2
• Inspired by Ruby on Rails. An RoR influence remains,
  but it is not a clone.
• Grails was inspired by RoR. Ease of development is a
  primary objective
• Leverage convention over configuration with
  sensible defaults
• Never eliminate flexibility or capability for the price
  of simplicity
• All the power of Spring, Sitemesh, Hibernate is
  available, but common use case are pre configured
• Leverage existing operational capacity and
  expertise. 'Plain old java deployment’
• Portable war based deployment
  • Apache Tomcat is the default container
• ‘Standing on the shoulders of Giants’, Java
  compatibility allows the use of existing industrial
  strength components.
• Grails really is ‘Spring in a can’
• Most grails applications do not have any Spring xml!
• Grails automates the configuration and 'wiring' of
  Spring beans
• Name based ‘convention over configuration’
  • UserService.groovy will automatically generate a
     bean named ‘userService’
  • Object fields are autowired by name
• Plugins and applications can interact with Spring
  lifecyles.
• Controller layer is a wrapper around Spring MVC.
• Spring extensions and subprojects are easy to
  include with plugins.
  • Spring Security
  • Spring Integration
  • Spring Batch
  • …
• Plugins and applications can interact with Spring
  lifecyles.
• Controller layer is a wrapper around Spring MVC.
• Spring extensions and subprojects are easy to
  include with plugins.
  • Spring Security
  • Spring Integration
  • Spring Batch
  • …
• Grails Object Relationship Mapping (GORM) is the
  default persistence layer in a Grails application
• The default GORM implementation is a wrapper
  around Hibernate.
• Alternative implementations for
  MongoDB, Reddis, REST, SimpleDB and Riak exist
• Mapping is sensible by default.
  • Class names name to table names
  • Field names map to column names
• Dynamic finders methods are automatically added
  to your objects at run time
  • E.g. User.findAllByLastName('Hogan') will return
     a list of users objects with that last name
• The finders support composite queries and are very
  capable. Criteria builders and named queries support
  more challenging requirements
• Mapping DSL, gives easy access to common
  configurations for Hibernate persistence
• Controllers and controller actions are automatically
  mapped to urls based on name
  • UserController.list() is mapped to user/list/
• HTTP paramaters are automaticaly bound to
  controller arguments
  • UserController.show(String id) is mapped to
     user/show/<id>
• Binding transparently applies to objects used as
  arguments in controller actions.
  • UserController.update(User u) is mapped to
     <appName>/user/update/<id>?firstName=<firstN
     ame>&lastName=<lastName>
• Generally speaking you do not think about binding
  much when working with Grails
Validation



• Grails provides simple validation DSL for Domain
  and Command objects.
• Common validation constraints built in
  • Unique
  • Size
  • Email
  • Not Blank/Null
• Custom constraints easy to add directly to objects
Validation




• Validation failures generate errors, which are
  automatically associated with i18n message codes
• Validation is intended for domain and command
  objects but can be assigned to POJOs too.
• Grails validation is powerful, but does not provide a
  good business rules capability.
Views



• The default view technology for grails is 'Groovy
  Server Pages' (GSP)
  • Very similar to JSP, fewer rough edges.
• Views are automatically associated with actions
  based upon name
• UserContoller.list() assumes a list.gsp in /views/user/
• Templating is extremely easy, leverages Sitemesh.
Taglibs



• I swore to never use taglibs many years ago, Grails
  makes taglibs a joy
• They are simple reusable view components.
• Taglibs a written as regular groovy Closures, they
  can interplay with each other and the rest of the
  application code
• To create a taglib, simply create a class with ‘TagLib’
  at the end of its name, all public closures will
  automatically become tags
What makes them better that jar files?



• Plugins are core to Grails. Grails itself is built as a
  collection of distinct plugins
• In Grails, plugins are the standard unit of reusable
  code.
• Plugins usually package behavior, not only
  capability.
  • E.g. Including the Shiro security plugin actually
      secures/locks down your application.
What makes them better that jar files?



• Anyone can write a plugin. You can choose to share
  a plugin on grails.org
• The range of plugins is now vast
  • Though quality is varied
  • Suffers from the GitHub effect, “I can share this
     so I will!”
• Not yet…


• Lets talk about Groovy
• Groovy is a dynamic JVM language
• It compiles to java bytecode and runs in the same
  jvm as Java code
• Intended to be familiar/comfortable to Java
  developers
• Groovy provides additional, powerful programing
  features, Closures, Mixins, Meta-Programming
Sensible simplifications



• Closures can be thought of as being similar to
  functions in JavaScript. You can pass them or call
  them.
• Mixins are used to compose complex object
  without inheritance. You may think of them as
  behavioral interfaces, that actually do stuff.
Sensible simplifications



• Meta-programming allows developers to modify
  the behavior of a class at compile-time or
  runtime. Grails extensively uses meta
  programming to add behavior to your application
• Groovy is not strongly typed, ‘def’ is similar to
  ‘var’ in JavaScript, and can be thought of as
  similar to Object in java.
• Some many enhancements to Collections API
Because live coding always works as expected!
@gavinInNY
gavinhogan@gmail.com

Weitere ähnliche Inhalte

Was ist angesagt?

DEVOPS LIVE 2018 JaC
DEVOPS LIVE 2018 JaCDEVOPS LIVE 2018 JaC
DEVOPS LIVE 2018 JaCBrian Mericle
 
Rails Rookies Bootcamp - Blogger
Rails Rookies Bootcamp - BloggerRails Rookies Bootcamp - Blogger
Rails Rookies Bootcamp - BloggerNathanial McConnell
 
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?Weng Wei
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0Eugenio Romano
 
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin CoroutinesThreading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin CoroutinesLauren Yew
 
Introduction to Micronaut at Oracle CodeOne 2018
Introduction to Micronaut at Oracle CodeOne 2018Introduction to Micronaut at Oracle CodeOne 2018
Introduction to Micronaut at Oracle CodeOne 2018graemerocher
 
Micro service architecture - building scalable web solutions - George James -...
Micro service architecture - building scalable web solutions - George James -...Micro service architecture - building scalable web solutions - George James -...
Micro service architecture - building scalable web solutions - George James -...Red Blue Blur Ideas
 
Akka and AngularJS – Reactive Applications in Practice
Akka and AngularJS – Reactive Applications in PracticeAkka and AngularJS – Reactive Applications in Practice
Akka and AngularJS – Reactive Applications in PracticeRoland Kuhn
 
サーバーサイドから見るGraphQL Serverless Meetup #19
サーバーサイドから見るGraphQL Serverless Meetup #19サーバーサイドから見るGraphQL Serverless Meetup #19
サーバーサイドから見るGraphQL Serverless Meetup #19Yutaka Tachibana
 
Introduction to Micronaut - JBCNConf 2019
Introduction to Micronaut - JBCNConf 2019Introduction to Micronaut - JBCNConf 2019
Introduction to Micronaut - JBCNConf 2019graemerocher
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksAndrii Gakhov
 
Scripted - Embracing Eclipse Orion
Scripted - Embracing Eclipse OrionScripted - Embracing Eclipse Orion
Scripted - Embracing Eclipse Orionmartinlippert
 
Cloud-Native Drupal: a survival guide
Cloud-Native Drupal: a survival guideCloud-Native Drupal: a survival guide
Cloud-Native Drupal: a survival guidesparkfabrik
 
Easy Microservices with JHipster - Devoxx BE 2017
Easy Microservices with JHipster - Devoxx BE 2017Easy Microservices with JHipster - Devoxx BE 2017
Easy Microservices with JHipster - Devoxx BE 2017Deepu K Sasidharan
 
Front-End Tools and Workflows
Front-End Tools and WorkflowsFront-End Tools and Workflows
Front-End Tools and WorkflowsSara Vieira
 
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...Vadym Kazulkin
 
Micronaut Deep Dive - Devoxx Belgium 2019
Micronaut Deep Dive - Devoxx Belgium 2019Micronaut Deep Dive - Devoxx Belgium 2019
Micronaut Deep Dive - Devoxx Belgium 2019graemerocher
 
Mongodb at-gilt-groupe-seattle-2012-09-14-final
Mongodb at-gilt-groupe-seattle-2012-09-14-finalMongodb at-gilt-groupe-seattle-2012-09-14-final
Mongodb at-gilt-groupe-seattle-2012-09-14-finalMongoDB
 
MongoDB at Gilt Groupe
MongoDB at Gilt GroupeMongoDB at Gilt Groupe
MongoDB at Gilt GroupeMongoDB
 

Was ist angesagt? (20)

DEVOPS LIVE 2018 JaC
DEVOPS LIVE 2018 JaCDEVOPS LIVE 2018 JaC
DEVOPS LIVE 2018 JaC
 
Rails Rookies Bootcamp - Blogger
Rails Rookies Bootcamp - BloggerRails Rookies Bootcamp - Blogger
Rails Rookies Bootcamp - Blogger
 
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0
 
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin CoroutinesThreading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
Threading Made Easy! A Busy Developer’s Guide to Kotlin Coroutines
 
Introduction to Micronaut at Oracle CodeOne 2018
Introduction to Micronaut at Oracle CodeOne 2018Introduction to Micronaut at Oracle CodeOne 2018
Introduction to Micronaut at Oracle CodeOne 2018
 
Micro service architecture - building scalable web solutions - George James -...
Micro service architecture - building scalable web solutions - George James -...Micro service architecture - building scalable web solutions - George James -...
Micro service architecture - building scalable web solutions - George James -...
 
Akka and AngularJS – Reactive Applications in Practice
Akka and AngularJS – Reactive Applications in PracticeAkka and AngularJS – Reactive Applications in Practice
Akka and AngularJS – Reactive Applications in Practice
 
サーバーサイドから見るGraphQL Serverless Meetup #19
サーバーサイドから見るGraphQL Serverless Meetup #19サーバーサイドから見るGraphQL Serverless Meetup #19
サーバーサイドから見るGraphQL Serverless Meetup #19
 
Introduction to Micronaut - JBCNConf 2019
Introduction to Micronaut - JBCNConf 2019Introduction to Micronaut - JBCNConf 2019
Introduction to Micronaut - JBCNConf 2019
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected Talks
 
Scripted - Embracing Eclipse Orion
Scripted - Embracing Eclipse OrionScripted - Embracing Eclipse Orion
Scripted - Embracing Eclipse Orion
 
React + Redux for Web Developers
React + Redux for Web DevelopersReact + Redux for Web Developers
React + Redux for Web Developers
 
Cloud-Native Drupal: a survival guide
Cloud-Native Drupal: a survival guideCloud-Native Drupal: a survival guide
Cloud-Native Drupal: a survival guide
 
Easy Microservices with JHipster - Devoxx BE 2017
Easy Microservices with JHipster - Devoxx BE 2017Easy Microservices with JHipster - Devoxx BE 2017
Easy Microservices with JHipster - Devoxx BE 2017
 
Front-End Tools and Workflows
Front-End Tools and WorkflowsFront-End Tools and Workflows
Front-End Tools and Workflows
 
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
FaaS or not to FaaS. Visible and invisible benefits of the Serverless paradig...
 
Micronaut Deep Dive - Devoxx Belgium 2019
Micronaut Deep Dive - Devoxx Belgium 2019Micronaut Deep Dive - Devoxx Belgium 2019
Micronaut Deep Dive - Devoxx Belgium 2019
 
Mongodb at-gilt-groupe-seattle-2012-09-14-final
Mongodb at-gilt-groupe-seattle-2012-09-14-finalMongodb at-gilt-groupe-seattle-2012-09-14-final
Mongodb at-gilt-groupe-seattle-2012-09-14-final
 
MongoDB at Gilt Groupe
MongoDB at Gilt GroupeMongoDB at Gilt Groupe
MongoDB at Gilt Groupe
 

Ähnlich wie Introduction to Grails 2013

Dropwizard and Groovy
Dropwizard and GroovyDropwizard and Groovy
Dropwizard and Groovytomaslin
 
Gradle.Enemy at the gates
Gradle.Enemy at the gatesGradle.Enemy at the gates
Gradle.Enemy at the gatesStrannik_2013
 
intoduction to Grails Framework
intoduction to Grails Frameworkintoduction to Grails Framework
intoduction to Grails FrameworkHarshdeep Kaur
 
Starting from scratch in 2017
Starting from scratch in 2017Starting from scratch in 2017
Starting from scratch in 2017Stefano Bonetta
 
When Sightly Meets Slice by Tomasz Niedźwiedź
When Sightly Meets Slice by Tomasz NiedźwiedźWhen Sightly Meets Slice by Tomasz Niedźwiedź
When Sightly Meets Slice by Tomasz NiedźwiedźAEM HUB
 
Gradle 2.breaking stereotypes.
Gradle 2.breaking stereotypes.Gradle 2.breaking stereotypes.
Gradle 2.breaking stereotypes.Stfalcon Meetups
 
Magic with groovy & grails
Magic with groovy & grailsMagic with groovy & grails
Magic with groovy & grailsGeorge Platon
 
Single Page Applications - Desert Code Camp 2012
Single Page Applications - Desert Code Camp 2012Single Page Applications - Desert Code Camp 2012
Single Page Applications - Desert Code Camp 2012Adam Mokan
 
Gradle 2.Write once, builde everywhere
Gradle 2.Write once, builde everywhereGradle 2.Write once, builde everywhere
Gradle 2.Write once, builde everywhereStrannik_2013
 
Grails 3.0 Preview
Grails 3.0 PreviewGrails 3.0 Preview
Grails 3.0 Previewgraemerocher
 
Groovy & Grails - From Scratch to Production
Groovy & Grails - From Scratch to Production Groovy & Grails - From Scratch to Production
Groovy & Grails - From Scratch to Production Tal Maayani
 
Introduction To Groovy And Grails - SpringPeople
Introduction To Groovy And Grails - SpringPeopleIntroduction To Groovy And Grails - SpringPeople
Introduction To Groovy And Grails - SpringPeopleSpringPeople
 
Use Cases of #Grails in #WebApplications
Use Cases of #Grails in #WebApplicationsUse Cases of #Grails in #WebApplications
Use Cases of #Grails in #WebApplicationsXebia IT Architects
 
Using React with Grails 3
Using React with Grails 3Using React with Grails 3
Using React with Grails 3Zachary Klein
 

Ähnlich wie Introduction to Grails 2013 (20)

Dropwizard and Groovy
Dropwizard and GroovyDropwizard and Groovy
Dropwizard and Groovy
 
Gradle.Enemy at the gates
Gradle.Enemy at the gatesGradle.Enemy at the gates
Gradle.Enemy at the gates
 
intoduction to Grails Framework
intoduction to Grails Frameworkintoduction to Grails Framework
intoduction to Grails Framework
 
Starting from scratch in 2017
Starting from scratch in 2017Starting from scratch in 2017
Starting from scratch in 2017
 
When Sightly Meets Slice by Tomasz Niedźwiedź
When Sightly Meets Slice by Tomasz NiedźwiedźWhen Sightly Meets Slice by Tomasz Niedźwiedź
When Sightly Meets Slice by Tomasz Niedźwiedź
 
Gradle 2.breaking stereotypes.
Gradle 2.breaking stereotypes.Gradle 2.breaking stereotypes.
Gradle 2.breaking stereotypes.
 
Magic with groovy & grails
Magic with groovy & grailsMagic with groovy & grails
Magic with groovy & grails
 
Single Page Applications - Desert Code Camp 2012
Single Page Applications - Desert Code Camp 2012Single Page Applications - Desert Code Camp 2012
Single Page Applications - Desert Code Camp 2012
 
Gradle 2.Write once, builde everywhere
Gradle 2.Write once, builde everywhereGradle 2.Write once, builde everywhere
Gradle 2.Write once, builde everywhere
 
Groovygrails
GroovygrailsGroovygrails
Groovygrails
 
Grails 3.0 Preview
Grails 3.0 PreviewGrails 3.0 Preview
Grails 3.0 Preview
 
Groovy & Grails - From Scratch to Production
Groovy & Grails - From Scratch to Production Groovy & Grails - From Scratch to Production
Groovy & Grails - From Scratch to Production
 
Grails
GrailsGrails
Grails
 
Introduction To Groovy And Grails - SpringPeople
Introduction To Groovy And Grails - SpringPeopleIntroduction To Groovy And Grails - SpringPeople
Introduction To Groovy And Grails - SpringPeople
 
Future of Grails
Future of GrailsFuture of Grails
Future of Grails
 
Gradle Again
Gradle AgainGradle Again
Gradle Again
 
Javascript best practices
Javascript best practicesJavascript best practices
Javascript best practices
 
Use Cases of #Grails in #WebApplications
Use Cases of #Grails in #WebApplicationsUse Cases of #Grails in #WebApplications
Use Cases of #Grails in #WebApplications
 
Welcome to React.pptx
Welcome to React.pptxWelcome to React.pptx
Welcome to React.pptx
 
Using React with Grails 3
Using React with Grails 3Using React with Grails 3
Using React with Grails 3
 

Introduction to Grails 2013

  • 1. Spring, Hibernate and more, while doing less Gavin Hogan – Software Architect, CommerceHub
  • 2. A little bit about me. • Software Architect at CommerceHub • Working with Java and Groovy for 8 years • Working with Grails for 3 years
  • 3. Grails in a nutshell • Some Grails patterns and philosophy • Spring in Grails • Object Persistence • Grails web technologies • Grails plugin ecosystem • A closer look at groovy • Live demo • Q&A
  • 4. … and a little history • Grails is a rapid web application development framework • Grails is a full stack framework, not simply a web development framework • Grails Leverages Groovy and Spring extensively • Modular and extensible though the plugin infrastructure
  • 5. … and a little history • Backed by SpringSource/VMWare • Grails is mature, project started in 2005, current version is 2.2 • Inspired by Ruby on Rails. An RoR influence remains, but it is not a clone.
  • 6. • Grails was inspired by RoR. Ease of development is a primary objective • Leverage convention over configuration with sensible defaults • Never eliminate flexibility or capability for the price of simplicity • All the power of Spring, Sitemesh, Hibernate is available, but common use case are pre configured
  • 7. • Leverage existing operational capacity and expertise. 'Plain old java deployment’ • Portable war based deployment • Apache Tomcat is the default container • ‘Standing on the shoulders of Giants’, Java compatibility allows the use of existing industrial strength components.
  • 8. • Grails really is ‘Spring in a can’ • Most grails applications do not have any Spring xml! • Grails automates the configuration and 'wiring' of Spring beans • Name based ‘convention over configuration’ • UserService.groovy will automatically generate a bean named ‘userService’ • Object fields are autowired by name
  • 9. • Plugins and applications can interact with Spring lifecyles. • Controller layer is a wrapper around Spring MVC. • Spring extensions and subprojects are easy to include with plugins. • Spring Security • Spring Integration • Spring Batch • …
  • 10. • Plugins and applications can interact with Spring lifecyles. • Controller layer is a wrapper around Spring MVC. • Spring extensions and subprojects are easy to include with plugins. • Spring Security • Spring Integration • Spring Batch • …
  • 11. • Grails Object Relationship Mapping (GORM) is the default persistence layer in a Grails application • The default GORM implementation is a wrapper around Hibernate. • Alternative implementations for MongoDB, Reddis, REST, SimpleDB and Riak exist • Mapping is sensible by default. • Class names name to table names • Field names map to column names
  • 12. • Dynamic finders methods are automatically added to your objects at run time • E.g. User.findAllByLastName('Hogan') will return a list of users objects with that last name • The finders support composite queries and are very capable. Criteria builders and named queries support more challenging requirements • Mapping DSL, gives easy access to common configurations for Hibernate persistence
  • 13. • Controllers and controller actions are automatically mapped to urls based on name • UserController.list() is mapped to user/list/ • HTTP paramaters are automaticaly bound to controller arguments • UserController.show(String id) is mapped to user/show/<id>
  • 14. • Binding transparently applies to objects used as arguments in controller actions. • UserController.update(User u) is mapped to <appName>/user/update/<id>?firstName=<firstN ame>&lastName=<lastName> • Generally speaking you do not think about binding much when working with Grails
  • 15. Validation • Grails provides simple validation DSL for Domain and Command objects. • Common validation constraints built in • Unique • Size • Email • Not Blank/Null • Custom constraints easy to add directly to objects
  • 16. Validation • Validation failures generate errors, which are automatically associated with i18n message codes • Validation is intended for domain and command objects but can be assigned to POJOs too. • Grails validation is powerful, but does not provide a good business rules capability.
  • 17. Views • The default view technology for grails is 'Groovy Server Pages' (GSP) • Very similar to JSP, fewer rough edges. • Views are automatically associated with actions based upon name • UserContoller.list() assumes a list.gsp in /views/user/ • Templating is extremely easy, leverages Sitemesh.
  • 18. Taglibs • I swore to never use taglibs many years ago, Grails makes taglibs a joy • They are simple reusable view components. • Taglibs a written as regular groovy Closures, they can interplay with each other and the rest of the application code • To create a taglib, simply create a class with ‘TagLib’ at the end of its name, all public closures will automatically become tags
  • 19. What makes them better that jar files? • Plugins are core to Grails. Grails itself is built as a collection of distinct plugins • In Grails, plugins are the standard unit of reusable code. • Plugins usually package behavior, not only capability. • E.g. Including the Shiro security plugin actually secures/locks down your application.
  • 20. What makes them better that jar files? • Anyone can write a plugin. You can choose to share a plugin on grails.org • The range of plugins is now vast • Though quality is varied • Suffers from the GitHub effect, “I can share this so I will!”
  • 21. • Not yet… • Lets talk about Groovy
  • 22. • Groovy is a dynamic JVM language • It compiles to java bytecode and runs in the same jvm as Java code • Intended to be familiar/comfortable to Java developers • Groovy provides additional, powerful programing features, Closures, Mixins, Meta-Programming
  • 23. Sensible simplifications • Closures can be thought of as being similar to functions in JavaScript. You can pass them or call them. • Mixins are used to compose complex object without inheritance. You may think of them as behavioral interfaces, that actually do stuff.
  • 24. Sensible simplifications • Meta-programming allows developers to modify the behavior of a class at compile-time or runtime. Grails extensively uses meta programming to add behavior to your application • Groovy is not strongly typed, ‘def’ is similar to ‘var’ in JavaScript, and can be thought of as similar to Object in java. • Some many enhancements to Collections API
  • 25. Because live coding always works as expected!
  • 26.