SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
3/20/2014 Affordances
http://localhost:9090/onepage 1/67
Affordances in
Programming Languages
Randy Coulman
Principal Software Engineer
http://randycoulman.com
 @randycoulman
 randycoulman
3/20/2014 Affordances
http://localhost:9090/onepage 2/67
Satu Kyröläinen ­ http://www.satukyrolainen.com/affordances/
3/20/2014 Affordances
http://localhost:9090/onepage 3/67
Satu Kyröläinen ­ http://www.satukyrolainen.com/affordances/
3/20/2014 Affordances
http://localhost:9090/onepage 4/67
Affordance
A quality of an object or environment that allows someone to
perform an action.
3/20/2014 Affordances
http://localhost:9090/onepage 5/67
Nicolas Nova ­ http://www.flickr.com/photos/nnova/2252222949/
3/20/2014 Affordances
http://localhost:9090/onepage 6/67
William Lindeke ­ http://tcsidewalks.blogspot.com/2009/06/signs­of­times­14.html
3/20/2014 Affordances
http://localhost:9090/onepage 7/67
Yoni Alter ­ http://www.yoniishappy.com/Tube­escalators
3/20/2014 Affordances
http://localhost:9090/onepage 8/67
Affordances and Software
3/20/2014 Affordances
http://localhost:9090/onepage 9/67
Amir Rajan (@amirrajan)
Coding Out Loud ­ REST APIs series
http://vimeo.com/channels/659338
3/20/2014 Affordances
http://localhost:9090/onepage 10/67
Example
Points
Smalltalk ­> Ruby
3/20/2014 Affordances
http://localhost:9090/onepage 11/67
class Point
def initialize(x, y)
@x = x
@y = y
end
end
Point.new(3, 4)
3/20/2014 Affordances
http://localhost:9090/onepage 12/67
http://images.cryhavok.org/d/25562­2/Polar+and+Cartesian+Bears.jpg
3/20/2014 Affordances
http://localhost:9090/onepage 13/67
θ
r sinθ
r cosθ
r
x
y
http://upload.wikimedia.org/wikipedia/commons/7/78/Polar_to_cartesian.svg
3/20/2014 Affordances
http://localhost:9090/onepage 14/67
class Point
def initialize(x, y)
@x = x
@y = y
end
end
Point.new(3, 4)
3/20/2014 Affordances
http://localhost:9090/onepage 15/67
Point class>>x: anX y: aY
^self new initializeX: anX y: aY
Point>>initializeX: anX y: aY
x := anX.
y := aY
Point x: 3 y: 4
3/20/2014 Affordances
http://localhost:9090/onepage 16/67
Point class>>
r: radius theta: angleInRadians
^self x: radius * angleInRadians cos
y: radius * angleInRadians sin
Point r: 5 theta: 0.927295
3/20/2014 Affordances
http://localhost:9090/onepage 17/67
Affordance
Named Constructors
3/20/2014 Affordances
http://localhost:9090/onepage 18/67
class Point
def self.xy(x, y)
new(x, y)
end
def self.polar(r, theta)
xy(r * Math.cos(theta),
r * Math.sin(theta))
end
private_class_method :new
# ... rest same as before
end
Point.xy(3, 4)
Point.polar(5, 0.927295)
3/20/2014 Affordances
http://localhost:9090/onepage 19/67
Example
Find/Detect
Smalltalk ­> Ruby
3/20/2014 Affordances
http://localhost:9090/onepage 20/67
#(2 4 6 8)
detect: [:each | each odd]
"Unhandled exception: Element Not Found"
3/20/2014 Affordances
http://localhost:9090/onepage 21/67
[2, 4, 6, 8].find { |n| n.odd? }
# => nil
3/20/2014 Affordances
http://localhost:9090/onepage 22/67
#(2 4 6 8)
detect: [:each | each odd]
ifNone: [#none]
"#none"
3/20/2014 Affordances
http://localhost:9090/onepage 23/67
Affordance
Multiple Blocks
3/20/2014 Affordances
http://localhost:9090/onepage 24/67
[2, 4, 6, 8].find(-> {:none}) { |n|
n.odd?
} # => :none
3/20/2014 Affordances
http://localhost:9090/onepage 25/67
Linguistic Relativity
a.k.a. The Sapir­Whorf Hypothesis
"[T]he structure of a language affects the ways in which its
respective speakers conceptualize their world ... or otherwise
influences their cognitive processes."
­­ http://en.wikipedia.org/wiki/Linguistic_relativity
3/20/2014 Affordances
http://localhost:9090/onepage 26/67
When Code Cries
Cory Foy at SCNA 2012
http://vimeo.com/53986875
What does a language allow you to say?
What does a language force you to say?
3/20/2014 Affordances
http://localhost:9090/onepage 27/67
The Power and Philsophy of Ruby
Matz at OSCON 2003
http://www.rubyist.net/~matz/slides/oscon2003/mgp00001.html
"Languages are not only tools to communicate, but also tools
to think."
3/20/2014 Affordances
http://localhost:9090/onepage 28/67
Example
Cleaning Up After Yourself
C++ ­> Ruby
3/20/2014 Affordances
http://localhost:9090/onepage 29/67
if ((err = SSLFreeBuffer(&hashCtx)) != 0)
goto fail;
if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) !=
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) !=
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) !=
goto fail;
goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
//...
fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;
3/20/2014 Affordances
http://localhost:9090/onepage 30/67
#include "support.h"
#include <iostream>
void foo()
{
Resource* resource =
acquireResource();
bar(resource);
if (baz(resource) != 42) return;
std::cout << "Completed successfully!"
<< std::endl;
releaseResource(resource);
}
3/20/2014 Affordances
http://localhost:9090/onepage 31/67
$ ./broken
Acquiring resource
Caught exception: oops!
3/20/2014 Affordances
http://localhost:9090/onepage 32/67
#include "support.h"
#include <iostream>
void foo()
{
Resource* resource = acquireResource();
try
{
bar(resource);
if (baz(resource) == 42)
{
std::cout << "Completed successfully!"
<< std::endl;
}
}
catch(std::exception& e)
{
releaseResource(resource);
throw;
}
releaseResource(resource);
}
3/20/2014 Affordances
http://localhost:9090/onepage 33/67
$ ./wordy
Acquiring resource
Releasing resource
Caught exception: oops!
3/20/2014 Affordances
http://localhost:9090/onepage 34/67
#include "support.h"
#include <iostream>
void foo()
{
Resource* resource = acquireResource();
try
{
bar(resource);
if (baz(resource) == 42)
{
std::cout << "Completed successfully!"
<< std::endl;
}
}
catch(std::exception& e)
{
releaseResource(resource);
throw;
}
releaseResource(resource);
}
3/20/2014 Affordances
http://localhost:9090/onepage 35/67
3/20/2014 Affordances
http://localhost:9090/onepage 36/67
RAII
Resource Acquisition Is Initialization
Acquire resources in the constructor
Release them in the destructor
3/20/2014 Affordances
http://localhost:9090/onepage 37/67
#include "SafeResource.h"
#include "support.h"
SafeResource::SafeResource() :
resource(acquireResource())
{
}
SafeResource::~SafeResource()
{
releaseResource(resource);
}
Resource* SafeResource::get()
{
return resource;
}
3/20/2014 Affordances
http://localhost:9090/onepage 38/67
#include "SafeResource.h"
#include "support.h"
#include <iostream>
void foo()
{
SafeResource resource;
bar(resource.get());
if (baz(resource.get()) != 42) return
std::cout << "Completed successfully!"
<< std::endl;
}
3/20/2014 Affordances
http://localhost:9090/onepage 39/67
$ ./raii
Acquiring resource
Releasing resource
Caught exception: oops!
3/20/2014 Affordances
http://localhost:9090/onepage 40/67
Affordance
Deterministic Destructors
3/20/2014 Affordances
http://localhost:9090/onepage 41/67
Ruby doesn't have deterministic destructors.
So what can we do instead?
3/20/2014 Affordances
http://localhost:9090/onepage 42/67
Blocks!
3/20/2014 Affordances
http://localhost:9090/onepage 43/67
class SafeResource
def self.acquire
resource = self.new
yield resource
ensure
resource.release
end
def initialize
puts "Acquiring resource"
@resource = Object.new
end
def release
puts "Releasing resource"
@resource = nil
end
3/20/2014 Affordances
http://localhost:9090/onepage 44/67
require_relative "support"
require_relative "safe_resource"
def foo
SafeResource.acquire do |resource|
bar(resource)
return unless baz(resource) == 42
puts "Completed successfully!"
end
end
3/20/2014 Affordances
http://localhost:9090/onepage 45/67
$ ruby driver.rb
Acquiring resource
Releasing resource
Caught exception: oops!
3/20/2014 Affordances
http://localhost:9090/onepage 46/67
Example
ImageReader
Smalltalk ­> Ruby
3/20/2014 Affordances
http://localhost:9090/onepage 47/67
ImageReader class>>fromFile: aFilename
| readerClass imageStream reader |
imageStream := aFilename readStream binary.
[readerClass := self readerClassFor: imageStream.
readerClass ifNil:
[^self error: 'Unknown image type: ',
aFilename asString].
reader := readerClass on: imageStream]
ensure: [imageStream close].
^reader
3/20/2014 Affordances
http://localhost:9090/onepage 48/67
ImageReader class>>readerClassFor: imageStream
^self subclasses
detect: [:eachClass |
imageStream reset.
[eachClass canRead: imageStream]
ensure: [imageStream reset]]
ifNone: [nil]
3/20/2014 Affordances
http://localhost:9090/onepage 49/67
Affordance
Subclass Iteration
3/20/2014 Affordances
http://localhost:9090/onepage 50/67
class ImageReader
def self.read(filename)
File.open(filename, "rb") do |io|
reader_class = find_reader_class(io)
raise "Unknown image type: #{filename}" unless reader_class
reader_class.new(io)
end
end
#...
end
3/20/2014 Affordances
http://localhost:9090/onepage 51/67
class ImageReader
#...
def self.find_reader_class(io)
subclasses.find { |reader|
begin
io.rewind
reader.can_read?(io)
ensure
io.rewind
end
}
end
#...
end
3/20/2014 Affordances
http://localhost:9090/onepage 52/67
class ImageReader
#...
def self.inherited(subclass)
subclasses << subclass
end
def self.subclasses
@subclasses ||= []
end
#...
end
3/20/2014 Affordances
http://localhost:9090/onepage 53/67
class BMPImageReader < ImageReader
def self.can_read?(io)
io.read(2) == "BM"
end
def read_image
puts "Reading BMP"
end
end
3/20/2014 Affordances
http://localhost:9090/onepage 54/67
class JPGImageReader < ImageReader
def self.can_read?(io)
io.read(2) == "xFFxD8".b
end
def read_image
puts "Reading JPG"
end
end
3/20/2014 Affordances
http://localhost:9090/onepage 55/67
class PNGImageReader < ImageReader
def self.can_read?(io)
io.read(8) == "x89PNGrnx1An".b
end
def read_image
puts "Reading PNG"
end
end
3/20/2014 Affordances
http://localhost:9090/onepage 56/67
require_relative "image_readers"
%w{bmp jpg png}.each do |ext|
ImageReader.read("example.#{ext}")
end
3/20/2014 Affordances
http://localhost:9090/onepage 57/67
$ ruby subclasses.rb
Reading BMP
Reading JPG
Reading PNG
3/20/2014 Affordances
http://localhost:9090/onepage 58/67
Takeaways
3/20/2014 Affordances
http://localhost:9090/onepage 59/67
Languages afford certain designs
and inhibit others
3/20/2014 Affordances
http://localhost:9090/onepage 60/67
Languages influence thought
3/20/2014 Affordances
http://localhost:9090/onepage 61/67
Learning new languages will
increase your "solution space"
3/20/2014 Affordances
http://localhost:9090/onepage 62/67
Don't go too far
3/20/2014 Affordances
http://localhost:9090/onepage 63/67
Want More?
http://randycoulman.com/blog/categories/affordances/
3/20/2014 Affordances
http://localhost:9090/onepage 64/67
Acknowledgements
Key Technology (http://www.key.net/)
Rogue.rb (@roguerb)
Jen Myers (@antiheroine)
3/20/2014 Affordances
http://localhost:9090/onepage 65/67
References
The Design of Every Day Things ­ Donald Norman
Coding Out Loud ­ Amir Rajan
Linguistic Relativity ­ Wikipedia article
When Code Cries ­ Cory Foy at SCNA 2012
The Power and Philosophy of Ruby ­ Matz at OSCON 2003
3/20/2014 Affordances
http://localhost:9090/onepage 66/67
Questions?
3/20/2014 Affordances
http://localhost:9090/onepage 67/67
Randy Coulman
http://speakerrate.com/randycoulman
http://www.slideshare.net/randycoulman
http://randycoulman.com
 @randycoulman
 randycoulman

Weitere ähnliche Inhalte

Ähnlich wie Affordances in Programming Languages

History & Practices for UniRx(EN)
History & Practices for UniRx(EN)History & Practices for UniRx(EN)
History & Practices for UniRx(EN)Yoshifumi Kawai
 
Extreme APIs for a better tomorrow
Extreme APIs for a better tomorrowExtreme APIs for a better tomorrow
Extreme APIs for a better tomorrowAaron Maturen
 
Effective Web Application Development with Apache Sling
Effective Web Application Development with Apache SlingEffective Web Application Development with Apache Sling
Effective Web Application Development with Apache SlingRobert Munteanu
 
Container (Docker) Orchestration Tools
Container (Docker) Orchestration ToolsContainer (Docker) Orchestration Tools
Container (Docker) Orchestration ToolsDhilipsiva DS
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011tobiascrawley
 
Automatisation in development and testing - within budget [IronCamp prague 20...
Automatisation in development and testing - within budget [IronCamp prague 20...Automatisation in development and testing - within budget [IronCamp prague 20...
Automatisation in development and testing - within budget [IronCamp prague 20...David Lukac
 
Linked data: spreading data over the web
Linked data: spreading data over the webLinked data: spreading data over the web
Linked data: spreading data over the webshellac
 
Terraform Introduction
Terraform IntroductionTerraform Introduction
Terraform Introductionsoniasnowfrog
 
10 things about BDD, Cucumber and SpecFlow - Long Version 2016
10 things about BDD, Cucumber and SpecFlow - Long Version 201610 things about BDD, Cucumber and SpecFlow - Long Version 2016
10 things about BDD, Cucumber and SpecFlow - Long Version 2016Seb Rose
 
REST teori og praksis; REST in theory and practice
REST teori og praksis; REST in theory and practiceREST teori og praksis; REST in theory and practice
REST teori og praksis; REST in theory and practicehamnis
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
HTTP APIs as first class procedures in your language: cutting out SDK complex...
HTTP APIs as first class procedures in your language: cutting out SDK complex...HTTP APIs as first class procedures in your language: cutting out SDK complex...
HTTP APIs as first class procedures in your language: cutting out SDK complex...ProgrammableWeb
 
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...DynamicInfraDays
 
How to Create your Own Exchange Compatible Backend
How to Create your Own Exchange Compatible BackendHow to Create your Own Exchange Compatible Backend
How to Create your Own Exchange Compatible BackendJulien Kerihuel
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHiroshi SHIBATA
 
Building domain-specific testing tools : lessons learned from the Apache Slin...
Building domain-specific testing tools : lessons learned from the Apache Slin...Building domain-specific testing tools : lessons learned from the Apache Slin...
Building domain-specific testing tools : lessons learned from the Apache Slin...Robert Munteanu
 
Socket applications
Socket applicationsSocket applications
Socket applicationsJoão Moura
 

Ähnlich wie Affordances in Programming Languages (20)

History & Practices for UniRx(EN)
History & Practices for UniRx(EN)History & Practices for UniRx(EN)
History & Practices for UniRx(EN)
 
Sprockets
SprocketsSprockets
Sprockets
 
An API Your Parents Would Be Proud Of
An API Your Parents Would Be Proud OfAn API Your Parents Would Be Proud Of
An API Your Parents Would Be Proud Of
 
Extreme APIs for a better tomorrow
Extreme APIs for a better tomorrowExtreme APIs for a better tomorrow
Extreme APIs for a better tomorrow
 
Effective Web Application Development with Apache Sling
Effective Web Application Development with Apache SlingEffective Web Application Development with Apache Sling
Effective Web Application Development with Apache Sling
 
Container (Docker) Orchestration Tools
Container (Docker) Orchestration ToolsContainer (Docker) Orchestration Tools
Container (Docker) Orchestration Tools
 
Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
Automatisation in development and testing - within budget [IronCamp prague 20...
Automatisation in development and testing - within budget [IronCamp prague 20...Automatisation in development and testing - within budget [IronCamp prague 20...
Automatisation in development and testing - within budget [IronCamp prague 20...
 
Linked data: spreading data over the web
Linked data: spreading data over the webLinked data: spreading data over the web
Linked data: spreading data over the web
 
Terraform Introduction
Terraform IntroductionTerraform Introduction
Terraform Introduction
 
10 things about BDD, Cucumber and SpecFlow - Long Version 2016
10 things about BDD, Cucumber and SpecFlow - Long Version 201610 things about BDD, Cucumber and SpecFlow - Long Version 2016
10 things about BDD, Cucumber and SpecFlow - Long Version 2016
 
REST teori og praksis; REST in theory and practice
REST teori og praksis; REST in theory and practiceREST teori og praksis; REST in theory and practice
REST teori og praksis; REST in theory and practice
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
HTTP APIs as first class procedures in your language: cutting out SDK complex...
HTTP APIs as first class procedures in your language: cutting out SDK complex...HTTP APIs as first class procedures in your language: cutting out SDK complex...
HTTP APIs as first class procedures in your language: cutting out SDK complex...
 
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...
ContainerDays NYC 2016: "OpenWhisk: A Serverless Computing Platform" (Rodric ...
 
How to Create your Own Exchange Compatible Backend
How to Create your Own Exchange Compatible BackendHow to Create your Own Exchange Compatible Backend
How to Create your Own Exchange Compatible Backend
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
HTTP/2 -- the future of WWW
HTTP/2 -- the future of WWWHTTP/2 -- the future of WWW
HTTP/2 -- the future of WWW
 
Building domain-specific testing tools : lessons learned from the Apache Slin...
Building domain-specific testing tools : lessons learned from the Apache Slin...Building domain-specific testing tools : lessons learned from the Apache Slin...
Building domain-specific testing tools : lessons learned from the Apache Slin...
 
Socket applications
Socket applicationsSocket applications
Socket applications
 

Kürzlich hochgeladen

DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
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...apidays
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
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 FresherRemote DBA Services
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
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 educationjfdjdjcjdnsjd
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
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 FMESafe Software
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 

Kürzlich hochgeladen (20)

DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
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...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
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
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
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
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

Affordances in Programming Languages