$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Adaptive and evolvable apps
Search
Ben Longden
May 08, 2015
Technology
0
410
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
57
Silex, the micro-framework
blongden
3
590
Other Decks in Technology
See All in Technology
Challenging Hardware Contests with Zephyr and Lessons Learned
iotengineer22
0
120
Playwrightのソースコードに見る、自動テストを自動で書く技術
yusukeiwaki
13
5k
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
430
LLM-Readyなデータ基盤を高速に構築するためのアジャイルデータモデリングの実例
kashira
0
210
手動から自動へ、そしてその先へ
moritamasami
0
280
Haskell を武器にして挑む競技プログラミング ─ 操作的思考から意味モデル思考へ
naoya
4
820
[CMU-DB-2025FALL] Apache Fluss - A Streaming Storage for Real-Time Lakehouse
jark
0
110
Edge AI Performance on Zephyr Pico vs. Pico 2
iotengineer22
0
110
AWS CLIの新しい認証情報設定方法aws loginコマンドの実態
wkm2
5
560
AWS re:Invent 2025で見たGrafana最新機能の紹介
hamadakoji
0
130
Snowflakeでデータ基盤を もう一度作り直すなら / rebuilding-data-platform-with-snowflake
pei0804
2
760
[デモです] NotebookLM で作ったスライドの例
kongmingstrap
0
100
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Unsuck your backbone
ammeep
671
58k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Being A Developer After 40
akosma
91
590k
Faster Mobile Websites
deanohume
310
31k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Site-Speed That Sticks
csswizardry
13
990
Building an army of robots
kneath
306
46k
A Modern Web Designer's Workflow
chriscoyier
698
190k
How to Ace a Technical Interview
jacobian
280
24k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
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