SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
UNDERSTANDING GORM
Alonso Torres @alotor
http://goo.gl/U6sK5E
Ego-slide
Alonso Torres
alotor @alotor
Engineer atKaleidos
GORM? Really?
Is so easy, the easiestpartof Grails!
Onlyafew POGO's to access the database
Peachy!
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewException("Thisshouldrollback!")
}
returnfound
}
Some pitfalls
The 'Parallelprocessing, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
Some pitfalls
The 'Failwhale'
classUser{
Stringname
statichasMany=[followers:User]
}
user.followers.isEmpty()
CheckBurttalkabout"GORMPerformance"
GORM is dark and full of
terrors
Let's take a step back...
and start at the beginning
Understanding Bootstrapping
WHAT'S GOING ON BEHIND THE SCENES?
Your first Domain class
classBook{
Stringname
Stringisbn
Authorauthor
}
Grails Bootstrap
Inspect/grails-app
Classes inside /domain
Annotates them with @grails.persistence.Entity
grailsrun-app
1) Domain classes are found
DEBUGcommons.DefaultGrailsApplication
Inspecting[es.greach.gorm.Book]
[es.greach.gorm.Book]isnotaFiltersclass.
[es.greach.gorm.Book]isnotaCodecclass.
[es.greach.gorm.Book]isnotaTagLibclass.
[es.greach.gorm.Book]isnotaServiceclass.
[es.greach.gorm.Book]isnotaControllerclass.
[es.greach.gorm.Book]isnotaBootstrapclass.
[es.greach.gorm.Book]isaDomainclass.
Addingartefactclasses.greach.gorm.BookofkindDomain
Grails initializes the Domain Class
Prepares the relationship properties
Resolves class hierarchy
Add validation capabilities
Integrates domain classes with Spring
@grails.persistence.Entity
Includes 'id'and 'version'
Marks the classes as domain entities
You can putdomain classes inside /src/main/groovy
Manualyannotate them with @Entity
@Entity
classBook{
Longid
Longversion
Stringname
Stringisbn
Authorauthor
}
2) GORM enhances classes
classBook{
staticmapWith="mongo"
Stringname
Stringisbn
}
DEBUGcfg.HibernateUtils -EnhancingGORMentityBook
GORM Enhancer
Instances API (save, delete...)
Classes API (findAll, where, withCriteria...)
Dynamic Finders
Validation (unique)
GORM Enhancer
Instances API (save, delete...)
Classes API (findAll, where, withCriteria...)
Dynamic Finders
Validation (unique)
Bootstraping
DistinctGrails-base vs GORM
@Entitycould potentialybe used outside Grails
Problems with AST's
Grails dependencies
Understanding Spring
HOW INTERACT DOMAIN CLASSES AND SPRING
classBook{
defbookService
Stringname
Stringisbn
Authorauthor
StringtoString(){
returnbookService.parseBook(this)
}
}
defmyBook=newBook()
printlnmyBook.toString()
[DEBUG]BookService::parseBook
DI needs control on object instantiation
Spring should create the object
newBook()
So Grails kind of "cheats"
Spring Beans for a Domain Class
BookValidator
BookPersistentClass
BookDomainClass
Book
newBook()
Book.constructor={->
defctx=....//Springcontext
context.getBean("Book")
}
What does that means?
Springcreates your objects
Be carefulwhen usingsome capabilities
Example: SpringAOP
Understanding Hibernate GORM
WHERE THE DARKNESS LURKS
GORM > Hibernate
GORM provides abeautifulabstraction over hibernate
Convention over configuration
No more complicated XML or annotations
Better collections
But, Hibernate it's still there
classBook{
Stringname
Stringisbn
Authorauthor
}
grailsgenerate-controllerBook
//Grails2.2scafolding
classBookController{
defsave(){
definstance=newBook(params)
if(!instance.save(flush:true)){
render(view:"create",model:[bookInstance:instance])
return
}
redirect(action:"show",id:instance.id)
}
}
//Grails2.2scafolding
classBookController{
defsave(){
defbookInstance=newBook(params)
if(!bookInstance.save(flush:true)){
render(view:"create",model:[bookInstance:bookInstance])
return
}
redirect(action:"show",id:bookInstance.id)
}
}
OpenSessionInViewInterceptor
Creates anew Sessionwithin aController scope
Doesn'tcreate aTransaction
So... there is NO transaction atthe controller
After render the session is flushed
Session? Transaction? I'm confused
Session
Entrypointto the Hibernate Framework
In-Memorycache
No thread safe and normalythread-bound
GORM Entities
Entities have arelationship with the session
This defines a"life-cycle"
Transient -notyetpersisted
Persistent -has asession
Detached -persisted butwithoutsession
Session Flush
Session checks "DIRTY OBJECTS"
When flushed the changes are persisted to database
After flush, are my objects in the DB?
DEPENDS
Transaction
Database managed
Provider specific
Accessed through JDBC Driver
PeterLedbrok- http://spring.io/blog/2010/06/23/gorm-gotchas-part-1/
Hibernate Session
FLUSHING
vs
COMMIT
Database Transaction
Automatic session flushing
Queryexecuted
Acontroller completes
Before transaction commit
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Deattachtheobjectfromthesession
book.discard()
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Where do I put my transactional logic?
withTransaction
Book.withTransaction{
//Transactionalstuff
}
Transactional services
@Transactional
classBookService{
defdoTransactionalStuff(){
...
}
}
Be careful!
Don'tinstanciate the services
Don'tuse closures
And...
newTransactionalService().doTransactionalStuff()
deftransactionalMethod={...}
DON'T THROW CHECKED EXCEPTIONS
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewException("Thisshouldrollback!")
}
returnfound
}
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewRuntimeException("Thisshouldrollback!")
}
returnfound
}
@Transactional vs @Transactional
Spring@Transactionalcreates aPROXY
Grails new @Transactionalis an AST
Understanding Parallel GORM
BRACE YOURSELVES
Session is Thread-Local
Some pitfalls
The 'Concurrency, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
Thread-local session
Recovers alistof orders
Each item is bound to the requestsession
When we spawn the concurrentthreads the objects don't
know where is their session
deforders=Orders.findTodayOrders()
Some pitfalls
The 'Concurrency, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
BookOrder.withNewSession{
order.merge()
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
}
Rule of thumb
Session = Thread
If entityhas recovered byanother thread
Putitin the currentthread session
Grails 2.3 Async GORM
The new async GORM solves some problems
Manages the session for the promise
defpromise=Person.async.findByFirstName("Homer")
defperson=promise.get()
Grails 2.3 Async GORM
Problem: Objecthas been retrieved byanother thread
After the promise is resolved we have to attach the object
defpromise=Person.async.findByFirstName("Homer")
defperson=promise.get()
person.merge()//Reboundtheobjecttothesession
person.firstName="Bart"
Closing thoughts
GORM is averycoolabstraction
You have to be aware of some of how things work
With greatpower, comes greatresponsibility
THANKS
@alotor
http://goo.gl/U6sK5E
Bonus track (references)
http://spring.io/blog/2010/06/23/gorm-gotchas-part-1/
http://sacharya.com/tag/gorm-transaction/
http://www.anyware.co.uk/2005/2012/11/12/the-false-
optimism-of-gorm-and-hibernate/
http://docs.jboss.org/hibernate/orm/3.6/reference/en-
US/html_single/#transactions-basics
Bonus track (references)
http://www.infoq.com/presentations/GORM-Performance
http://www.infoq.com/presentations/grails-transaction
http://blog.octo.com/en/transactions-in-grails/
https://community.jboss.org/wiki/OpenSessioninView

Contenu connexe

Tendances

OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon Boston
John Hann
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yet
Tom Croucher
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
Angel Ruiz
 

Tendances (20)

Scripting as a Second Language
Scripting as a Second LanguageScripting as a Second Language
Scripting as a Second Language
 
High Performance Social Plugins
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social Plugins
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
Spock Framework (Java Day BY 2015)
Spock Framework (Java Day BY 2015)Spock Framework (Java Day BY 2015)
Spock Framework (Java Day BY 2015)
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon Boston
 
Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yet
 
jQuery Introduction
jQuery IntroductionjQuery Introduction
jQuery Introduction
 
Intro to Sail.js
Intro to Sail.jsIntro to Sail.js
Intro to Sail.js
 
jQuery: Nuts, Bolts and Bling
jQuery: Nuts, Bolts and BlingjQuery: Nuts, Bolts and Bling
jQuery: Nuts, Bolts and Bling
 
End-to-end testing with geb
End-to-end testing with gebEnd-to-end testing with geb
End-to-end testing with geb
 
AMD - Why, What and How
AMD - Why, What and HowAMD - Why, What and How
AMD - Why, What and How
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
 
React.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIsReact.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIs
 
JavaScript!
JavaScript!JavaScript!
JavaScript!
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoid
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
 

En vedette

En vedette (8)

Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo CapabilitiesWebinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
 
(Codemotion 2014) 20 lenguajes en 40 minutos
(Codemotion 2014) 20 lenguajes en 40 minutos(Codemotion 2014) 20 lenguajes en 40 minutos
(Codemotion 2014) 20 lenguajes en 40 minutos
 
(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy
 
[Greach 2016] Down The RabbitMQ Hole
[Greach 2016] Down The RabbitMQ Hole[Greach 2016] Down The RabbitMQ Hole
[Greach 2016] Down The RabbitMQ Hole
 
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
 
(Greach 2015) Decathlon Sport Meeting
(Greach 2015) Decathlon Sport Meeting(Greach 2015) Decathlon Sport Meeting
(Greach 2015) Decathlon Sport Meeting
 
[Jbcn 2016] Garbage Collectors WTF!?
[Jbcn 2016] Garbage Collectors WTF!?[Jbcn 2016] Garbage Collectors WTF!?
[Jbcn 2016] Garbage Collectors WTF!?
 
[Greach 17] make concurrency groovy again
[Greach 17] make concurrency groovy again[Greach 17] make concurrency groovy again
[Greach 17] make concurrency groovy again
 

Similaire à Understanding GORM (Greach 2014)

Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
Mayflower GmbH
 
Hibernate Tutorial
Hibernate TutorialHibernate Tutorial
Hibernate Tutorial
Ram132
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
.toster
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and How
BigBlueHat
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
Yehuda Katz
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
Peter Higgins
 

Similaire à Understanding GORM (Greach 2014) (20)

Understanding Database Transactions and Hibernate Sessions in Grails
Understanding Database Transactions and Hibernate Sessions in GrailsUnderstanding Database Transactions and Hibernate Sessions in Grails
Understanding Database Transactions and Hibernate Sessions in Grails
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
 
Async queue-transaction
Async queue-transaction Async queue-transaction
Async queue-transaction
 
Hibernate Tutorial
Hibernate TutorialHibernate Tutorial
Hibernate Tutorial
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Week3
Week3Week3
Week3
 
Intro to IndexedDB (Beta)
Intro to IndexedDB (Beta)Intro to IndexedDB (Beta)
Intro to IndexedDB (Beta)
 
Introduction to the new official C# Driver developed by 10gen
Introduction to the new official C# Driver developed by 10genIntroduction to the new official C# Driver developed by 10gen
Introduction to the new official C# Driver developed by 10gen
 
NodeJS
NodeJSNodeJS
NodeJS
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and How
 
Ember background basics
Ember background basicsEmber background basics
Ember background basics
 
JavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM ManipulationJavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM Manipulation
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
 
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your DataMongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
 
Real World Caching with Ruby on Rails
Real World Caching with Ruby on RailsReal World Caching with Ruby on Rails
Real World Caching with Ruby on Rails
 
Look Up Mobile Javascript
Look Up Mobile JavascriptLook Up Mobile Javascript
Look Up Mobile Javascript
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 

Dernier

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 

Dernier (20)

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 

Understanding GORM (Greach 2014)