SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a 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
 

Semelhante a 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
 

Último

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
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
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
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
 
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
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
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
 
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
 
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
 

Último (20)

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
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
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.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
 
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
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
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
 
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
 
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
 

Affordances in Programming Languages