SlideShare a Scribd company logo
1 of 74
Download to read offline
Design Patterns
COMMON SOLUTIONS TO COMMON PROBLEMS
Brad Wood
@bdw429s
Ortus Solutions
Me
● Work for Ortus Solutions
● Developer Advocate
● Love rewriting Node code in CFML
● Lead developer of CommandBox CLI
● Live in Kansas City
● Musician
● 3 Ridiculously cute daughters
● Like eating spicy foods
Design Patterns
Software Craftsmanship
Design Patterns
Christopher Alexander, architect
Born in Vienna in the 30’s
Architectural Design Patterns
A Pattern Language
1977 book on architecture, urban
design, and community livability
The book creates a new language,
what the authors call a pattern
language derived from timeless entities
called patterns.
Patterns describe a problem and then
offer a solution. (253 patterns)
What is a Pattern?
“Each pattern describes a problem which occurs over and over
again in our environment, and then describes the core of the
solution to that problem, in such a way that you can use this
solution a million times over, without ever doing it the same way
twice.”
Christopher Alexander
A Pattern Language
37 HOUSE CLUSTER
76 HOUSE FOR A SMALL FAMILY
159 LIGHT ON TWO SIDES OF EVERY
ROOM
Gang of Four (GoF)
Design Patterns:
Elements of Reusable Object-Oriented Software
Inspired by Christopher’s work
23 programming patterns
Written by the “Gang of Four” in 1994
● Erich Gamma
● Richard Helm
● Ralph Johnson
● John Vlissides
Design Patterns:
Elements of Reusable Object-Oriented Software
Creational Patterns
● Abstract Factory
● Prototype
● Singleton
Design Patterns:
Elements of Reusable Object-Oriented Software
Structural Patterns
● Composite
● Decorator
● Facade
Design Patterns:
Elements of Reusable Object-Oriented Software
Behavioural Patterns
● Chain of Responsibility
● Iterator
● Strategy
Inspiration, not copy/paste examples
“The examples are there for inspiration and explanation of the
ideas in the patterns. They aren't canned solutions; in all cases
you'll need to do a fair bit of work to fit them into your application.”
Martin Fowler
Let’s look at some examples
Object Factory
https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)
Object Factory
● An object that creates other objects
● Abstracts details of how the final objects are created
● Removes creation code from inside object to separate concerns
● Often used with the dependency injection pattern
● CFML Examples are WireBox or DI/1
Object Factory
component {
function buildDog() {
var oDog = new Dog();
oDog.setBreed( ‘Mutt’ );
return oDog;
}
}
DogFactory.cfc
Object Factory
var rover = dogFactory.buildDog();
Singleton
https://sourcemaking.com/design_patterns/singleton
Singleton
● Ensure class only has one instance
● Provide global access to this instance
● Just-in-time initialization
● Often times doesn’t hold state
● Object must be thread safe!
Singleton
function onApplicationStart() {
application.myService = new models.myService();
}
Strategy
https://sourcemaking.com/design_patterns/strategy
Strategy
● Define a family of algorithms
● Each one is encapsulated and interchangeable
● Often times each strategy implements an interface
● Each implementation can be different
● Strategies can be chosen at runtime
● Strategy in use is invisible to the program
Strategy
logger.setAppender( new fileAppender() );
logger.logMessage( ‘This is my message’ );
logger.setAppender( new dbAppender() );
logger.logMessage( ‘This is my message’ );
Decorator
https://sourcemaking.com/design_patterns/decorator
Decorator
● Add responsibilities to a class dynamically
● Alternative to subclassing (not really an “is-a”)
● Decorator wraps original class
● Wrapping can be recursive
● Can be applied at runtime
● User of class does not know (or care) if it’s been decorated
iceCream = new iceCream();
iceCream.make();
sprinkledIceCream = new sprinklesDecorator( iceCream );
sprinkledIceCream.make();
Decorator
Adapter
https://sourcemaking.com/design_patterns/adapter
Adapter
● Modify the API of a class to be different
● Can “adapt” a class to work in another system
● Wraps the original class with a new interface
● Allows greater reuse
● Doesn’t modify original class
Adapter
oldCache = new oldCacheEngine();
oldCache.retrieve( ‘item’ );
adaptedCache = new cacheAdapter( oldCache );
adaptedCache.get( ‘item’ );
Front Controller
https://en.wikipedia.org/wiki/Front_controller
Front Controller
● A single point of entry for a web app
● Simplifies URL routing
● Makes global concerns like security checks easier
● Utilizes a controller to dispatch to the appropriate handler
● Usually index.cfm in CFML apps
Front Controller
yoursite.com/index.cfm?event=main.index
Chain of Responsibility
https://sourcemaking.com/design_patterns/chain_of_responsibility
Chain of Responsibility
● You have a large or dynamic list of handlers that need to respond
to a request
● You don’t want to couple the sender to the responders
● Creates a pipeline of linked handlers
● Each handler calls the next link in the chain
● A handler can abort the chain by not calling the next handler
Chain of Responsibility
function securityHandler( request ) {
if( !request.params.authenticated ){
throw ‘Not logged in’!
}
// Pass control to the next link in the chain
request.proceed();
}
Memento
https://sourcemaking.com/design_patterns/memento
Memento
● Capture and externalize an object's internal state
● Can be used to “snapshot” an object
● Can be used to restore an object to a previous state
● Great for serialization
● Can include composed objects
Memento
oUser = userService.loadUser( id=123 );
currentUserState = oUser.getMemento();
// Later on...
oUser.setMemento( previousUserState );
Observer
(publish/subscribe)
https://sourcemaking.com/design_patterns/observer
Observer (publish/subscribe)
● Defines “events” that are broadcast
● Defines zero or more observers who are listening to those events
● Promotes decoupling of a large system
● Listener can receive data about the event that has happened
● Bind listeners at runtime for dynamic behaviors
● Don’t call us, we’ll call you!
Observer (publish/subscribe)
$.ajax({
url: "test.html",
context: document.body
}).done(function() {
$( this ).addClass( "done" );
});
Double Checked Locking
https://en.wikipedia.org/wiki/Double-checked_locking
Double Checked Locking
● Protects creation of a shared resource with multithreading
● Reduces overhead of acquiring exclusive locks by first performing
a read-only check
● If creation is required, only then is an exclusive lock acquired
● Once a thread has the exclusive lock, the check is performed a
second time to ensure another thread hasn’t completed it
● Ensures thread safety without excessive locking
Double Checked Locking
if( isDefined( 'data' ) ){ return data; }
lock name="generateData" type="exclusive" timeout=60 {
if( isDefined( 'data' ) ){ return data; }
data = produceData();
return data;
}
Anti-patterns
(Avoid these!)
Anemic Domain Model
https://en.wikipedia.org/wiki/Anemic_domain_model
Anemic Domain Model
● When domain model is too “thin” and lacks any behavior
● Beans are only value objects with no behavior present
● Services are empty, meaning business logic has probably ended
up in your controllers or views
● Creates excessive classes
● Bloats application code
Anemic Domain Model
component accessors=true {
property name=’name’;
property name=’age’;
property name=’department’;
}
God Object
https://sourcemaking.com/antipatterns/the-blob
God Object
● A class with too much responsibility
● API is watered down with many unrelated methods
● Usually happens over time as code is added and never refactored
● Hard to maintain and test
● Lazy domain design and lack of planning
God Object
util = new generalControllerUtil();
util.createOrder();
util.addUser();
util.login();
util.runScheduledTasks();
util.orderPizza();
Premature Optimization
https://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/
Premature Optimization
● Coding early-on for perceived efficiency
● Sacrificing good design, maintainability
● Often times overstating a negligible speed improvement
● Sometimes “proven” by a flawed “loop test”
● The “root of all evil” -- Donald Knuth
Improbability Factor
https://en.wikipedia.org/wiki/Improbability_factor
Improbability Factor
● Leaving known bugs in your system because they’re “not likely to
happen”
● Gambling with fate to save time and be lazy
● This is just inviting Murphy’s Law to come into full effect
● Can bite you later at the worst possible time
Improbability Factor
reportService.runAsyncReport();
// Meh, this should be enough
sleep( 5000 );
fileRead( ‘/reports/sales.pdf’ );
Honorable Mentions
Law of Demeter
https://en.wikipedia.org/wiki/Law_of_Demeter
Law of Demeter
● Principle of least knowledge
● A unit of software should have limited knowledge about the other
units
● Software units should talk to friends and not to strangers
● Keeps low coupling between systems
● Rule of thumb: be careful accessing methods on objects obtained
from other objects (the “dot” rule)
Law of Demeter
orderCity = cart
.getOrder()
.getOrderDetails()
.getUser()
.getAddress()
.getCity()
.getName();
Law of Demeter
orderTaxRate = cart.getOrderTaxRate();
Principle of Least Astonishment
https://en.wikipedia.org/wiki/Principle_of_least_astonishment
Principle of Least Astonishment (POLA)
● Applies to UI and software design
● "If a necessary feature has a high astonishment factor, it may be
necessary to redesign the feature”
● User controls should have a consistent behavior
● Predictable software is easier to use
● Basically, don’t make your users go “WTF!?”
Principle of Least Astonishment (POLA)
// Has side effect of removing all login history
user.getAPIKey();
Brook’s Law
https://en.wikipedia.org/wiki/Brooks%27s_law
Brook’s Law
● “Adding manpower to a late software project makes it later"
● Coined by Fred Brooks in his 1975 book The Mythical Man-Month
● Software development is knowledge work, and not fungible
● Throwing devs at a project will slow it down at first
● A larger team has more points of contact
● If 1 woman can have a baby in 9 months, it doesn’t mean 9
women can have a baby in 1 month
Resources
Head First Design Patterns:
A Brain-Friendly Guide
Software Architecture Design Patterns in Java
https://sourcemaking.com/design_patterns
Thanks for coming!
Contact me
● brad@bradwood.com
● www.codersrevolution.com
● @bdw429s
● Ortus Solutions

More Related Content

What's hot

Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
Cyber Security Alliance
 
Locking the Throneroom 2.0
Locking the Throneroom 2.0Locking the Throneroom 2.0
Locking the Throneroom 2.0
Mario Heiderich
 
The Ultimate IDS Smackdown
The Ultimate IDS SmackdownThe Ultimate IDS Smackdown
The Ultimate IDS Smackdown
Mario Heiderich
 

What's hot (20)

Devoops: DoJ Annual Cybersecurity Training Symposium Edition 2015
Devoops: DoJ Annual Cybersecurity Training Symposium Edition 2015Devoops: DoJ Annual Cybersecurity Training Symposium Edition 2015
Devoops: DoJ Annual Cybersecurity Training Symposium Edition 2015
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
Hystrix 介绍
Hystrix 介绍Hystrix 介绍
Hystrix 介绍
 
The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84The Ring programming language version 1.2 book - Part 51 of 84
The Ring programming language version 1.2 book - Part 51 of 84
 
Even more java script best practices
Even more java script best practicesEven more java script best practices
Even more java script best practices
 
Here Be Dragons: The Unexplored Land of Active Directory ACLs
Here Be Dragons: The Unexplored Land of Active Directory ACLsHere Be Dragons: The Unexplored Land of Active Directory ACLs
Here Be Dragons: The Unexplored Land of Active Directory ACLs
 
The Theory Of The Dom
The Theory Of The DomThe Theory Of The Dom
The Theory Of The Dom
 
Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
Asfws 2014 slides why .net needs ma-cs and other serial(-ization) tales_v2.0
 
iOS Memory Management
iOS Memory ManagementiOS Memory Management
iOS Memory Management
 
A Case Study in Attacking KeePass
A Case Study in Attacking KeePassA Case Study in Attacking KeePass
A Case Study in Attacking KeePass
 
Locking the Throneroom 2.0
Locking the Throneroom 2.0Locking the Throneroom 2.0
Locking the Throneroom 2.0
 
Us 17-krug-hacking-severless-runtimes
Us 17-krug-hacking-severless-runtimesUs 17-krug-hacking-severless-runtimes
Us 17-krug-hacking-severless-runtimes
 
The Ultimate IDS Smackdown
The Ultimate IDS SmackdownThe Ultimate IDS Smackdown
The Ultimate IDS Smackdown
 
Maintainable JavaScript 2011
Maintainable JavaScript 2011Maintainable JavaScript 2011
Maintainable JavaScript 2011
 
Javascript internals
Javascript internalsJavascript internals
Javascript internals
 
Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"
 
Ajax Performance
Ajax PerformanceAjax Performance
Ajax Performance
 
Building an EmPyre with Python
Building an EmPyre with PythonBuilding an EmPyre with Python
Building an EmPyre with Python
 
Kubernetes 101 for_penetration_testers_-_null_mumbai
Kubernetes 101 for_penetration_testers_-_null_mumbaiKubernetes 101 for_penetration_testers_-_null_mumbai
Kubernetes 101 for_penetration_testers_-_null_mumbai
 
Efficient Android Threading
Efficient Android ThreadingEfficient Android Threading
Efficient Android Threading
 

Similar to Design patterns - Common Solutions to Common Problems - Brad Wood

Aleksandr_Butenko_Mobile_Development
Aleksandr_Butenko_Mobile_DevelopmentAleksandr_Butenko_Mobile_Development
Aleksandr_Butenko_Mobile_Development
Ciklum
 

Similar to Design patterns - Common Solutions to Common Problems - Brad Wood (20)

cf.Objective() 2017 - Design patterns - Brad Wood
cf.Objective() 2017 - Design patterns - Brad Woodcf.Objective() 2017 - Design patterns - Brad Wood
cf.Objective() 2017 - Design patterns - Brad Wood
 
Design_Patterns_Dr.CM.ppt
Design_Patterns_Dr.CM.pptDesign_Patterns_Dr.CM.ppt
Design_Patterns_Dr.CM.ppt
 
CrawlerLD - Distributed crawler for linked data
CrawlerLD - Distributed crawler for linked dataCrawlerLD - Distributed crawler for linked data
CrawlerLD - Distributed crawler for linked data
 
The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014
 
The Naked Bundle - Tryout
The Naked Bundle - TryoutThe Naked Bundle - Tryout
The Naked Bundle - Tryout
 
Design patterns in javascript
Design patterns in javascriptDesign patterns in javascript
Design patterns in javascript
 
The State of the Veil Framework
The State of the Veil FrameworkThe State of the Veil Framework
The State of the Veil Framework
 
Clean Code V2
Clean Code V2Clean Code V2
Clean Code V2
 
Racing The Web - Hackfest 2016
Racing The Web - Hackfest 2016Racing The Web - Hackfest 2016
Racing The Web - Hackfest 2016
 
Distributed fun with etcd
Distributed fun with etcdDistributed fun with etcd
Distributed fun with etcd
 
The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212The Ring programming language version 1.10 book - Part 83 of 212
The Ring programming language version 1.10 book - Part 83 of 212
 
The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181The Ring programming language version 1.5.2 book - Part 68 of 181
The Ring programming language version 1.5.2 book - Part 68 of 181
 
Defcon 27 - Writing custom backdoor payloads with C#
Defcon 27 - Writing custom backdoor payloads with C#Defcon 27 - Writing custom backdoor payloads with C#
Defcon 27 - Writing custom backdoor payloads with C#
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
 
The Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony BarcelonaThe Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony Barcelona
 
Design patterns
Design patternsDesign patterns
Design patterns
 
.Net Garbage Collector 101
.Net Garbage Collector 101.Net Garbage Collector 101
.Net Garbage Collector 101
 
The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180The Ring programming language version 1.5.1 book - Part 67 of 180
The Ring programming language version 1.5.1 book - Part 67 of 180
 
Aleksandr_Butenko_Mobile_Development
Aleksandr_Butenko_Mobile_DevelopmentAleksandr_Butenko_Mobile_Development
Aleksandr_Butenko_Mobile_Development
 
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup BelgiumThe Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup Belgium
 

More from Ortus Solutions, Corp

More from Ortus Solutions, Corp (20)

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
 
Ortus Government.pdf
Ortus Government.pdfOrtus Government.pdf
Ortus Government.pdf
 
Luis Majano The Battlefield ORM
Luis Majano The Battlefield ORMLuis Majano The Battlefield ORM
Luis Majano The Battlefield ORM
 
Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI Brad Wood - CommandBox CLI
Brad Wood - CommandBox CLI
 
Secure your Secrets and Settings in ColdFusion
Secure your Secrets and Settings in ColdFusionSecure your Secrets and Settings in ColdFusion
Secure your Secrets and Settings in ColdFusion
 
Daniel Garcia ContentBox: CFSummit 2023
Daniel Garcia ContentBox: CFSummit 2023Daniel Garcia ContentBox: CFSummit 2023
Daniel Garcia ContentBox: CFSummit 2023
 
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdfITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
ITB_2023_Human-Friendly_Scheduled_Tasks_Giancarlo_Gomez.pdf
 
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdfITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
ITB_2023_CommandBox_Multi-Server_-_Brad_Wood.pdf
 
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdfITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
ITB_2023_The_Many_Layers_of_OAuth_Keith_Casey_.pdf
 
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdfITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
ITB_2023_Relationships_are_Hard_Data_modeling_with_NoSQL_Curt_Gratz.pdf
 
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdfITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
ITB_2023_Extend_your_contentbox_apps_with_custom_modules_Javier_Quintero.pdf
 
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdfITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
ITB_2023_25_Most_Dangerous_Software_Weaknesses_Pete_Freitag.pdf
 
ITB_2023_CBWire_v3_Grant_Copley.pdf
ITB_2023_CBWire_v3_Grant_Copley.pdfITB_2023_CBWire_v3_Grant_Copley.pdf
ITB_2023_CBWire_v3_Grant_Copley.pdf
 
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdfITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
ITB_2023_Practical_AI_with_OpenAI_-_Grant_Copley_.pdf
 
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdfITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
ITB_2023_When_Your_Applications_Work_As_a_Team_Nathaniel_Francis.pdf
 
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdfITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
ITB_2023_Faster_Apps_That_Wont_Get_Crushed_Brian_Klaas.pdf
 
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdfITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
ITB_2023_Chatgpt_Box_Scott_Steinbeck.pdf
 
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdfITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
 
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdfITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
ITB_2023_Create_as_many_web_sites_or_web_apps_as_you_want_George_Murphy.pdf
 
ITB2023 Developing for Performance - Denard Springle.pdf
ITB2023 Developing for Performance - Denard Springle.pdfITB2023 Developing for Performance - Denard Springle.pdf
ITB2023 Developing for Performance - Denard Springle.pdf
 

Recently uploaded

+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@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
+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...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Design patterns - Common Solutions to Common Problems - Brad Wood