Design Summit - Migrating to Ruby 2 - Joe RafanielloManageIQ
ManageIQ currently runs on Ruby 1.9.3. This presentation is about the effort to move ManageIQ to Ruby 2.x to take advantage of new features and performance in the language and runtime engine.
For more on ManageIQ, see http://manageiq.org/
Converting Your Dev Environment to a Docker Stack - php[world]Dana Luther
Heard a lot about docker but not sure where to start? Frustrated maintaining development VMs? In this presentation we will go over the simplest ways to convert your development environment over to a docker stack, including support for full acceptance testing with Selenium. We’ll then go over how to modify the stack to mimic your production/pre-production environment(s) as closely as possible, and demystify working with the containers in the stack.
Converting Your Dev Environment to a Docker Stack - CascadiaDana Luther
Heard a lot about docker but not sure where to start? In this presentation we will go over the simplest ways to convert your development environment over to a docker stack, including support for full acceptance testing with Selenium. We’ll then go over how to modify the stack to mimic your production/pre-production environment(s) as closely as possible, and demystify working with the containers in the stack.
Puppet is a configuration management tool which allows easy deployment and configuration ranging from 1 to 1 thousand servers (and even more). Even though its common knowledge for devops, puppet is still a strange piece of software for developers. How does it work and what can it do for you as a developer?
With PHP 5.6 there are some great new features. We'll go over some of these features and how to use them. This includes variadic functions, constant scalar expressions, exponentiation, splat operator, use const/function, php input, phpdbg, and more. We will also cover deprecated features in PHP 5.6. Want to get involved with upcoming release? I'll show you how you can 'make_test' to start helping out.
Writing concurrent code that is also correct is unbelievably hard. Naturally, humanity has developed a number of approaches to handle concurrency in the code, starting from basic threads that follow the hardware way to do concurrency to higher level primitives like fibers and work-stealing solutions. But which approach is the best for you? In this session, we'll take a look at a simple concurrent problem and solve it using different ways to manage concurrency: threads, executors, actors, fibers, monadic code with completable futures. All these approaches are different from the simplicity, readability, configuration and management point of view. Some scenarios are better modelled with threads, while sometimes you're better off with actors. We'll discuss the benefits of each approach and figure out when it's worth pursuing in your project.
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
Groovy Update: what's new in 1.8 and what's coming in 1.9
The Groovy Development team is releasing Groovy 1.8, and this session will cover the new features including improved support for advanced and readable Domain-Specific Languages thanks to Groovy 1.8's "Extended Command Expressions", new performance improvements in the area of integer arithmetics, built-in support for parsing and producing JSON payloads, new AST transformations and now GPars come already bundled.
Design Summit - Migrating to Ruby 2 - Joe RafanielloManageIQ
ManageIQ currently runs on Ruby 1.9.3. This presentation is about the effort to move ManageIQ to Ruby 2.x to take advantage of new features and performance in the language and runtime engine.
For more on ManageIQ, see http://manageiq.org/
Converting Your Dev Environment to a Docker Stack - php[world]Dana Luther
Heard a lot about docker but not sure where to start? Frustrated maintaining development VMs? In this presentation we will go over the simplest ways to convert your development environment over to a docker stack, including support for full acceptance testing with Selenium. We’ll then go over how to modify the stack to mimic your production/pre-production environment(s) as closely as possible, and demystify working with the containers in the stack.
Converting Your Dev Environment to a Docker Stack - CascadiaDana Luther
Heard a lot about docker but not sure where to start? In this presentation we will go over the simplest ways to convert your development environment over to a docker stack, including support for full acceptance testing with Selenium. We’ll then go over how to modify the stack to mimic your production/pre-production environment(s) as closely as possible, and demystify working with the containers in the stack.
Puppet is a configuration management tool which allows easy deployment and configuration ranging from 1 to 1 thousand servers (and even more). Even though its common knowledge for devops, puppet is still a strange piece of software for developers. How does it work and what can it do for you as a developer?
With PHP 5.6 there are some great new features. We'll go over some of these features and how to use them. This includes variadic functions, constant scalar expressions, exponentiation, splat operator, use const/function, php input, phpdbg, and more. We will also cover deprecated features in PHP 5.6. Want to get involved with upcoming release? I'll show you how you can 'make_test' to start helping out.
Writing concurrent code that is also correct is unbelievably hard. Naturally, humanity has developed a number of approaches to handle concurrency in the code, starting from basic threads that follow the hardware way to do concurrency to higher level primitives like fibers and work-stealing solutions. But which approach is the best for you? In this session, we'll take a look at a simple concurrent problem and solve it using different ways to manage concurrency: threads, executors, actors, fibers, monadic code with completable futures. All these approaches are different from the simplicity, readability, configuration and management point of view. Some scenarios are better modelled with threads, while sometimes you're better off with actors. We'll discuss the benefits of each approach and figure out when it's worth pursuing in your project.
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
Groovy Update: what's new in 1.8 and what's coming in 1.9
The Groovy Development team is releasing Groovy 1.8, and this session will cover the new features including improved support for advanced and readable Domain-Specific Languages thanks to Groovy 1.8's "Extended Command Expressions", new performance improvements in the area of integer arithmetics, built-in support for parsing and producing JSON payloads, new AST transformations and now GPars come already bundled.
Из презентации вы узнаете:
про большинство утилит из арсенала Go, предназначенных для оптимизации производительности;
— как и когда их (утилиты) использовать, а также мы посмотрим как они устроены внутри;
— про применимость linux утилиты perf для оптимизации программ на Go.
Кроме того, устроим небольшой crash course, в рамках которого поэтапно соптимизируем несколько небольших программ на Go с использованием вышеперечисленных утилит.
Advanced Topics in Continuous DeploymentMike Brittain
Like what you've read? We're frequently hiring for a variety of engineering roles at Etsy. If you're interested, drop me a line or send me your resume: mike@etsy.com.
http://www.etsy.com/careers
During one of my personal projects I decided to study the internals of Android and the potential of altering the Dalvik VM (e.g. Xposed framework and Cydia) and application behaviour. Not going into detail about runtime hooking of constructors and classes like these two tools provide, I also explored the possibility of reverse engineering and modifying existing applications.
In the web you can find multiple tutorials on Android reverse engineering of applications but not many that do it with real applications that are often subject to obfuscation or with complex execution flows. So in order to learn I decided to pick a common application such as Skype and do the following:
decompile it
study contents and completely remove some functionality (e.g. ads)
change some resources (not described in presentation bellow)
recompile, sign and install.
Used tools include :
apktool – for (de)compiling android applications
jarsigner – for signing android applications
xposed – for intercepting runtime execution flow (will make public in future)
The following presentation describes the steps taken in order to completely remove the ads from skype. This includes any computation or data plan usage the ads consume. Please note the disclaimer of the presentation as this information is for educational purposes only.
Check my website : www.marioalmeida.eu
Continuous Integration & Continuous Delivery with GCPKAI CHU CHUNG
quick introduction to CI & CD with Google cloud platform
- App Engine Development
- Devops: CI & CD (Docker, gitlab, GCP)
- Tips & Study information
repo: https://gitlab.com/cage1016/gae-flask
Automating with operators - FossAsia Summit 2019Jorge Morales
Kubernetes scales and manages stateless applications quite easily. Stateful applications can require more work. Databases, caching systems, and file stores are harder to dynamically manage with data intact, and sometimes come with their own notion of clustering. Operators are Kubernetes agents that know how to deploy, scale, manage, backup, and even upgrade complex, stateful applications.
This talk will provide an update on the Operator pattern introduced by CoreOS, adopted by many community projects like Rook, Prometheus, and others, and supported by this spring’s release of the Operator Framework by Red Hat. With an understanding of Operators in place, the session will go on to detail the Operator Framework and its main components, the Operator SDK and the Lifecycle management backplane.
GitGot: The Swiss Army Chainsaw of Git Repo ManagementJohn Anderson
GitGot is a Perl-based tool for batch management of collections of git repos. It has a number of interesting features and acts as a force multiplier when dealing with a large varied collection of repositories. My talk will cover why you would want to use GitGot as well as how to use it effectively.
Guillaume Laforge, Product Ninja & Advocate at Restlet and Chair of the Apache Groovy PMC, presented about how to use Groovy for developing and consuming REST Web APIs at the JavaOne 2015 conference
MySQL Group Replication - HandsOn TutorialKenny Gryp
During this tutorial, attendees have their hands on virtual machines and migrate standard Master - Slave architecture to the new MySQL native Group Replication.
After explaining briefly what is group replication and how this is important for MySQL HA architecture. We will cover how to verify the workload and the scheme to how GR can be used and configured.
Then we will go trough the migration steps with minimal impact on the live system.
Basic administration tasks are covered such as add/remove a node from the cluster. We also play with performance_schema to monitor our Group Replication cluster and understand how to control it.
Fort de ses 1.7 millions de téléchargements l'an passé, Groovy continue son bonhomme de chemin en tête parmi les langages de programmation alternatifs pour la JVM.
Groovy 2.0, sorti l'an passé, introduisait dans son offre de la modularité, le support de JDK 7 au niveau syntaxique avec "Project Coin" autant qu'au niveau JVM avec l'utilisation d'"invoke dynamic", et proposait des fonctionnalités de typage et de compilation statique.
Groovy 2.1, quant à lui, s'appuie sur ces bases pour compléter le support d'"invoke dynamic" pour plus de performances. Il propose des améliorations permettant de documenter, d'aider les IDEs, et de vérifier statiquement les Domain-Specific Languages construits avec Groovy. Vous pourrez créer des méta-annotations regroupant d'autres annotations, pour éviter l'annotation "hell". Et enfin, vous irez encore plus loin dans la customisation du compilateur !
Accrochez votre ceinture, paré au décollage !
"Groovy 2.0 and beyond" presentation given at the Groovy/Grails eXchange conference.
Video can be seen here:
http://skillsmatter.com/podcast/groovy-grails/keynote-speech
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
Paul King, Andrew Eisenberg and Guillaume Laforge present about implementation of Domain-Specific Languages in Groovy, while at the SpringOne2GX 2012 conference in Washington DC.
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
Design Your Own Domain Specific Language
This talk examines how dynamic languages in general and Groovy in particular provide toos to help design programming languages that are closer of the natural language of the target subject matter expert. It offers many features that allow you to create embedded DSLs: Closures, compile-time and run-time metaprogramming, operator overloading, named arguments, a more concise and expressive syntax and more.
Elevating Tactical DDD Patterns Through Object CalisthenicsDorra BARTAGUIZ
After immersing yourself in the blue book and its red counterpart, attending DDD-focused conferences, and applying tactical patterns, you're left with a crucial question: How do I ensure my design is effective? Tactical patterns within Domain-Driven Design (DDD) serve as guiding principles for creating clear and manageable domain models. However, achieving success with these patterns requires additional guidance. Interestingly, we've observed that a set of constraints initially designed for training purposes remarkably aligns with effective pattern implementation, offering a more ‘mechanical’ approach. Let's explore together how Object Calisthenics can elevate the design of your tactical DDD patterns, offering concrete help for those venturing into DDD for the first time!
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
Pushing the limits of ePRTC: 100ns holdover for 100 daysAdtran
At WSTS 2024, Alon Stern explored the topic of parametric holdover and explained how recent research findings can be implemented in real-world PNT networks to achieve 100 nanoseconds of accuracy for up to 100 days.
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...James Anderson
Effective Application Security in Software Delivery lifecycle using Deployment Firewall and DBOM
The modern software delivery process (or the CI/CD process) includes many tools, distributed teams, open-source code, and cloud platforms. Constant focus on speed to release software to market, along with the traditional slow and manual security checks has caused gaps in continuous security as an important piece in the software supply chain. Today organizations feel more susceptible to external and internal cyber threats due to the vast attack surface in their applications supply chain and the lack of end-to-end governance and risk management.
The software team must secure its software delivery process to avoid vulnerability and security breaches. This needs to be achieved with existing tool chains and without extensive rework of the delivery processes. This talk will present strategies and techniques for providing visibility into the true risk of the existing vulnerabilities, preventing the introduction of security issues in the software, resolving vulnerabilities in production environments quickly, and capturing the deployment bill of materials (DBOM).
Speakers:
Bob Boule
Robert Boule is a technology enthusiast with PASSION for technology and making things work along with a knack for helping others understand how things work. He comes with around 20 years of solution engineering experience in application security, software continuous delivery, and SaaS platforms. He is known for his dynamic presentations in CI/CD and application security integrated in software delivery lifecycle.
Gopinath Rebala
Gopinath Rebala is the CTO of OpsMx, where he has overall responsibility for the machine learning and data processing architectures for Secure Software Delivery. Gopi also has a strong connection with our customers, leading design and architecture for strategic implementations. Gopi is a frequent speaker and well-known leader in continuous delivery and integrating security into software delivery.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionAggregage
Join Maher Hanafi, VP of Engineering at Betterworks, in this new session where he'll share a practical framework to transform Gen AI prototypes into impactful products! He'll delve into the complexities of data collection and management, model selection and optimization, and ensuring security, scalability, and responsible use.
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfPeter Spielvogel
Building better applications for business users with SAP Fiori.
• What is SAP Fiori and why it matters to you
• How a better user experience drives measurable business benefits
• How to get started with SAP Fiori today
• How SAP Fiori elements accelerates application development
• How SAP Build Code includes SAP Fiori tools and other generative artificial intelligence capabilities
• How SAP Fiori paves the way for using AI in SAP apps
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
Enhancing Performance with Globus and the Science DMZGlobus
ESnet has led the way in helping national facilities—and many other institutions in the research community—configure Science DMZs and troubleshoot network issues to maximize data transfer performance. In this talk we will present a summary of approaches and tips for getting the most out of your network infrastructure using Globus Connect Server.
2. Guillaume Laforge
• Groovy Project Manager at VMware
• Initiator of the Grails framework
• Creator of the Gaelyk toolkit
• Co-author of Groovy in Action
• Speaking worldwide w/ a French accent
• Follow me on...
• My blog: http://glaforge.appspot.com
• Twitter: @glaforge
• Google+: http://gplus.to/glaforge
2 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
3. Guillaume Laforge
• Groovy Project Manager at VMware
• Initiator of the Grails framework
• Creator of the Gaelyk toolkit
• Co-author of Groovy in Action
• Speaking worldwide w/ a French accent
• Follow me on...
• My blog: http://glaforge.appspot.com
• Twitter: @glaforge
• Google+: http://gplus.to/glaforge
2 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
18. Command chains expressions
• A grammar improvement allowing you to
drop dots & parens when chaining method calls
– an extended version of top-level statements like println
7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
19. Command chains expressions
• A grammar improvement allowing you to
drop dots & parens when chaining method calls
– an extended version of top-level statements like println
7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
20. Command chains expressions
• A grammar improvement allowing you to
drop dots & parens when chaining method calls
– an extended version of top-level statements like println
• Less dots, less parens allow you to
– write more readable business rules
– in almost plain English sentences
• (or any language, of course)
7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
21. Command chains expressions
• A grammar improvement allowing you to
drop dots & parens when chaining method calls
– an extended version of top-level statements like println
• Less dots, less parens allow you to
– write more readable business rules
– in almost plain English sentences
• (or any language, of course)
7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
22. Command chains expressions
• A grammar improvement allowing you to
drop dots & parens when chaining method calls
– an extended version of top-level statements like println
• Less dots, less parens allow you to
– write more readable business rules
– in almost plain English sentences
• (or any language, of course)
• Let’s have a look at some examples
7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
23. Command chains expressions
turn left then right
8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
24. Command chains expressions
Alternation of
method names
turn left then right
8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
25. Command chains expressions
Alternation of
method names
turn left then right
and parameters
(even named ones)
8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
26. Command chains expressions
turn left then right
8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
27. Command chains expressions
Equivalent to:
( ). ( )
turn left then right
8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
29. Command chains expressions
Before... we used to do...
take 2.pills, of: chloroquinine, after: 6.hours
10 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
30. Command chains expressions
Before... we used to do...
take 2.pills, of: chloroquinine, after: 6.hours
Normal argument
10 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
31. Command chains expressions
Before... we used to do...
take 2.pills, of: chloroquinine, after: 6.hours
Normal argument Named arguments
10 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
32. Command chains expressions
Before... we used to do...
take 2.pills, of: chloroquinine, after: 6.hours
Normal argument Named arguments
Woud call:
def take(Map m, Quantity q)
10 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
33. Command chains expressions
Now, even less punctuation!
take 2.pills of chloroquinine after 6.hours
11 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
34. Command chains expressions
Now, even less punctuation!
( ). ( ). ( )
take 2.pills of chloroquinine after 6.hours
11 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
35. Command chains expressions
// environment initialization
Integer.metaClass.getPills { ‐> delegate }
Integer.metaClass.getHours { ‐> delegate }
// variable injection
def chloroquinine = /*...*/
{ }
// implementing the DSL logic
def take(n) {
[of: { drug ‐>
[after: { time ‐> /*...*/ }]
}]
}
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
take 2.pills of chloroquinine after 6.hours
12 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
36. Command chains expressions
take 2.pills of chloroquinine after 6.hours
13 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
37. Command chains expressions
take 2.pills of chloroquinine after 6.hours
... some dots remain ...
13 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
38. Command chains expressions
Yes, we can... get rid of them :-)
take 2 pills of chloroquinine after 6 hours
14 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
39. Command chains expressions
Yes, we can... get rid of them :-)
( ). ( ). ( ). ( )
take 2 pills of chloroquinine after 6 hours
14 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
40. Command chains expressions
// variable injection
def (of, after, hours) = /*...*/
// implementing the DSL logic
{ }
def take(n) {
[pills: { of ‐>
[chloroquinine: { after ‐>
['6': { time ‐> }]
}]
}]
}
// ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
take 2 pills of chloroquinine after 6 hours
15 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
43. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
44. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
45. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
46. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
47. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
48. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
49. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
select all unique() from names
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
50. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
select all unique() from names
// possible with an odd number of terms
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
51. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
select all unique() from names
// possible with an odd number of terms
take 3 cookies
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
52. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
( ). ( ). ( )
// leverage named‐args as punctuation
check that: margarita tastes good
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
select all unique() from names
// possible with an odd number of terms
take 3 cookies
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
53. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
( ). ( ). ( )
// leverage named‐args as punctuation
check that: margarita tastes good
( ). ( )
// closure parameters for new control structures
given {} when {} then {}
// zero‐arg methods require parens
select all unique() from names
// possible with an odd number of terms
take 3 cookies
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
54. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
( ). ( ). ( )
// leverage named‐args as punctuation
check that: margarita tastes good
( ). ( )
// closure parameters for new control structures
given {} when {} then {}
( ). ( ). ( )
// zero‐arg methods require parens
select all unique() from names
// possible with an odd number of terms
take 3 cookies
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
55. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
( ). ( ). ( )
// leverage named‐args as punctuation
check that: margarita tastes good
( ). ( )
// closure parameters for new control structures
given {} when {} then {}
( ). ( ). ( )
// zero‐arg methods require parens
select all unique() from names
( ). . ( )
// possible with an odd number of terms
take 3 cookies
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
56. Command chains expressions
// methods with multiple arguments (commas)
take coffee with sugar, milk and liquor
( ). ( ). ( )
// leverage named‐args as punctuation
check that: margarita tastes good
( ). ( )
// closure parameters for new control structures
given {} when {} then {}
( ). ( ). ( )
// zero‐arg methods require parens
select all unique() from names
( ). . ( )
// possible with an odd number of terms
take 3 cookies
( ).
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge 16
57. Runtime performance improvements
• Significant runtime improvements
for primitive type operations
– classical Fibonacci example x13 faster!
– almost as fast as Java
• Some direct method calls on this
17 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
58. GPars bundled
• GPars is bundled in the Groovy distribution
• GPars covers a wide range of parallel and concurrent
paradigms
– actors, fork/join, map/filter/reduce, dataflow, agents, STM
– parallel arrays, executors, and more...
• Don’t miss the following presentations on GPars
– Paul King — Thursday, 12:45 - 2:15PM
• Groovy & Concurrency with GPars
– Venkat Subramaniam — Friday, 8:30 - 10:00AM
18 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
60. Closure annotation parameters
@Retention(RetentionPolicy.RUNTIME)
@interface Invariant {
Class value() // a closure class
}
{ @Invariant({ number >= 0 })
class Distance {
float number
String unit
}
def d = new Distance(number: 10, unit: "meters")
def anno = Distance.getAnnotation(Invariant)
def check = anno.value().newInstance(d, d)
assert check(d)
20 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
61. Closure annotation parameters
@Retention(RetentionPolicy.RUNTIME)
@interface Invariant {
Class value() // a closure class
}
{ @Invariant({ number >= 0 })
class Distance {
float number an’s G
Cont racts
String unit P oor-m
}
def d = new Distance(number: 10, unit: "meters")
def anno = Distance.getAnnotation(Invariant)
def check = anno.value().newInstance(d, d)
assert check(d)
20 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
66. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
67. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
68. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
69. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
70. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
71. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
72. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
73. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
74. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
75. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
// at most 10 invocations cached
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
76. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
// at most 10 invocations cached
def plusAtMost = { ... }.memoizeAtMost(10)
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
77. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
// at most 10 invocations cached
def plusAtMost = { ... }.memoizeAtMost(10)
// between 10 and 20 invocations cached
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
78. Closure memoization
def plus = { a, b ‐> sleep 1000; a + b }.memoize()
assert plus(1, 2) == 3 // after 1000ms
assert plus(1, 2) == 3 // return immediately
assert plus(2, 2) == 4 // after 1000ms
assert plus(2, 2) == 4 // return immediately
// at least 10 invocations cached
def plusAtLeast = { ... }.memoizeAtLeast(10)
// at most 10 invocations cached
def plusAtMost = { ... }.memoizeAtMost(10)
// between 10 and 20 invocations cached
def plusAtLeast = { ... }.memoizeBetween(10, 20)
23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
88. @Log
• Four different loggers can be injected
– @Log, @Commons, @Log4j, @Slf4j
• Possible to implement your own strategy
import groovy.util.logging.*
@Log
class Car {
Car() {
log.info 'Car constructed'
}
}
def c = new Car()
30 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
89. @Log
• Four different loggers can be injected
– @Log, @Commons, @Log4j, @Slf4j
• Possible to implement your own strategy
import groovy.util.logging.*
@Log
class Car {
Guarded Car() {
w/ an if log.info 'Car constructed'
}
}
def c = new Car()
30 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
90. @Field
• Surprising scoping rules in scripts
– variables are local to the run() method
– variables aren’t visible in methods
• although visually the variable is in a surrounding scope
• @Field creates a field in the script class
@Field List awe = [1, 2, 3]
def awesum() { awe.sum() }
assert awesum() == 6
31 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
91. Controlling code execution
• Your application may run user’s code
– what if the code runs in infinite loops or for too long?
– what if the code consumes too many resources?
32 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
92. Controlling code execution
• Your application may run user’s code
– what if the code runs in infinite loops or for too long?
– what if the code consumes too many resources?
• 3 new transforms at your rescue
– @ThreadInterrupt: adds Thread#isInterrupted checks so your
executing thread stops when interrupted
– @TimedInterrupt: adds checks in method and closure bodies to
verify it’s run longer than expected
– @ConditionalInterrupt: adds checks with your own conditional
logic to break out from the user code
32 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
93. @ThreadInterrupt
@ThreadInterrupt
import groovy.transform.ThreadInterrupt
while (true) {
// eat lots of CPU
}
33
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
94. @ThreadInterrupt
@ThreadInterrupt
import groovy.transform.ThreadInterrupt
while (true) {
{ if (Thread.currentThread.isInterrupted())
throw new InterruptedException() }
// eat lots of CPU
}
33
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
95. @ThreadInterrupt
@ThreadInterrupt
import groovy.transform.ThreadInterrupt
while (true) {
{ if (Thread.currentThread.isInterrupted())
throw new InterruptedException() }
// eat lots of CPU
}
• Two optional annotation parameters available
– checkOnMethodStart (true by default)
– applyToAllClasses (true by default)
33
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
96. @TimedInterrupt
@TimedInterrupt(10)
import groovy.transform.TimedInterrupt
while (true) {
// eat lots of CPU
}
• InterruptedException thrown when checks indicate code
ran longer than desired
• Optional annotation parameters available
– same as @ThreadInterrupt
– value: for an amount of time duration
34 – unit: for the time duration unit (TimeUnit.SECONDS)
@glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
97. @ConditionalInterrupt
• Specify your own condition to be inserted
at the start of method and closure bodies
– check for available resources, number of times run, etc.
• Leverages closure annotation parameters from Groovy 1.8
@ConditionalInterrupt({ counter++ > 2 })
import groovy.transform.ConditionalInterrupt
import groovy.transform.Field
@Field int counter = 0
100.times {
println 'executing script method...'
}
35 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
98. @ToString
• Provides a default toString() method to your types
• Available annotation options
– includeNames, includeFields, includeSuper, excludes
import groovy.transform.ToString
@ToString
class Person {
String name
int age
}
println new Person(name: 'Pete', age: 15)
// => Person(Pete, 15)
36 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
99. @EqualsAndHashCode
• Provides default implementations for equals() and
hashCode() methods
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode
class Coord {
int x, y
}
def c1 = new Coord(x: 20, y: 5)
def c2 = new Coord(x: 20, y: 5)
assert c1 == c2
assert c1.hashCode() == c2.hashCode()
37 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
100. @TupleConstructor
• Provides a «classical» constructor with all properties
• Several annotation parameter options available
import groovy.transform.TupleConstructor
@TupleConstructor
class Person {
String name
int age
}
def m = new Person('Marion', 3)
assert m.name == 'Marion'
assert m.age == 3
38 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
101. @Canonical
• One annotation to rule them all!
– @Canonical mixes together
• @ToString
• @EqualsAndHashCode
• @TupleConstructor
• You can customize behavior by combining
@Canonical and one of the other annotations
39 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
102. @InheritConstructor
• Classes like Exception are painful when extended, as all
the base constructors should be replicated
class CustomException extends Exception {
CustomException() { super() }
CustomException(String msg) { super(msg) }
CustomException(String msg, Throwable t) { super(msg, t) }
CustomException(Throwable t) { super(t) }
}
40 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
103. @InheritConstructor
• Classes like Exception are painful when extended, as all
the base constructors should be replicated
import groovy.transform.*
@InheritConstructors
class CustomException extends Exception {
CustomException() { super() }
CustomException(String msg) { super(msg) }
CustomException(String msg, Throwable t) { super(msg, t) }
CustomException(Throwable t) { super(t) }
}
40 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
104. @WithReadLock, @WithWriteLock
import groovy.transform.*
class ResourceProvider {
private final Map<String, String> data = new HashMap<>()
@WithReadLock
String getResource(String key) {
return data.get(key)
}
@WithWriteLock
void refresh() {
//reload the resources into memory
}
}
41 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
105. @WithReadLock, @WithWriteLock
import groovy.transform.*
class ResourceProvider {
private final Map<String, String> data = new HashMap<>()
{ @WithReadLock
String getResource(String key) {
return data.get(key)
}
{ @WithWriteLock
void refresh() {
//reload the resources into memory
}
}
41 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
106. Miscelanous
• Compilation customizers
• Java 7 diamond operator
• Slashy and dollar slashy strings
• New GDK methods
• (G)String to Enum coercion
42 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
107. Compilation customizers
• Ability to apply some customization to the Groovy
compilation process
• Three available customizers
– ImportCustomizer
– SecureASTCustomizer
– ASTTransformationCustomizer
• But you can implement your own
43 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
108. Imports customizer
def configuration = new CompilerConfiguration()
def custo = new ImportCustomizer()
custo.addStaticStar(Math.name)
configuration.addCompilationCustomizers(custo)
def result = new GroovyShell(configuration)
.evaluate(" cos PI/3 ")
44 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
109. Applying an AST transformation
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(
new ASTTransformationCustomizer(Log))
new GroovyShell(configuration).evaluate("""
class Car {
Car() {
log.info 'Car constructed'
}
}
log.info 'Constructing a car'
def c = new Car()
""")
45 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
110. Secure AST customizer
Idea: Implement an «arithmetic shell»
Being able control what a user script is
allowed to do: only arithmetic expressions
• Let’s setup our environment
– some imports
– an import customizer to import java.lang.Math.*
– prepare a secure AST customizer
import org.codehaus.groovy.control.customizers.*
import org.codehaus.groovy.control.*
import static org.codehaus.groovy.syntax.Types.*
def imports = new ImportCustomizer().addStaticStars('java.lang.Math')
def secure = new SecureASTCustomizer()
46 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
133. (G)String to Enum coercion
enum Color {
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
134. (G)String to Enum coercion
enum Color {
red, green, blue
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
135. (G)String to Enum coercion
enum Color {
red, green, blue
}
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
136. (G)String to Enum coercion
enum Color {
red, green, blue
}
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
137. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
138. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
139. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
140. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
// implicit coercion
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
141. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
// implicit coercion
Color b = "blue"
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
142. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
// implicit coercion
Color b = "blue"
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
143. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
// implicit coercion
Color b = "blue"
// with GStrings too
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
144. (G)String to Enum coercion
enum Color {
red, green, blue
}
// coercion with as
def r = "red" as Color
// implicit coercion
Color b = "blue"
// with GStrings too
def g = "${'green'}" as Color
52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
146. Launching remote scripts
• With the Groovy command, you can launch remote scripts
> groovy http://groovyconsole.appspot.com/raw/110001
• Be careful to what
you’re executing :-)
54 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
151. Binary literals
• We had decimal, octal and hexadecimal notations
for number literals
int x = 0b10101111
assert x == 175
byte aByte = 0b00100001
assert aByte == 33
int anInt = 0b1010000101000101
assert anInt == 41285
58 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
152. Underscore in literals
• Now we can also add underscores
in number literals for more readability
long creditCardNumber = 1234_5678_9012_3456L
long socialSecurityNumbers = 999_99_9999L
float monetaryAmount = 12_345_132.12
long hexBytes = 0xFF_EC_DE_5E
long hexWords = 0xFFEC_DE5E
long maxLong = 0x7fff_ffff_ffff_ffffL
long alsoMaxLong = 9_223_372_036_854_775_807L
long bytes = 0b11010010_01101001_10010100_10010010
59 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
153. Multicatch
• One block for multiple exception caught
– rather than duplicating the block
try {
/* ... */
} catch(IOException | NullPointerException e) {
/* one block to treat 2 exceptions */
}
60 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
154. InvokeDynamic
• Groovy 1.9 will support JDK 7ʼs invokeDynamic
– an «indy» branch started recently
– compiler will have a flag for compiling against JDK 7
• Benefits
– more runtime performance!
– in the long run, will allow us to get rid of code!
• call site caching, thanks to MethodHandles
• metaclass registry, thanks to ClassValues
• will let the JIT inline calls more easily
61 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
155. Groovy Modularity
• Groovy’s «all» JAR weighs in at 4MB
• Nobody needs everything
– Template engine, Ant scripting, Swing UI building...
• Provide a smaller core
– and several smaller JARs per feature
• Paul King covers Groovy modularisation
– Wednesday, 12:45-2:15PM
62 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
156. Static Type Checking
• Goal: make the Groovy compiler «grumpy»!
– and throw compilation errors (not at runtime)
• Not everybody needs dynamic features all the time
– think Java libraries scripting
• Grumpy should...
– tell you about your method or variable typos
– complain if you call methods that don’t exist
– shout on assignments of wrong types
– infer the types of your variables
– figure out GDK methods
63 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
157. A typo in your variable or method names
import groovy.transform.StaticTypes
void method() {}
@TypeChecked test() {
// Cannot find matching method metthhoood()
metthhoood()
def name = "Guillaume"
// variable naamme is undeclared
println naamme
}
64 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
158. A typo in your variable or method names
import groovy.transform.StaticTypes
void method() {}
@TypeChecked test() {
// Cannot find matching method metthhoood()
metthhoood()
def name = "Guillaume"
// variable naamme is undeclared Compilation
println naamme errors!
}
64 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
159. Complain on wrong assignments
// cannot assign value of type... to variable...
int x = new Object()
Set set = new Object()
def o = new Object()
int x = o
String[] strings = ['a','b','c']
int str = strings[0]
// cannot find matching method plus()
int i = 0
i += '1'
65 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
160. Complain on wrong assignments
// cannot assign value of type... to variable...
int x = new Object()
Set set = new Object() Compilation
errors!
def o = new Object()
int x = o
String[] strings = ['a','b','c']
int str = strings[0]
// cannot find matching method plus()
int i = 0
i += '1'
65 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
161. Complain on wrong return types
String method() { 'String' }
// cannot assign value of type String...
int x = method()
// checks if/else branch return values
int method() {
if (true) { 'String' }
else { 42 }
}
// works for switch/case & try/catch/finally
// transparent toString() implied
String greeting(String name) {
def sb = new StringBuilder()
sb << "Hi" << name
}
66 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
162. Complain on wrong return types
String method() { 'String' }
// cannot assign value of type String...
int x = method() Compilation
errors!
// checks if/else branch return values
int method() {
if (true) { 'String' }
else { 42 }
}
// works for switch/case & try/catch/finally
// transparent toString() implied
String greeting(String name) {
def sb = new StringBuilder()
sb << "Hi" << name
}
66 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
163. Type inference
@TypeChecked test() {
def name = " Guillaume "
// String type infered (even inside GString)
println "NAME = ${name.toUpperCase()}"
// Groovy GDK method support
// (GDK operator overloading too)
println name.trim()
int[] numbers = [1, 2, 3]
// Element n is an int
for (int n in numbers) {
println n
}
}
67 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
164. Staticly checked method & dynamic method
@TypeChecked
String greeting(String name) {
// call method with dynamic behavior
// but with proper signature
generateMarkup(name.toUpperCase())
}
// usual dynamic behavior
String generateMarkup(String name) {
def sw = new StringWriter()
new MarkupBuilder(sw).html {
body {
div name
}
}
sw.toString()
}
68 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
165. Bytecode viewer
• Groovy Console’s
bytecode viewer
from the AST
browser window
– select class
generation phase
– select a class node
69 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
166. Disable Global AST transformations
// witout a specific configuration, the AST builder works
def shell = new GroovyShell()
shell.evaluate(script) // passes
def config = new CompilerConfiguration()
config.disabledGlobalASTTransformations =
['org.codehaus.groovy.ast.builder.AstBuilderTransformation']
def script = '''
import org.codehaus.groovy.ast.builder.AstBuilder
new AstBuilder().buildFromCode { "Hello" }
'''
// now with the configuration in place,
// the AST builder transform is not applied
shell = new GroovyShell(config) // <‐‐ with the configuration
shouldFail {
shell.evaluate(script) // fails
}
70 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
168. Thank you!
e
L aforg pment
aume vy Develo
Guill Groo m
Hea d of g mail.co
aforge@
mail: gl glaforge e
E @ o /glaforg
T witter : http://gplus.t
Go ogle+:
72 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge