SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
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

Contenu connexe

Similaire à 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
 

Similaire à 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
 

Dernier

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 

Dernier (20)

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 

Affordances in Programming Languages