SlideShare uma empresa Scribd logo
1 de 105
Baixar para ler offline
@skwp @reverbdotcom #wcr14
Yan Pritzker
CTO, Reverb.com

@skwp @reverbdotcom
Domain Driven Rails
https://speakerdeck.com/skwp
@skwp @reverbdotcom #wcr14
Are you happy with the 

SIZE and COMPLEXITY 

of your models?
@skwp @reverbdotcom #wcr14
Are you happy with the 

SCALABILITY

of your team?
@skwp @reverbdotcom #wcr14
Are you happy with the 

ADAPTABILITY

of your business?
@skwp @reverbdotcom #wcr14
What are you
building?
@skwp @reverbdotcom #wcr14
Rails is a
detail!"
Decouple
all things"
Is the code
better?"
Keep it
Railsy"
@skwp @reverbdotcom #wcr14
Somewhere
in between
Simple

CRUD"
Apps"
Complex

Enterprise

Logic"
@skwp @reverbdotcom #wcr14
I want to discover 

relevant compromises 

rather than defend ideals
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Over
115

Model
Classes
@skwp @reverbdotcom #wcr14
Over
1000

Total
Classes
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Not great, but we have only
three chubby models
@skwp @reverbdotcom #wcr14
Are monoliths
bad for business?
@skwp @reverbdotcom #wcr14
Quick Iterations
Low Operational 

Complexity
Refactoring
Monolith
ServiceService
Service
Service
Service
Early 2013 - Startup / Proof of Concept
Monolith
ServiceService
Service
Service
Service
2014 - Growth Phase
@skwp @reverbdotcom #wcr14
http://martinfowler.com/articles/distributed-objects-
microservices.html
“I'm wary of distribution and 

my default inclination is to prefer
a monolithic design”
“While small microservices are certainly simpler to reason
about, I worry that this pushes complexity into the
interconnections between services”
“Refactoring becomes much harder when you have to do it
across remote boundaries.”
@skwp @reverbdotcom #wcr14
Quick Iterations
Low Operational 

Complexity
May lead to a BBOM
@skwp @reverbdotcom #wcr14
Maintainable
Monoliths
Can Be
Achieved
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Product

400 LOC

~150 LOC non-ActiveRecord
Churn: 49 changes this year"
Order

333 LOC

~200 LOC non-ActiveRecord
Churn: 36 changes this year
User

338 LOC

~200 LOC non-ActiveRecord
Churn: 29 changes this year
CHURN
Product
Order
User
@skwp @reverbdotcom #wcr14
Commonly used
classes are hard
to refactor
@skwp @reverbdotcom #wcr14
Stop 

modifying 

code!
(Open/Closed Principle)
@skwp @reverbdotcom #wcr14
Don’t put
different rates
of change
together"
Kent Beck - Smalltalk Best Practice Patterns
(see also: Single Responsibility Principle)
@skwp @reverbdotcom #wcr14
Don’t put
different rates
of change
together"
Kent Beck - Smalltalk Best Practice Patterns
Data Model
Business Logic
@skwp @reverbdotcom #wcr14
Separate 

what the system is "
from what the
system does"
James Copelien & Trygve Reenskaug
(Data, Context, Interaction)
@skwp @reverbdotcom #wcr14
Where does business
logic go?
@skwp @reverbdotcom #wcr14
Controller
2005
ActiveRecord
Mailers
Services
User
@skwp @reverbdotcom #wcr14
Console?"
Rake task?"
Background jobs?"
API layer?"
Testing?
What about…
@skwp @reverbdotcom #wcr14
Order
Fat models?
@skwp @reverbdotcom #wcr14
Order
Refund
@skwp @reverbdotcom #wcr14
Order
Refund
Ship
@skwp @reverbdotcom #wcr14
Order
Refund
Ship
Check Fraud Risk
@skwp @reverbdotcom #wcr14
“Active Record is a good choice
for domain logic that isn't too
complex, such as creates, reads,
updates, and deletes”
Martin Fowler
@skwp @reverbdotcom #wcr14
If Controller and Model
are all you have then 

one has to be skinny and
one has to be fat
@skwp @reverbdotcom #wcr14
Domain Layer
skinny framework, 

healthy business logic,"
no fat anywhere
http://joncairns.com/2013/04/fat-model-
skinny-controller-is-a-load-of-rubbish/
Model
Controller
View
The Rails Way
The
Way
Active
Record
Use Cases
Grape
API
ControllersCron
Redis
Rake
HTTP
Services
Workers
R
Entities
Roles
DB
Listeners
Events
@skwp @reverbdotcom #wcr14
app/reverb
for app specific
@skwp @reverbdotcom #wcr14
lib/reverb
for Open Source / Generic
@skwp @reverbdotcom #wcr14
Reverb::
Namespace to avoid
collisions with gems
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
This is a

marketplace!
http://blog.
8thlight.com/uncle-
bob/2011/09/30/
Screaming-
Architecture.html
@skwp @reverbdotcom #wcr14
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-
architecture.html
@skwp @reverbdotcom #wcr14
see also Hexagonal, Ports & Adapters, DCI
@skwp @reverbdotcom #wcr14
Clean 

Enough 

Architecture"
@skwp @reverbdotcom #wcr14
Choosing the
right fight
@skwp @reverbdotcom #wcr14
http://blog.8thlight.com/mike-ebert/2013/03/23/the-
repository-pattern.html
@skwp @reverbdotcom #wcr14
http://blog.8thlight.com/mike-ebert/2013/03/23/the-
repository-pattern.html
(but you should still read this)
@skwp @reverbdotcom #wcr14
User.where(…)
User.active
User.find(1)
This is easy to replace with

something other than AR. 

Repository not required.
Don’t leak SQL outside of AR
@skwp @reverbdotcom #wcr14
Domain Logic in
ActiveRecord and
Controllers

leads to Churn
@skwp @reverbdotcom #wcr14
Use Cases
Reify complex business logic

into classes
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
This is not"
Rails
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Explicitly Require Dependency
http://myronmars.to/n/dev-blog/2012/12/5-reasons-to-avoid-
bundler-require
Invoke It
@skwp @reverbdotcom #wcr14
Code Reuse!
Thin Shell
@skwp @reverbdotcom #wcr14
Stubby
Happy Path
@skwp @reverbdotcom #wcr14
Testing conditionals and side
effects has nothing to do with Rails
@skwp @reverbdotcom #wcr14
Naming
The hardest problem in computer science
@skwp @reverbdotcom #wcr14
OrderService
@skwp @reverbdotcom #wcr14
Order

Service
@skwp @reverbdotcom #wcr14
Order

Service
NounService Grows Unbounded
@skwp @reverbdotcom #wcr14
Use verbs to
narrow your scope
@skwp @reverbdotcom #wcr14
Order
@skwp @reverbdotcom #wcr14
Order
ShipOrder
@skwp @reverbdotcom #wcr14
Order
ShipOrder
Cancel

Order
@skwp @reverbdotcom #wcr14
Order
ShipOrder
Cancel

Order
Refund

Order
@skwp @reverbdotcom #wcr14
Order
ShipOrder
Cancel

Order
Refund

Order
Does not

grow over time
@skwp @reverbdotcom #wcr14
ShipOrder
Cancel

Order
Refund

Order
Don’t change"
once you write them
@skwp @reverbdotcom #wcr14
Ubiquitous Language
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
What is this?
@skwp @reverbdotcom #wcr14
Roles
Add methods to objects on demand
in the context of a Use Case
@skwp @reverbdotcom #wcr14
Decorator
@skwp @reverbdotcom #wcr14
We added these methods
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Methods related to each"
other but loosely related"
to the parent concept"
and used only in a few"
Use Cases
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Events
Add behavior with listeners
without modifying code
@skwp @reverbdotcom #wcr14
Order
ActiveRecord Callbacks
Send Email
@skwp @reverbdotcom #wcr14
Order
ActiveRecord Callbacks
Send Email
Call External Service
@skwp @reverbdotcom #wcr14
Order
ActiveRecord Callbacks
Send Email
Call External Service
Conditional

Callbacks
@skwp @reverbdotcom #wcr14
AR callbacks become
more complex as the
system supports more
use cases
@skwp @reverbdotcom #wcr14
Different use cases may
trigger different events
even when working with
the same model
Instead
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
@skwp @reverbdotcom #wcr14
Add another listener to add behavior

The core class doesn’t change
@skwp @reverbdotcom #wcr14
Global listeners for cross-cutting concerns

without littering code
Wisper::GlobalListeners.add(Reverb::Listeners::AnalyticsListener.new)"
@skwp @reverbdotcom #wcr14
Controller is a listener too
@skwp @reverbdotcom #wcr14
Policy Objects
Reify complex business rules
into objects
@skwp @reverbdotcom #wcr14
Likely to change
Unlikely to change
@skwp @reverbdotcom #wcr14
refactored for readability
@skwp @reverbdotcom #wcr14
Injectable, but has a default
Simple code, only need to test one path

for the imperative side effect"
(sending an email)
@skwp @reverbdotcom #wcr14
Distillation Time
@skwp @reverbdotcom #wcr14
Language of codebase 

reflects language of business
@skwp @reverbdotcom #wcr14
Separate behaviors (what the system
does) from models (what the system is)
@skwp @reverbdotcom #wcr14
Rates of Change
@skwp @reverbdotcom #wcr14
Is this all Unicorns
and Rainbows?
@skwp @reverbdotcom #wcr14
Sprawl?"
Onboarding?"
Naming?"
Documentation?"
@skwp @reverbdotcom #wcr14
http://blog.mattwynne.net/category/hexagonal-rails/
http://clean-ruby.com/
Resources
http://confreaks.com/videos/759-rubymidwest2011-keynote-
architecture-the-lost-years
http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-
Architecture.html
http://www.artima.com/articles/dci_vision.html
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-
architecture.html
https://speakerdeck.com/skwp
@skwp @reverbdotcom #wcr14
We Are Hiring Always"
jobs.reverb.com
Ruby, ElasticSearch, DevOps,
Designers, Android, and more!
jobs@reverb.com

Mais conteúdo relacionado

Mais procurados

The Apollo and GraphQL Stack
The Apollo and GraphQL StackThe Apollo and GraphQL Stack
The Apollo and GraphQL Stack
Sashko Stubailo
 
APEX Behind the Scenes by Scott Spendolini
APEX Behind the Scenes by Scott SpendoliniAPEX Behind the Scenes by Scott Spendolini
APEX Behind the Scenes by Scott Spendolini
Enkitec
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing Architectures
Victor Rentea
 

Mais procurados (20)

From ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingFrom ActiveRecord to EventSourcing
From ActiveRecord to EventSourcing
 
The Apollo and GraphQL Stack
The Apollo and GraphQL StackThe Apollo and GraphQL Stack
The Apollo and GraphQL Stack
 
APEX Behind the Scenes by Scott Spendolini
APEX Behind the Scenes by Scott SpendoliniAPEX Behind the Scenes by Scott Spendolini
APEX Behind the Scenes by Scott Spendolini
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
React & GraphQL
React & GraphQLReact & GraphQL
React & GraphQL
 
Performance Engineering Masterclass: Introduction to Modern Performance
Performance Engineering Masterclass: Introduction to Modern PerformancePerformance Engineering Masterclass: Introduction to Modern Performance
Performance Engineering Masterclass: Introduction to Modern Performance
 
Kotlin
KotlinKotlin
Kotlin
 
Hexagonal Architecture.pdf
Hexagonal Architecture.pdfHexagonal Architecture.pdf
Hexagonal Architecture.pdf
 
Testing with JUnit 5 and Spring
Testing with JUnit 5 and SpringTesting with JUnit 5 and Spring
Testing with JUnit 5 and Spring
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Lessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in ProductionLessons Learned from Using Next.js in Production
Lessons Learned from Using Next.js in Production
 
State Management in Angular/React
State Management in Angular/ReactState Management in Angular/React
State Management in Angular/React
 
Netflix Data Pipeline With Kafka
Netflix Data Pipeline With KafkaNetflix Data Pipeline With Kafka
Netflix Data Pipeline With Kafka
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing Architectures
 
Pretius Oracle Apex Primer
Pretius Oracle Apex PrimerPretius Oracle Apex Primer
Pretius Oracle Apex Primer
 
Reactive Microservices with Quarkus
Reactive Microservices with QuarkusReactive Microservices with Quarkus
Reactive Microservices with Quarkus
 
Mock Server Using WireMock
Mock Server Using WireMockMock Server Using WireMock
Mock Server Using WireMock
 
NextJS - Online Summit for Frontend Developers September 2020
NextJS - Online Summit for Frontend Developers September 2020NextJS - Online Summit for Frontend Developers September 2020
NextJS - Online Summit for Frontend Developers September 2020
 
Hexagonal architecture with Spring Boot
Hexagonal architecture with Spring BootHexagonal architecture with Spring Boot
Hexagonal architecture with Spring Boot
 

Semelhante a Domain Driven Rails

Undercover Scrum Master - Agile2019
Undercover Scrum Master - Agile2019Undercover Scrum Master - Agile2019
Undercover Scrum Master - Agile2019
Dane Weber
 
Rowdy Rabouw - Unleash your web skills on native
Rowdy Rabouw - Unleash your web skills on nativeRowdy Rabouw - Unleash your web skills on native
Rowdy Rabouw - Unleash your web skills on native
OdessaJS Conf
 

Semelhante a Domain Driven Rails (20)

JS Chicago Meetup 2/23/16 - Redux & Routes
JS Chicago Meetup 2/23/16 - Redux & RoutesJS Chicago Meetup 2/23/16 - Redux & Routes
JS Chicago Meetup 2/23/16 - Redux & Routes
 
Monitorer l'inconnu, 1000 * 100 series par jour - talk avec @clementd à #devo...
Monitorer l'inconnu, 1000 * 100 series par jour - talk avec @clementd à #devo...Monitorer l'inconnu, 1000 * 100 series par jour - talk avec @clementd à #devo...
Monitorer l'inconnu, 1000 * 100 series par jour - talk avec @clementd à #devo...
 
The Twelve Factor Container
The Twelve Factor ContainerThe Twelve Factor Container
The Twelve Factor Container
 
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and HowBoston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
Boston DevOps Days 2016: Implementing Metrics Driven DevOps - Why and How
 
RxJS - The Basics & The Future
RxJS - The Basics & The FutureRxJS - The Basics & The Future
RxJS - The Basics & The Future
 
Reactive All the Way Down the Stack
Reactive All the Way Down the StackReactive All the Way Down the Stack
Reactive All the Way Down the Stack
 
The Power of RxJS in Nativescript + Angular
The Power of RxJS in Nativescript + AngularThe Power of RxJS in Nativescript + Angular
The Power of RxJS in Nativescript + Angular
 
Better and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and EnjoymentBetter and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and Enjoyment
 
Do you really want to go fully micro?
Do you really want to go fully micro?Do you really want to go fully micro?
Do you really want to go fully micro?
 
From Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, LvivFrom Rails legacy to DDD - Pivorak, Lviv
From Rails legacy to DDD - Pivorak, Lviv
 
What is quality code? From cruft to craft
What is quality code? From cruft to craftWhat is quality code? From cruft to craft
What is quality code? From cruft to craft
 
PlatformCon 23: "The Busy Platform Engineers Guide to API Gateways"
PlatformCon 23: "The Busy Platform Engineers Guide to API Gateways"PlatformCon 23: "The Busy Platform Engineers Guide to API Gateways"
PlatformCon 23: "The Busy Platform Engineers Guide to API Gateways"
 
Undercover Scrum Master - Agile2019
Undercover Scrum Master - Agile2019Undercover Scrum Master - Agile2019
Undercover Scrum Master - Agile2019
 
Git Workflow Strategies for Technical Debt Management
Git Workflow Strategies for Technical Debt ManagementGit Workflow Strategies for Technical Debt Management
Git Workflow Strategies for Technical Debt Management
 
apidays LIVE Paris - GraphQL: the AppSec perspective by Vladimir de Turckheim
apidays LIVE Paris - GraphQL: the AppSec perspective by Vladimir de Turckheimapidays LIVE Paris - GraphQL: the AppSec perspective by Vladimir de Turckheim
apidays LIVE Paris - GraphQL: the AppSec perspective by Vladimir de Turckheim
 
"Design and Test First"-Workflow für REST APIs
"Design and Test First"-Workflow für REST APIs"Design and Test First"-Workflow für REST APIs
"Design and Test First"-Workflow für REST APIs
 
Rowdy Rabouw - Unleash your web skills on native
Rowdy Rabouw - Unleash your web skills on nativeRowdy Rabouw - Unleash your web skills on native
Rowdy Rabouw - Unleash your web skills on native
 
Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)
 
From Zero to Hadoop: a tutorial for getting started writing Hadoop jobs on Am...
From Zero to Hadoop: a tutorial for getting started writing Hadoop jobs on Am...From Zero to Hadoop: a tutorial for getting started writing Hadoop jobs on Am...
From Zero to Hadoop: a tutorial for getting started writing Hadoop jobs on Am...
 
Everything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der PraxisEverything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der Praxis
 

Mais de Yan Pritzker (11)

Bitcoin not Blockchain
Bitcoin not BlockchainBitcoin not Blockchain
Bitcoin not Blockchain
 
CTO - Startup to Growth
CTO - Startup to GrowthCTO - Startup to Growth
CTO - Startup to Growth
 
Outsource Everything
Outsource EverythingOutsource Everything
Outsource Everything
 
Building Self Documenting REST APIs
Building Self Documenting REST APIsBuilding Self Documenting REST APIs
Building Self Documenting REST APIs
 
Pasted image-3237
Pasted image-3237Pasted image-3237
Pasted image-3237
 
Pasted image-1795
Pasted image-1795Pasted image-1795
Pasted image-1795
 
Pasted image-3237
Pasted image-3237Pasted image-3237
Pasted image-3237
 
Pasted image-1795
Pasted image-1795Pasted image-1795
Pasted image-1795
 
Pasted image-1706
Pasted image-1706Pasted image-1706
Pasted image-1706
 
Building Services on and off Rails
Building Services on and off RailsBuilding Services on and off Rails
Building Services on and off Rails
 
Virtualization and Cloud Computing with Elastic Server On Demand
Virtualization and Cloud Computing with Elastic Server On DemandVirtualization and Cloud Computing with Elastic Server On Demand
Virtualization and Cloud Computing with Elastic Server On Demand
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Último (20)

Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 

Domain Driven Rails