SlideShare una empresa de Scribd logo
1 de 87
Descargar para leer sin conexión
Yogi Berra
You’ve got to be careful
if you do not know
where you are going,
because you might not get there.
demo-
driven
research
www.tudorgirba.com
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
listen
enable
research?
research improves
the status quo
the status quo?
the status quo
the existing state of affairs
Picture by _FXR
Picture by _FXR
Picture by _FXR
F = m a.
E = m c. 2
Picture by _FXR
post-it
the status quo
the existing state of affairs
the status quo
the sum of our assumptions
Tom de Marco
It’s not what you don’t know that kills you,
it’s what you know that isn’t so
the status quo
the sum of our assumptions
research
revealing what no one revealed before
demo-
driven
research
www.tudorgirba.com
challenge
demo-
driven
research
www.tudorgirba.com
challenge
design
demo-
driven
research
www.tudorgirba.com
challenge
design
demo-
driven
research
www.tudorgirba.com
challenge
design
present
to Understand Software Evolution
Modeling History
vorgelegt von
Tudor Gîrba
von Rumänien
Inauguraldissertation der
Philosophisch-naturwissenschaftlichen
Fakultät der Universität Bern
Leiter der Arbeit:
Prof. Dr. Stéphane Ducasse
Prof. Dr. Oscar Nierstrasz
Institut für Informatik und
angewandte Mathematik
To provide a generic
meta-model for
expressing software
evolution analyses,
we need to recognize
evolution as an explicit
phenomenon and model
it as a first class entity.
to Understand Software Evolution
Modeling History
vorgelegt von
Tudor Gîrba
von Rumänien
Inauguraldissertation der
Philosophisch-naturwissenschaftlichen
Fakultät der Universität Bern
Leiter der Arbeit:
Prof. Dr. Stéphane Ducasse
Prof. Dr. Oscar Nierstrasz
Institut für Informatik und
angewandte Mathematik
tudorgirba.com/blog
blog.duarte.com
thebackofthenapkin.com
www.ted.com
content
content form
content form
content form
yesterday’s
weather
30%
30% 90%
yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM
andTopCurrentENM: topCurrentENM
| currentVersions previousClassHistoriesSortedByWENM
yesterdayWeatherHits last2VersionsTopHistories last2Versions
last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories
previousVersionsTopHistoriesNames over |
currentVersions := OrderedCollection new.
currentVersions addLast: (self allVersionNames at: 1).
yesterdayWeatherHits := 0.
(2 to: self allVersionNames size) do: [: i |
self smelly: 'this algorithm is too big and complex'.
previousClassHistoriesSortedByWENM := (self classHistories
selectFromReferenceVersionCollection: currentVersions)
sortBy: [:a :b | a value getWENM >= b value getWENM].
currentVersions addLast: (self allVersionNames at: i).
previousVersionsTopHistories := OrderedCollection new.
x := previousClassHistoriesSortedByWENM first value getWENM.
valuesCount := 0.
previousClassHistoriesSortedByWENM do: [ :each |
(each value getWENM ~= x) ifTrue: [
valuesCount := valuesCount + 1. x:= each value getWENM].
(valuesCount < topPreviousWENM) ifTrue: [
previousVersionsTopHistories addLast: each]
].
last2VersionsTopHistories := OrderedCollection new.
last2Versions := OrderedCollection new.
last2Versions addLast: (self allVersionNames at: (i-1)).
last2Versions addLast: (self allVersionNames at: i).
valuesCount := valuesCount + 1. x:= each value getWENM].
(valuesCount < topPreviousWENM) ifTrue: [
previousVersionsTopHistories addLast: each]
].
last2VersionsTopHistories := OrderedCollection new.
last2Versions := OrderedCollection new.
last2Versions addLast: (self allVersionNames at: (i-1)).
last2Versions addLast: (self allVersionNames at: i).
last2HistoriesSortedByENM := (self classHistories
selectFromReferenceVersionCollection: last2Versions)
sortBy: [:a :b | a value getWENM >= b value getWENM].
x := last2HistoriesSortedByENM first value getENM.
valuesCount := 0.
last2HistoriesSortedByENM do: [ :each |
(each value getENM ~= x) ifTrue: [
valuesCount := valuesCount + 1. x:= each value getENM].
(valuesCount < topCurrentENM) ifTrue: [
last2VersionsTopHistories addLast: each]
].
previousVersionsTopHistoriesNames := previousVersionsTopHistories
collect: [ :each | each value name].
over := false.
last2VersionsTopHistories do: [:each |
((previousVersionsTopHistoriesNames includes: (each value name))
and: [over not]) ifTrue: [
yesterdayWeatherHits := yesterdayWeatherHits + 1. over := true].
].
].
^yesterdayWeatherHits/(self size - 1) asFloat.
yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM
andTopCurrentENM: topCurrentENM
| currentVersions previousClassHistoriesSortedByWENM
yesterdayWeatherHits last2VersionsTopHistories last2Versions
last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories
previousVersionsTopHistoriesNames over |
currentVersions := OrderedCollection new.
currentVersions addLast: (self allVersionNames at: 1).
yesterdayWeatherHits := 0.
(2 to: self allVersionNames size) do: [: i |
self smelly: 'this algorithm is too big and complex'.
previousClassHistoriesSortedByWENM := (self classHistories
selectFromReferenceVersionCollection: currentVersions)
sortBy: [:a :b | a value getWENM >= b value getWENM].
currentVersions addLast: (self allVersionNames at: i).
previousVersionsTopHistories := OrderedCollection new.
x := previousClassHistoriesSortedByWENM first value getWENM.
valuesCount := 0.
previousClassHistoriesSortedByWENM do: [ :each |
(each value getWENM ~= x) ifTrue: [
valuesCount := valuesCount + 1. x:= each value getWENM].
(valuesCount < topPreviousWENM) ifTrue: [
previousVersionsTopHistories addLast: each]
].
last2VersionsTopHistories := OrderedCollection new.
last2Versions := OrderedCollection new.
last2Versions addLast: (self allVersionNames at: (i-1)).
last2Versions addLast: (self allVersionNames at: i).
yesterdayWeatherProbabilityWithTopPreviousWENM: topPreviousWENM
andTopCurrentENM: topCurrentENM
| currentVersions previousClassHistoriesSortedByWENM
yesterdayWeatherHits last2VersionsTopHistories last2Versions
last2HistoriesSortedByENM x valuesCount previousVersionsTopHistories
previousVersionsTopHistoriesNames over |
currentVersions := OrderedCollection new.
currentVersions addLast: (self allVersionNames at: 1).
yesterdayWeatherHits := 0.
(2 to: self allVersionNames size) do: [: i |
self smelly: 'this algorithm is too big and complex'.
previousClassHistoriesSortedByWENM := (self classHistories
selectFromReferenceVersionCollection: currentVersions)
sortBy: [:a :b | a value getWENM >= b value getWENM].
currentVersions addLast: (self allVersionNames at: i).
previousVersionsTopHistories := OrderedCollection new.
x := previousClassHistoriesSortedByWENM first value getWENM.
valuesCount := 0.
previousClassHistoriesSortedByWENM do: [ :each |
(each value getWENM ~= x) ifTrue: [
valuesCount := valuesCount + 1. x:= each value getWENM].
(valuesCount < topPreviousWENM) ifTrue: [
previousVersionsTopHistories addLast: each]
].
last2VersionsTopHistories := OrderedCollection new.
last2Versions := OrderedCollection new.
last2Versions addLast: (self allVersionNames at: (i-1)).
last2Versions addLast: (self allVersionNames at: i).
present
present
past
present
past future
present
past future
present
past future
present
past future
prediction hit
present
past future
YesterdayWeatherHit(present):
past:=all.topChanged(beginning, present)
future:=all.topChanged(present, end)
past.intersect(future).notEmpty()
prediction hit
hit hit hit
YW = 3 / 8 = 37%
hit hit hit hit hit hit hit
YW = 7 / 8 = 87%
yWFor: yesterdayCheck for: tomorrowCheck
| hits |
hits := (self detailedYWFor: yesterdayCheck for: tomorrowCheck)
sum: [ :each | each isEmpty ifTrue: [0] ifFalse: [1]].
^ hits / (self versions size - 2)
yWFor: yesterdayCheck for: tomorrowCheck
^ ( 3 to: self versions size ) collect: [ :i |
| yesterday tomorrow |
yesterday := self
selectByExpression: yesterdayCheck
appliedFromVersionIndex: 1
toVersionIndexAndPresentInIt: i - 1.
tomorrow := self
selectByExpression: tomorrowCheck
appliedFromVersionIndexAndPresentInIt: i - 1
toVersionIndex: self versions size.
yesterday intersectWith: tomorrow ]
content form
content form
demo-
driven
research
www.tudorgirba.com
challenge
design
present
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
listen
Reviewers are never stupid
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
listen
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
listen
enable
it’s not Lupus
established
established
disruptive
established
What
Where
When
Who
How
What
Where
When
Who
How Why
demo-
driven
research
www.tudorgirba.com
challenge
design
demo
listen
enable
Tudor Gîrba
www.tudorgirba.com
creativecommons.org/licenses/by/3.0/

Más contenido relacionado

Destacado

IRA SIG Deaf HH newsletter 2010
IRA SIG Deaf HH newsletter 2010IRA SIG Deaf HH newsletter 2010
IRA SIG Deaf HH newsletter 2010
Sharon Pajka
 
Conversant what's driving_digital_2014
Conversant what's driving_digital_2014Conversant what's driving_digital_2014
Conversant what's driving_digital_2014
Jim Nichols
 
Ireland trip ireland
Ireland trip   irelandIreland trip   ireland
Ireland trip ireland
martap
 
Honduras(Archcomix.Com)
Honduras(Archcomix.Com)Honduras(Archcomix.Com)
Honduras(Archcomix.Com)
Martin Triana
 

Destacado (20)

App Measurement in India
App Measurement in IndiaApp Measurement in India
App Measurement in India
 
Переговорный мастер-класс, март 2009
Переговорный мастер-класс, март 2009Переговорный мастер-класс, март 2009
Переговорный мастер-класс, март 2009
 
IRA SIG Deaf HH newsletter 2010
IRA SIG Deaf HH newsletter 2010IRA SIG Deaf HH newsletter 2010
IRA SIG Deaf HH newsletter 2010
 
Web design1 2010/11
Web design1 2010/11Web design1 2010/11
Web design1 2010/11
 
Agile steps to improve the status quo
Agile steps to improve the status quoAgile steps to improve the status quo
Agile steps to improve the status quo
 
It's the Person, Not the Device!
It's the Person, Not the Device!It's the Person, Not the Device!
It's the Person, Not the Device!
 
Lok #13 - Sept23 Vancouver TrendCity
Lok #13 - Sept23 Vancouver TrendCityLok #13 - Sept23 Vancouver TrendCity
Lok #13 - Sept23 Vancouver TrendCity
 
K
KK
K
 
Conversant what's driving_digital_2014
Conversant what's driving_digital_2014Conversant what's driving_digital_2014
Conversant what's driving_digital_2014
 
Pittsburgh Volleyball Club Overview
Pittsburgh Volleyball Club OverviewPittsburgh Volleyball Club Overview
Pittsburgh Volleyball Club Overview
 
The Crows
The CrowsThe Crows
The Crows
 
Electoral Maps From 1952
Electoral Maps From 1952Electoral Maps From 1952
Electoral Maps From 1952
 
Comenius 2009/2011: Finland
Comenius 2009/2011: FinlandComenius 2009/2011: Finland
Comenius 2009/2011: Finland
 
Ireland trip ireland
Ireland trip   irelandIreland trip   ireland
Ireland trip ireland
 
Wikibrandsgeorgebrown
WikibrandsgeorgebrownWikibrandsgeorgebrown
Wikibrandsgeorgebrown
 
CJ Affiliate Holiday 2014 Analysis
CJ Affiliate Holiday 2014 Analysis CJ Affiliate Holiday 2014 Analysis
CJ Affiliate Holiday 2014 Analysis
 
Wikibrands (SMC Seattle)
Wikibrands (SMC Seattle)Wikibrands (SMC Seattle)
Wikibrands (SMC Seattle)
 
Honduras(Archcomix.Com)
Honduras(Archcomix.Com)Honduras(Archcomix.Com)
Honduras(Archcomix.Com)
 
Wikibrands, Wikicareers
Wikibrands, WikicareersWikibrands, Wikicareers
Wikibrands, Wikicareers
 
How I Sold Linux
How  I  Sold  LinuxHow  I  Sold  Linux
How I Sold Linux
 

Similar a Demo-driven research in Lugano

PSO and Its application in Engineering
PSO and Its application in EngineeringPSO and Its application in Engineering
PSO and Its application in Engineering
Prince Jain
 
Please help this code is supposed to evaluate current node state and i.pdf
Please help this code is supposed to evaluate current node state and i.pdfPlease help this code is supposed to evaluate current node state and i.pdf
Please help this code is supposed to evaluate current node state and i.pdf
climatecontrolsv
 
Please help me fix this code! will upvote. The code needs to produce .pdf
Please help me fix this code! will upvote.  The code needs to produce .pdfPlease help me fix this code! will upvote.  The code needs to produce .pdf
Please help me fix this code! will upvote. The code needs to produce .pdf
climatecontrolsv
 

Similar a Demo-driven research in Lugano (8)

Don't demo facts. Demo stories!
Don't demo facts. Demo stories!Don't demo facts. Demo stories!
Don't demo facts. Demo stories!
 
Introduction to search and optimisation for the design theorist
Introduction to search and optimisation for the design theoristIntroduction to search and optimisation for the design theorist
Introduction to search and optimisation for the design theorist
 
PSO and Its application in Engineering
PSO and Its application in EngineeringPSO and Its application in Engineering
PSO and Its application in Engineering
 
Please help this code is supposed to evaluate current node state and i.pdf
Please help this code is supposed to evaluate current node state and i.pdfPlease help this code is supposed to evaluate current node state and i.pdf
Please help this code is supposed to evaluate current node state and i.pdf
 
HIGHER MATHEMATICS
HIGHER MATHEMATICSHIGHER MATHEMATICS
HIGHER MATHEMATICS
 
Please help me fix this code! will upvote. The code needs to produce .pdf
Please help me fix this code! will upvote.  The code needs to produce .pdfPlease help me fix this code! will upvote.  The code needs to produce .pdf
Please help me fix this code! will upvote. The code needs to produce .pdf
 
Rules of derivative
Rules of derivativeRules of derivative
Rules of derivative
 
10 Recursion
10 Recursion10 Recursion
10 Recursion
 

Más de Tudor Girba

Más de Tudor Girba (20)

Beyond software evolution: Software environmentalism
Beyond software evolution: Software environmentalismBeyond software evolution: Software environmentalism
Beyond software evolution: Software environmentalism
 
Software craftsmanship meetup (Zurich 2015) on solving real problems without ...
Software craftsmanship meetup (Zurich 2015) on solving real problems without ...Software craftsmanship meetup (Zurich 2015) on solving real problems without ...
Software craftsmanship meetup (Zurich 2015) on solving real problems without ...
 
GT Spotter
GT SpotterGT Spotter
GT Spotter
 
Don't demo facts. Demo stories! (handouts)
Don't demo facts. Demo stories! (handouts)Don't demo facts. Demo stories! (handouts)
Don't demo facts. Demo stories! (handouts)
 
Humane assessment on cards
Humane assessment on cardsHumane assessment on cards
Humane assessment on cards
 
Underneath Scrum: Reflective Thinking
Underneath Scrum: Reflective ThinkingUnderneath Scrum: Reflective Thinking
Underneath Scrum: Reflective Thinking
 
1800+ TED talks later
1800+ TED talks later1800+ TED talks later
1800+ TED talks later
 
Software assessment by example (lecture at the University of Bern)
Software assessment by example (lecture at the University of Bern)Software assessment by example (lecture at the University of Bern)
Software assessment by example (lecture at the University of Bern)
 
Humane assessment: Taming the elephant from the development room
Humane assessment: Taming the elephant from the development roomHumane assessment: Taming the elephant from the development room
Humane assessment: Taming the elephant from the development room
 
Moose: how to solve real problems without reading code
Moose: how to solve real problems without reading codeMoose: how to solve real problems without reading code
Moose: how to solve real problems without reading code
 
Software Environmentalism (ECOOP 2014 Keynote)
Software Environmentalism (ECOOP 2014 Keynote)Software Environmentalism (ECOOP 2014 Keynote)
Software Environmentalism (ECOOP 2014 Keynote)
 
The emergent nature of software systems
The emergent nature of software systemsThe emergent nature of software systems
The emergent nature of software systems
 
Presenting is storytelling at Uni Zurich - slides (2014-03-05)
Presenting is storytelling at Uni Zurich - slides (2014-03-05)Presenting is storytelling at Uni Zurich - slides (2014-03-05)
Presenting is storytelling at Uni Zurich - slides (2014-03-05)
 
Presenting is storytelling at Uni Zurich - handouts (2014-03-05)
Presenting is storytelling at Uni Zurich - handouts (2014-03-05)Presenting is storytelling at Uni Zurich - handouts (2014-03-05)
Presenting is storytelling at Uni Zurich - handouts (2014-03-05)
 
Underneath Scrum: Reflective Thinking (talk at Scrum Breakfast Bern, 2013)
Underneath Scrum: Reflective Thinking (talk at Scrum Breakfast Bern, 2013)Underneath Scrum: Reflective Thinking (talk at Scrum Breakfast Bern, 2013)
Underneath Scrum: Reflective Thinking (talk at Scrum Breakfast Bern, 2013)
 
Demo-driven innovation teaser
Demo-driven innovation teaserDemo-driven innovation teaser
Demo-driven innovation teaser
 
Software assessment essentials (lecture at the University of Bern 2013)
Software assessment essentials (lecture at the University of Bern 2013)Software assessment essentials (lecture at the University of Bern 2013)
Software assessment essentials (lecture at the University of Bern 2013)
 
Demo-driven innovation (University of Zurich, June 2013)
Demo-driven innovation (University of Zurich, June 2013)Demo-driven innovation (University of Zurich, June 2013)
Demo-driven innovation (University of Zurich, June 2013)
 
Humane assessment with Moose at GOTO Aarhus 2011
Humane assessment with Moose at GOTO Aarhus 2011Humane assessment with Moose at GOTO Aarhus 2011
Humane assessment with Moose at GOTO Aarhus 2011
 
Flexible analysis with Moose at Jazoon 2011
Flexible analysis with Moose at Jazoon 2011Flexible analysis with Moose at Jazoon 2011
Flexible analysis with Moose at Jazoon 2011
 

Último

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Último (20)

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
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 🐘
 
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...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
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
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
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...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 

Demo-driven research in Lugano