Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Adaptive and evolvable apps
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ben Longden
May 08, 2015
Technology
0
420
Adaptive and evolvable apps
Ben Longden
May 08, 2015
Tweet
Share
More Decks by Ben Longden
See All by Ben Longden
Spryker, an architecture for the web
blongden
0
310
Building better clients
blongden
0
67
Silex, the micro-framework
blongden
3
590
Other Decks in Technology
See All in Technology
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.5k
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
170
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
150
プロダクト成長を支える開発基盤とスケールに伴う課題
yuu26
4
1.3k
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.4k
MCPでつなぐElasticsearchとLLM - 深夜の障害対応を楽にしたい / Bridging Elasticsearch and LLMs with MCP
sashimimochi
0
170
Introduction to Bill One Development Engineer
sansan33
PRO
0
360
What happened to RubyGems and what can we learn?
mikemcquaid
0
300
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.8k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
13k
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
140
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
190
Featured
See All Featured
Everyday Curiosity
cassininazir
0
130
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
770
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Paper Plane
katiecoart
PRO
0
46k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
310
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
100
GitHub's CSS Performance
jonrohan
1032
470k
Transcript
Adap%ve(and(evolvable(applica%ons Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 1
What%is%hypermedia? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 2
What%does%it%look%like? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 3
How$can$I$make$use$of$it$in$my$ apps? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 4
There%are%two%types%of%API%client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 5
Machine(driven Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 6
Human&driven Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 7
Consider)the)web)browser Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 8
The$data Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 9
What%the%client%should%do%next Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 10
Hypermedia*is*defined*by*the* presence*of*applica5on*control* informa5on*embedded*within,*or*as* a*layer*above,*the*presenta5on*of* informa5on —"Roy"Fielding Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 11
<a href=“http://example.org/next”>next</a> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 12
<form method=“GET” action=“http://example.org/search”> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 13
<img src=“http://example.org/thing.gif” title=“thing”> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 14
A"browser"is"designed"so"that"its" hypermedia"affordances"are" controlled"by"humans Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 15
What%about%when%the%consumer%is%a% smartphone/web%applica4on? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 16
Hypermedia*Applica.on*Language { "_links": { "self": { "href": "/orders/1" }, "next":
{ "href": "/orders/2" } }, "_embedded": { "items": [ { "_links": { "self": { "href": "/items/1" } } "price": "10" } ] }, "total": "10" } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 17
HAL$contains$two$types$of$link$affordance Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 18
Outbound(naviga-onal { "_links": { "self": { "href": "http://example.org/thing/2" }, "prev":
{ "href": "http://example.org/thing/1" }, "next": { "href": "http://example.org/thing/3" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 19
Embedded { "_embedded": { "things": [ { ... } ]
} } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 20
This%allows%the%message%to%contain% both%the%data%and%the%context Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 21
Less$logic$in$the$client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 22
weluse/hyperagent Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 23
{ "_links": { "self": { "href": "http://example.org/thing/2" }, "prev": {
"href": "http://example.org/thing/1" }, "next": { "href": "http://example.org/thing/3" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 24
root.links['next'].fetch().then(function (thing) { // do something with the 'next' item
}); Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 25
Clients(can(adapt(to(change Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 26
The$server$can$evolve$independently$ from$the$client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 27
URLs Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 28
Avoid&assembling&URLs var link = 'http://example.org/thing/' + id; Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 29
Use$a$link$template$on$the$home$if$you$need$to$convert$an$id$to$a$URL { "_links": { "self": { "href": "/" }, "thing":
{ "href": "http://example.org/thing/{id}", "templated": "true" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 30
Link%templates%with%hyperagent var link = root.link('thing', { id: id }); Adap%ve(and(evolvable(applica%ons(0(Ben(Longden
31
RFC6570()(URI(Templates Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 32
JSON%Schema Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 33
{ "title": "Example Schema", "type": "object", "properties": { "firstName": {
"type": "string" }, "lastName": { "type": "string" }, "age": { "description": "Age in years", "type": "integer", "minimum": 0 } }, "required": ["firstName", "lastName"] } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 34
JSON%Form (or$Angular$Schema$Form) Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 35
Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 36
Three%good%things Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 37
• Hypermedia • Link.templates • JSON.Schema Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 38
One$goal Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 39
Put$control$back$on$the$server Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 40
React&to&change&in&a&posi.ve&way Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 41
Ben$Longden CTO$Inviqa @blongden Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 42