SlideShare uma empresa Scribd logo
1 de 87
Baixar para ler offline
Dutch PHP
Conference:
Distilled
Chris Saylor
Stephen Young
@cjsaylor
@young_steveo
Focus of this talk
PHP by the Numbers
Emergent Design
What's new in PHP 5.5
Unbreakable Domain Models
PHP by the Numbers
Measuring Complexity
Cyclomatic complexity
N-path complexity
Cyclomatic complexity
The cyclomatic complexity of a method is the count of the number
of independent decision points in the method, plus one for the
method entry.
It's a fancy term for measuring the complexity of a method.
Decision points in a method increase complexity.
(e.g. if, else, foreach, etc.)
Plugins will calculate it for you.
(PHP Mess Detector, JSHint, Grunt!)
The lower, the better
1—4 low complexity, easy to maintain
5—7 moderate complexity
8—10 high complexity, hard to test
11+ ?
N-path complexity
The number of acyclic execution paths through a function; an
objective measure of complexity related to the ease with which
software can be comprehensively tested
acyclic execution paths?
It's a lot like cyclomatic complexity.
It measures how many straight lines you can draw through a
method.
A method with a single IFstatement has an N-path of 2.
A method with 2 IFstatements has an N-path of 4.
3 IFstatements would make the N-path 8.
Another way to look at it
The value of a method's N-path complexity is equal to the number
of unit tests needed to ensure that you have 100% code coverage.
A "quick estimate" for N-Path:
2^(cyclomaticComplexity - 1)
You have probably seen this
Running Grunt!
Running "jshint:source" (jshint) task
Linting app/webroot/js/views/doesEverythingView.js...
ERROR
[L31:C38] W074: This function's cyclomatic complexity is too high. (18)
Things to avoid
Violating the Single Responsibility Principle
A Controller method with logic to perform CRUD operations.
A Product Model with logic for formatting currency.
Seperation of Concerns
Too complex: A single method that executes four business
rules to perform a task.
Better: Four methods that each execute a single business rule.
Plan Ahead
It's common to be handed a user story that is simple to describe but
complex to implement.
Take time to break the logic into the smallest possible units before
writing code.
Emergent Design with
PHPSpec
Topics covered
1. PHPSpec overview
2. emergent design
3. simple design & smells
4. designing composition with mocks
What is PHPSpec?
it started as a port for rspec
Problem
PHP !== Ruby
in ruby everything is an object
and all objects are open
Also, monkey patching code at runtime is a typical practice in the Ruby world.
blowling.score.should eq(0)
an early PHPSpec syntax example
Trying to emulate ruby in PHP looks ugly
$this->spec($bowling->getScore())->shouldEqual(0);
PHPSpec's new goals
fun to work with
development tool
let's not get in the way
enforce TDD
do it the PHP way
Test Driven Development
yellow — Write the test first
red — Implement the class/method; test is failing
green — Test is passing
How PHPUnit handles the Yellow step
PHPUnit 3.7.14 by Sebastian Bergmann.
PHP Fatal error: Class 'Markdown' not found in /Users/stephenyoung/Documents/projects/Lab/phpuni
t/tests/MarkdownTest.php on line 8
Fatal error: Class 'Markdown' not found in /Users/stephenyoung/Documents/projects/Lab/phpunit/te
sts/MarkdownTest.php on line 8
How PHPSpec handles the Yellow step
it does this for missing methods too.
> specCustomer
✘ it converts plain text to html paragraphs
Class Markdown does not exist.
Do you want me to create it for you? [Y/n]
Mocking
It suffices to say that mocking is painful in PHPUnit.
PHPSpec has a very easy-to-use Mocking library.
Too much to go into here.
That's Enough about PHPSpec
It's a pretty awesome tool. Go check it out.
Emergent Design
What is software design?
Software design
is
the art of describing how to to solve a problem.
First learn design, then learn emergent
design
Alan Kay on Messaging
"The key in making great and growable systems is
much more to design how its modules
communicate rather than what their internal
properties and behaviors should be."
$this->person->getCar()->getEngine()->ignite();
Focusing on messaging makes code more
flexible
$this->person->startCar();
Software design
is
the art of describing how to to solve problems with roles,
responsibilities and messages
Big Design Up Front
It's hard to change later.
We need to think about things before developing.
We need to make sure we don't miss anything.
This is just the way we do it.
Y A G N I
61%
of all requested features are actually
delivered
27%
of all requested features are actually used
5% to 10%
are responsible for realising the
envisioned benefits
we should design for the high priority items and make it easy to
change later.
Agile Software design
is
the art of describing how to to solve problems with roles,
responsibilities and messages
in a change-friendly way
Easier said than done?
1. Test
2. Code
3. Refactor
4. Repeat
Use simple design rules to refactor
1. All tests run and pass
2. Remove duplication
3. Remove opacity
4. Remove complexity
What is the result of this method in your
code?
It is testable.
It is modular.
It is expressive.
It is simple.
What is the alternative?
Viscosity
Immobility, Rigidity, Fragility
Unreadable
Complex
Simple design enables smell detection
Simple Design
1. All tests run and pass
2. Remove duplication
3. Remove opacity
4. Remove complexity
smells
1. Test smells?
2. DRY smells?
3. Opacity smells?
4. Complexity smells?
Test smells
Lack of tests
Setup is too complex
Unclear exercise
No expectation
DRY Smells
Copy Pasta
Logic duplication
Duplicated constants
Alternative classes with different interfaces
Opacity smells
Naming not in the domain
Name does not express intent
Feature envy
Method too long
Method does more than one thing
Complexity smells
Unnecessary else
Unnecessary if
Unnecessary switch
Too many passed arguments
Use design patterns to refactor
What can happen in a method?
return a value
throw an exception
delegate
modify state not the final behavior
print something we should probably delegate that too
Design delegation with mocks
start by defining behavior
internally delegate to another method
Finally
Define new role
Extract collaborators using mocks
Move behavior definition to new collaborator test
What's new in PHP 5.5
Performance
Performance boost compared to 5.3 -> 5.4 is not as great as 5.4 ->
5.5
APC replacement
Zend's OPCache is now packaged with PHP 5.5 and APC is now
depricated
array_column
$keyValues = [
['key1' => 'val1', 'key2' => 'val2'],
['key1' => 'val3', 'key2' => 'val4']
];
var_dump(array_column($keyValues, 'key1'));
// yields array('val1', 'val3')
Foreach with list
$test = [
[1, 2],
[3, 4]
];
foreach ($test as list($a, $b)) {
echo "a: $a; b: $b";
}
// displays:
// a: 1; b: 2
// a: 3; b: 4
Finally a finally!
try {
doSomeWork();
return true;
} finally {
cleanUpSomeStuff();
echo "I am reachable!";
}
echo "I am not reachable :( ";
Generators
function lotsOfRecords() {
while ($row = $this->db->getNext()) {
yield $row['id'] => $row;
}
}
foreach (lotsOfRecords() as $id => $row) {
// do stuff
}
Password hashing API
echo password_hash('somepassword', PASSWORD_BCRYPT);
// $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
password_verify(
'somepassword',
'$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K'
);
// true
Unbreakable Domain Models
Use objects as consistency
boundaries
class Customer {
public function __construct($email) {
if( /* ugly regex here */) {
throw new InvalidArgumentException();
}
$this->email = $email;
}
}
Single Responsibility Principle
class Email {
private $email;
public function __construct($email) {
if( /* ugly regex here */) {
throw new InvalidArgumentException();
}
$this->email = $email;
}
public function __toString() {
return $this->email;
}
}
Customer class is now tighter
class Customer {
/** @var Email */
private $email;
public function __construct(Email $email) {
$this->email = $email;
}
}
Encapsulate state and
behavior with Value Objects
A user story may be:
"A customer orders products and pays for them."
Procedural
$order = new Order;
$order->setCustomer($customer);
$order->setProducts($products);
$order->setStatus(Order::UNPAID);
// ...
$order->setPaidAmount(500);
$order->setPaidCurrency(‘EUR’);
$order->setStatus(Order::PAID);
Improve it with object for
consistency
$order = new Order;
$order->setCustomer($customer);
$order->setProducts($products);
$order->setStatus(
new PaymentStatus(PaymentStatus::UNPAID)
);
$order->setPaidAmount(500);
$order->setPaidCurrency(‘EUR’);
$order->setStatus(
new PaymentStatus(PaymentStatus::PAID)
);
Improve it with more
consistency
$order = new Order;
$order->setCustomer($customer);
$order->setProducts($products);
$order->setStatus(
new PaymentStatus(PaymentStatus::UNPAID)
);
$order->setPaidMonetary(
new Money(500, new Currency(‘EUR’))
);
$order->setStatus(
new PaymentStatus(PaymentStatus::PAID)
);
Even more
$order = new Order($customer, $products);
// set PaymentStatus in Order::__construct()
$order->setPaidMonetary(
new Money(500, new Currency(‘EUR’))
);
$order->setStatus(
new PaymentStatus(PaymentStatus::PAID)
);
Getting ridiculous now
$order = new Order($customer, $products);
$order->pay(
new Money(500, new Currency(‘EUR’))
);
// set PaymentStatus in Order#pay()
Encapsulation through
specification
"I want to give a discount to a customer that has at least 3 orders."
interface CustomerSpecification {
/** @return bool */
public function isSatisfiedBy(Customer $customer);
}
class CustomerIsPremium implements CustomerSpecification {
private $orderRepository;
public function __construct(
OrderRepository $orderRepository
) {...}
/** @return bool */
public function isSatisfiedBy(Customer $customer) {
$count = $this->orderRepository->countFor($customer);
return $count >= 3;
}
}
$customerIsPremium = new CustomerIsPremium($orderRepository)
if($customerIsPremium->isSatisfiedBy($customer)) {
// send special offer
}
Credits
PHP By the numbers - Anthony Ferrara
Emergent Design with phpspec - Marcello Duarte
Unbreakable Domain Models - Mathias Verraes
Let's have a look at PHP 5.5 - Julien Pauli

Mais conteúdo relacionado

Mais procurados

Refactoring and code smells
Refactoring and code smellsRefactoring and code smells
Refactoring and code smellsPaul Nguyen
 
Refactoring PHP
Refactoring PHPRefactoring PHP
Refactoring PHPAdam Culp
 
Drupaljam xl 2019 presentation multilingualism makes better programmers
Drupaljam xl 2019 presentation   multilingualism makes better programmersDrupaljam xl 2019 presentation   multilingualism makes better programmers
Drupaljam xl 2019 presentation multilingualism makes better programmersAlexander Varwijk
 
Frege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVMFrege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVMDierk König
 
Yeahhhh the final requirement!!!
Yeahhhh the final requirement!!!Yeahhhh the final requirement!!!
Yeahhhh the final requirement!!!olracoatalub
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your CodeNate Abele
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in PythonHaim Michael
 
Macasu, gerrell c.
Macasu, gerrell c.Macasu, gerrell c.
Macasu, gerrell c.gerrell
 
Preprocessor directives in c language
Preprocessor directives in c languagePreprocessor directives in c language
Preprocessor directives in c languagetanmaymodi4
 

Mais procurados (20)

JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
 
Refactoring and code smells
Refactoring and code smellsRefactoring and code smells
Refactoring and code smells
 
Refactoring PHP
Refactoring PHPRefactoring PHP
Refactoring PHP
 
Drupaljam xl 2019 presentation multilingualism makes better programmers
Drupaljam xl 2019 presentation   multilingualism makes better programmersDrupaljam xl 2019 presentation   multilingualism makes better programmers
Drupaljam xl 2019 presentation multilingualism makes better programmers
 
Frege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVMFrege - consequently functional programming for the JVM
Frege - consequently functional programming for the JVM
 
Switch case and looping
Switch case and loopingSwitch case and looping
Switch case and looping
 
Yeahhhh the final requirement!!!
Yeahhhh the final requirement!!!Yeahhhh the final requirement!!!
Yeahhhh the final requirement!!!
 
Introduction to Procedural Programming in C++
Introduction to Procedural Programming in C++Introduction to Procedural Programming in C++
Introduction to Procedural Programming in C++
 
Survelaine murillo ppt
Survelaine murillo pptSurvelaine murillo ppt
Survelaine murillo ppt
 
OOP and FP
OOP and FPOOP and FP
OOP and FP
 
My final requirement
My final requirementMy final requirement
My final requirement
 
Php Debugger
Php DebuggerPhp Debugger
Php Debugger
 
Visual Basic 6.0
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
 
88 c-programs
88 c-programs88 c-programs
88 c-programs
 
Introduction to refactoring
Introduction to refactoringIntroduction to refactoring
Introduction to refactoring
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
Modular programming in qbasic
Modular programming in qbasicModular programming in qbasic
Modular programming in qbasic
 
Macasu, gerrell c.
Macasu, gerrell c.Macasu, gerrell c.
Macasu, gerrell c.
 
Preprocessor directives in c language
Preprocessor directives in c languagePreprocessor directives in c language
Preprocessor directives in c language
 

Destaque

Grade 9 Module In ARTS
Grade 9 Module In ARTSGrade 9 Module In ARTS
Grade 9 Module In ARTSKimberly Abao
 
Outdoor recreational activities
Outdoor recreational activitiesOutdoor recreational activities
Outdoor recreational activitiesjayson bagaoi
 
Indoor Recreational Activities
Indoor Recreational ActivitiesIndoor Recreational Activities
Indoor Recreational ActivitiesMariyah Ayoniv
 
Recreational Activities
Recreational ActivitiesRecreational Activities
Recreational ActivitiesRodel Sinamban
 
Western Classical Plays
Western Classical PlaysWestern Classical Plays
Western Classical PlaysMariyah Ayoniv
 

Destaque (7)

Romantic opera
Romantic operaRomantic opera
Romantic opera
 
Romantic opera
Romantic operaRomantic opera
Romantic opera
 
Grade 9 Module In ARTS
Grade 9 Module In ARTSGrade 9 Module In ARTS
Grade 9 Module In ARTS
 
Outdoor recreational activities
Outdoor recreational activitiesOutdoor recreational activities
Outdoor recreational activities
 
Indoor Recreational Activities
Indoor Recreational ActivitiesIndoor Recreational Activities
Indoor Recreational Activities
 
Recreational Activities
Recreational ActivitiesRecreational Activities
Recreational Activities
 
Western Classical Plays
Western Classical PlaysWestern Classical Plays
Western Classical Plays
 

Semelhante a Dutch PHP Conference 2013: Distilled

Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principlesEdorian
 
Benchmarking and PHPBench
Benchmarking and PHPBenchBenchmarking and PHPBench
Benchmarking and PHPBenchdantleech
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everythingnoelrap
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
Problem solving using computers - Chapter 1
Problem solving using computers - Chapter 1 Problem solving using computers - Chapter 1
Problem solving using computers - Chapter 1 To Sum It Up
 
The why and how of moving to php 5.4
The why and how of moving to php 5.4The why and how of moving to php 5.4
The why and how of moving to php 5.4Wim Godden
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratiehcderaad
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php PresentationAlan Pinstein
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your CodeNate Abele
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0Nate Abele
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6Wim Godden
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiRan Mizrahi
 
Automation Testing theory notes.pptx
Automation Testing theory notes.pptxAutomation Testing theory notes.pptx
Automation Testing theory notes.pptxNileshBorkar12
 

Semelhante a Dutch PHP Conference 2013: Distilled (20)

Save time by applying clean code principles
Save time by applying clean code principlesSave time by applying clean code principles
Save time by applying clean code principles
 
Programming Fundamentals
Programming FundamentalsProgramming Fundamentals
Programming Fundamentals
 
Tdd is not about testing
Tdd is not about testingTdd is not about testing
Tdd is not about testing
 
Benchmarking and PHPBench
Benchmarking and PHPBenchBenchmarking and PHPBench
Benchmarking and PHPBench
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
The Joy Of Ruby
The Joy Of RubyThe Joy Of Ruby
The Joy Of Ruby
 
Search Lucene
Search LuceneSearch Lucene
Search Lucene
 
Problem solving using computers - Chapter 1
Problem solving using computers - Chapter 1 Problem solving using computers - Chapter 1
Problem solving using computers - Chapter 1
 
Magento code audit
Magento code auditMagento code audit
Magento code audit
 
The why and how of moving to php 5.4
The why and how of moving to php 5.4The why and how of moving to php 5.4
The why and how of moving to php 5.4
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
Code metrics in PHP
Code metrics in PHPCode metrics in PHP
Code metrics in PHP
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 
Automation Testing theory notes.pptx
Automation Testing theory notes.pptxAutomation Testing theory notes.pptx
Automation Testing theory notes.pptx
 
Java introduction
Java introductionJava introduction
Java introduction
 

Último

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
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?Antenna Manufacturer Coco
 
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 Scriptwesley chun
 
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 2024The Digital Insurer
 
[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.pdfhans926745
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
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 AutomationSafe Software
 
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 MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
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 MenDelhi Call girls
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
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 textsMaria Levchenko
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 

Último (20)

Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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?
 
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
 
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
 
[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
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.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
 
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
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
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
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

Dutch PHP Conference 2013: Distilled