Do you know what your enterprise apps get up to in their time off? Fighting fantasy, pick-your-path, hypermedia-driven, RESTful Web application adventures--of course.
In this dungeon delve I'll show how we can use hypermedia-driven Web applications to model rich workflows. We'll tackle the many-headed Hydra of HATEOAS, the “Hypermedia as the Engine of Application State” monster; level up through the Web services maturity heuristic; and meet the dwarves with grudges. As we explore the ruins of the enterprise BPM landscape, we'll learn how to model business processes as domain application protocols, implement them in terms of resource lifecycles, and advertise them using HTTP idioms, media types and link relation values.
ABOUT IAN ROBINSON
Ian is a principal consultant with ThoughtWorks, where he helps clients create sustainable service-oriented development capabilities that align business and IT from inception through to operation.
Welcome to our yearly report on the content marketing practices of business-to-business (B2B) technology content marketers in North America. Here you’ll see how technology marketers replied to our sixth annual content marketing survey, and how the results compare with the 2015 ndings.
A new question about content marketing maturity level revealed that 71% of technology marketers who say their organizations are e ective at content marketing are in the “sophisticated/mature” phase, indicating that success grows with experience.
Welcome to our yearly report on the content marketing practices of business-to-business (B2B) technology content marketers in North America. Here you’ll see how technology marketers replied to our sixth annual content marketing survey, and how the results compare with the 2015 ndings.
A new question about content marketing maturity level revealed that 71% of technology marketers who say their organizations are e ective at content marketing are in the “sophisticated/mature” phase, indicating that success grows with experience.
My presentation at MWLUG 2015. I show how to build and connect a modern looking website, built with HTML, CSS, and Javascript/jQuery, to your existing IBM Domino backend data using Ajax and JSON and some simple Lotusscript code.
Containerization helps us bundle dependencies with applications instead of having to use configuration management to prepare machines for running them, hence making build once run anywhere easy. For legacy applications this can be quite hard though when they spread persistent data across the file system.
In this talk I'll show how we can quickly set up a Go.CD server and agents for our Continuous Delivery pipelines on Google Cloud. The infrastructure creation is handled by Terraform, the server and agents are custom built Docker containers.
Node.js is an exciting new platform for building web applications in JavaScript. With its unique I/O model, it excels at the sort of scalable and real-time situations we are increasingly demanding of our servers. And the ability to use JavaScript for both the client and server opens up many possibilities for code sharing, expertise reuse, and rapid development.
This class is intended for those with some basic knowledge of JavaScript, interested in an introduction to the Node.js ecosystem and development platform. We'll discuss how to get started with Node, and why you would want to. We'll then explore Node's module and package system, demonstrating several of the more popular and impressive packages that exemplify the type of tasks Node excels at. These include low-level HTTP streaming with the http module, high-level bidirectional websocket communication with socket.io, and server-browser code sharing with browserify, jsdom, and node-canvas.
5 things cucumber is bad at by Richard LawrenceSkills Matter
This talk will look at 5 things Cucumber’s bad at, why that’s a good thing, and what it tells us about Cucumber’s sweet spot in a team’s toolkit.
Many times, when people complain about something Cucumber’s not good at, they’re unwittingly describing something Cucumber shouldn't be good at. They’re revealing that they don’t quite understand BDD and Cucumber’s role in it.
Cucumber is the world's most misunderstood collaboration tool and people need to hear this over and over again.
Patterns for slick database applicationsSkills Matter
Slick is Typesafe's open source database access library for Scala. It features a collection-style API, compact syntax, type-safe, compositional queries and explicit execution control. Community feedback helped us to identify common problems developers are facing when writing Slick applications. This talk suggests particular solutions to these problems. We will be looking at reducing boiler-plate, re-using code between queries, efficiently modeling object references and more.
My presentation at MWLUG 2015. I show how to build and connect a modern looking website, built with HTML, CSS, and Javascript/jQuery, to your existing IBM Domino backend data using Ajax and JSON and some simple Lotusscript code.
Containerization helps us bundle dependencies with applications instead of having to use configuration management to prepare machines for running them, hence making build once run anywhere easy. For legacy applications this can be quite hard though when they spread persistent data across the file system.
In this talk I'll show how we can quickly set up a Go.CD server and agents for our Continuous Delivery pipelines on Google Cloud. The infrastructure creation is handled by Terraform, the server and agents are custom built Docker containers.
Node.js is an exciting new platform for building web applications in JavaScript. With its unique I/O model, it excels at the sort of scalable and real-time situations we are increasingly demanding of our servers. And the ability to use JavaScript for both the client and server opens up many possibilities for code sharing, expertise reuse, and rapid development.
This class is intended for those with some basic knowledge of JavaScript, interested in an introduction to the Node.js ecosystem and development platform. We'll discuss how to get started with Node, and why you would want to. We'll then explore Node's module and package system, demonstrating several of the more popular and impressive packages that exemplify the type of tasks Node excels at. These include low-level HTTP streaming with the http module, high-level bidirectional websocket communication with socket.io, and server-browser code sharing with browserify, jsdom, and node-canvas.
5 things cucumber is bad at by Richard LawrenceSkills Matter
This talk will look at 5 things Cucumber’s bad at, why that’s a good thing, and what it tells us about Cucumber’s sweet spot in a team’s toolkit.
Many times, when people complain about something Cucumber’s not good at, they’re unwittingly describing something Cucumber shouldn't be good at. They’re revealing that they don’t quite understand BDD and Cucumber’s role in it.
Cucumber is the world's most misunderstood collaboration tool and people need to hear this over and over again.
Patterns for slick database applicationsSkills Matter
Slick is Typesafe's open source database access library for Scala. It features a collection-style API, compact syntax, type-safe, compositional queries and explicit execution control. Community feedback helped us to identify common problems developers are facing when writing Slick applications. This talk suggests particular solutions to these problems. We will be looking at reducing boiler-plate, re-using code between queries, efficiently modeling object references and more.
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmSkills Matter
Metascala is a tiny metacircular Java Virtual Machine (JVM) written in the Scala programming language. Metascala is barely 3000 lines of Scala, and is complete enough that it is able to interpret itself metacircularly. Being written in Scala and compiled to Java bytecode, the Metascala JVM requires a host JVM in order to run.
The goal of Metascala is to create a platform to experiment with the JVM: a 3000 line JVM written in Scala is probably much more approachable than the 1,000,000 lines of C/C++ which make up HotSpot, the standard implementation, and more amenable to implementing fun features like continuations, isolates or value classes. The 3000 lines of code gives you:
The bytecode interpreter, together with all the run-time data structures
A stack-machine to SSA register-machine bytecode translator
A custom heap, complete with a stop-the-world, copying garbage collector
Implementations of parts of the JVM's native interface
Although it is far from a complete implementation, Metascala already provides the ability to run untrusted bytecode securely (albeit slowly), since every operation which could potentially cause harm (including memory allocations and CPU usage) is virtualized and can be controlled. Ongoing work includes tightening of the security guarantees, improving compatibility and increasing performance.
ENJOYIN
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Skills Matter
Code Quotations: Code-as-Data for F#
This tutorial will cover F# Code Quotations in-depth. You'll learn what Code Quotations are, how to use them, and where to apply them in your applications. We'll work through several real-world examples to highlight the important features -- and potential pitfalls -- of Code Quotations.
Cukeup nyc ian dees on elixir, erlang, and cucumberlSkills Matter
Elixir, Erlang, and Cucumberl
Elixir is a new Ruby-inspired programming language that uses the powerful concurrent machinery of Erlang behind the scenes. Cucumberl is a port of Cucumber to Erlang. Let's see what happens when we put them together.
In this talk, we'll discuss:
How Erlang's concurrency makes it easier to write robust programs
Elixir's approachable syntax
How to test Erlang and Elixir programs using Cucumberl
Attendees will walk away with a solid introduction to the principles of Erlang, and an appreciation of the way Elixir brings the joy of Ruby to the solidity of the Erlang runtime.
Cukeup nyc peter bell on getting started with cucumber.jsSkills Matter
Cukeup NYC. Peter Bell on Getting started with cucumber.js
Ever wished you could use cucumber in your javascript apps? In this talk we'll look at the current state of play of cucumber js, when you should and shouldn't use it, and how to get started writing your step definitions in javascript.
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Skills Matter
In this engaging experience report, we will present 3 different views – Developer, Tester, Business Analyst – of implementing Acceptance Test Driven Development in a complex, data-driven domain. Hear how we used ATDD for building a ubiquitous language across the entire team, promoting faster feedback, and cultivating a culture where product owners were deeply invested in the quality of both every deliverable and the system as a whole.
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Skills Matter
In this tutorial, Phil and Rachel will introduce you to the Try F# samples giving you exposure to, and an understanding of, how F# tackles some real-world scenarios. We'll help you explore, generate, and just play around with code samples, as well as talk you through some of the key principles of F#. By the end of this session, you'll have gone from zero to data science in only a few hours!
Progressive f# tutorials nyc don syme on keynote f# in the open source worldSkills Matter
F# is a powerful open-source language which Microsoft, other companies and the F# community all contribute to. In this talk, Don will discuss how the “F# space” has recently opened up significantly in interesting ways. F# now includes contributions that range from Cloud IDE platforms, Cloud Compute frameworks, Data interoperability components, Cross-platform execution, Try F#, MonoDevelop, and even Emacs editor integration with surprising tooling support, as well as the Visual F# tools from Microsoft and the broader NuGet package ecosystem. Don will also talk about some of the latest contributions from Microsoft Research, including new type provider components for F#, and describe how his team work with the Visual F# team and other teams around Microsoft. There will also be demos of some fun new stuff that’s been going on with F# at MSR and the community.
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Skills Matter
Would you like to learn how to make your software testing practices more effective? And how to use your testing strategy to better capture and reflect customer requirements? Gojko Adzic takes a critical look at the effectiveness of current software testing practices and proposes strategies to make it much more effective.
Dmitry mozorov on code quotations code as-data for f#Skills Matter
Code Quotations: Code-as-Data for F#
This tutorial will cover F# Code Quotations in-depth. You'll learn what Code Quotations are, how to use them, and where to apply them in your applications. We'll work through several real-world examples to highlight the important features -- and potential pitfalls -- of Code Quotations.
Simon Peyton Jones: Managing parallelismSkills Matter
If you want to program a parallel computer, it obviously makes sense to start with a computational paradigm in which parallelism is the default (ie functional programming), rather than one in which computation is based on sequential flow of control (the imperative paradigm). And yet, and yet ... functional programmers have been singing this tune since the 1980s, but do not yet rule the world. In this talk I’ll say why I think parallelism is too complex a beast to be slain at one blow, and how we are going to be driven, willy-nilly, towards a world in which side effects are much more tightly controlled than now. I’ll sketch a whole range of ways of writing parallel program in a functional paradigm (implicit parallelism, transactional memory, data parallelism, DSLs for GPUs, distributed processes, etc, etc), illustrating with examples from the rapidly moving Haskell community, and identifying some of the challenges we need to tackle.
Connector Corner: Automate dynamic content and events by pushing a buttonDianaGray10
Here is something new! In our next Connector Corner webinar, we will demonstrate how you can use a single workflow to:
Create a campaign using Mailchimp with merge tags/fields
Send an interactive Slack channel message (using buttons)
Have the message received by managers and peers along with a test email for review
But there’s more:
In a second workflow supporting the same use case, you’ll see:
Your campaign sent to target colleagues for approval
If the “Approve” button is clicked, a Jira/Zendesk ticket is created for the marketing design team
But—if the “Reject” button is pushed, colleagues will be alerted via Slack message
Join us to learn more about this new, human-in-the-loop capability, brought to you by Integration Service connectors.
And...
Speakers:
Akshay Agnihotri, Product Manager
Charlie Greenberg, Host
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Essentials of Automations: Optimizing FME Workflows with ParametersSafe Software
Are you looking to streamline your workflows and boost your projects’ efficiency? Do you find yourself searching for ways to add flexibility and control over your FME workflows? If so, you’re in the right place.
Join us for an insightful dive into the world of FME parameters, a critical element in optimizing workflow efficiency. This webinar marks the beginning of our three-part “Essentials of Automation” series. This first webinar is designed to equip you with the knowledge and skills to utilize parameters effectively: enhancing the flexibility, maintainability, and user control of your FME projects.
Here’s what you’ll gain:
- Essentials of FME Parameters: Understand the pivotal role of parameters, including Reader/Writer, Transformer, User, and FME Flow categories. Discover how they are the key to unlocking automation and optimization within your workflows.
- Practical Applications in FME Form: Delve into key user parameter types including choice, connections, and file URLs. Allow users to control how a workflow runs, making your workflows more reusable. Learn to import values and deliver the best user experience for your workflows while enhancing accuracy.
- Optimization Strategies in FME Flow: Explore the creation and strategic deployment of parameters in FME Flow, including the use of deployment and geometry parameters, to maximize workflow efficiency.
- Pro Tips for Success: Gain insights on parameterizing connections and leveraging new features like Conditional Visibility for clarity and simplicity.
We’ll wrap up with a glimpse into future webinars, followed by a Q&A session to address your specific questions surrounding this topic.
Don’t miss this opportunity to elevate your FME expertise and drive your projects to new heights of efficiency.
State of ICS and IoT Cyber Threat Landscape Report 2024 previewPrayukth K V
The IoT and OT threat landscape report has been prepared by the Threat Research Team at Sectrio using data from Sectrio, cyber threat intelligence farming facilities spread across over 85 cities around the world. In addition, Sectrio also runs AI-based advanced threat and payload engagement facilities that serve as sinks to attract and engage sophisticated threat actors, and newer malware including new variants and latent threats that are at an earlier stage of development.
The latest edition of the OT/ICS and IoT security Threat Landscape Report 2024 also covers:
State of global ICS asset and network exposure
Sectoral targets and attacks as well as the cost of ransom
Global APT activity, AI usage, actor and tactic profiles, and implications
Rise in volumes of AI-powered cyberattacks
Major cyber events in 2024
Malware and malicious payload trends
Cyberattack types and targets
Vulnerability exploit attempts on CVEs
Attacks on counties – USA
Expansion of bot farms – how, where, and why
In-depth analysis of the cyber threat landscape across North America, South America, Europe, APAC, and the Middle East
Why are attacks on smart factories rising?
Cyber risk predictions
Axis of attacks – Europe
Systemic attacks in the Middle East
Download the full report from here:
https://sectrio.com/resources/ot-threat-landscape-reports/sectrio-releases-ot-ics-and-iot-security-threat-landscape-report-2024/
PHP Frameworks: I want to break free (IPC Berlin 2024)Ralf Eggert
In this presentation, we examine the challenges and limitations of relying too heavily on PHP frameworks in web development. We discuss the history of PHP and its frameworks to understand how this dependence has evolved. The focus will be on providing concrete tips and strategies to reduce reliance on these frameworks, based on real-world examples and practical considerations. The goal is to equip developers with the skills and knowledge to create more flexible and future-proof web applications. We'll explore the importance of maintaining autonomy in a rapidly changing tech landscape and how to make informed decisions in PHP development.
This talk is aimed at encouraging a more independent approach to using PHP frameworks, moving towards a more flexible and future-proof approach to PHP development.
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...James Anderson
Effective Application Security in Software Delivery lifecycle using Deployment Firewall and DBOM
The modern software delivery process (or the CI/CD process) includes many tools, distributed teams, open-source code, and cloud platforms. Constant focus on speed to release software to market, along with the traditional slow and manual security checks has caused gaps in continuous security as an important piece in the software supply chain. Today organizations feel more susceptible to external and internal cyber threats due to the vast attack surface in their applications supply chain and the lack of end-to-end governance and risk management.
The software team must secure its software delivery process to avoid vulnerability and security breaches. This needs to be achieved with existing tool chains and without extensive rework of the delivery processes. This talk will present strategies and techniques for providing visibility into the true risk of the existing vulnerabilities, preventing the introduction of security issues in the software, resolving vulnerabilities in production environments quickly, and capturing the deployment bill of materials (DBOM).
Speakers:
Bob Boule
Robert Boule is a technology enthusiast with PASSION for technology and making things work along with a knack for helping others understand how things work. He comes with around 20 years of solution engineering experience in application security, software continuous delivery, and SaaS platforms. He is known for his dynamic presentations in CI/CD and application security integrated in software delivery lifecycle.
Gopinath Rebala
Gopinath Rebala is the CTO of OpsMx, where he has overall responsibility for the machine learning and data processing architectures for Secure Software Delivery. Gopi also has a strong connection with our customers, leading design and architecture for strategic implementations. Gopi is a frequent speaker and well-known leader in continuous delivery and integrating security into software delivery.
Neuro-symbolic is not enough, we need neuro-*semantic*Frank van Harmelen
Neuro-symbolic (NeSy) AI is on the rise. However, simply machine learning on just any symbolic structure is not sufficient to really harvest the gains of NeSy. These will only be gained when the symbolic structures have an actual semantics. I give an operational definition of semantics as “predictable inference”.
All of this illustrated with link prediction over knowledge graphs, but the argument is general.
GraphRAG is All You need? LLM & Knowledge GraphGuy Korland
Guy Korland, CEO and Co-founder of FalkorDB, will review two articles on the integration of language models with knowledge graphs.
1. Unifying Large Language Models and Knowledge Graphs: A Roadmap.
https://arxiv.org/abs/2306.08302
2. Microsoft Research's GraphRAG paper and a review paper on various uses of knowledge graphs:
https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
In this insightful webinar, Inflectra explores how artificial intelligence (AI) is transforming software development and testing. Discover how AI-powered tools are revolutionizing every stage of the software development lifecycle (SDLC), from design and prototyping to testing, deployment, and monitoring.
Learn about:
• The Future of Testing: How AI is shifting testing towards verification, analysis, and higher-level skills, while reducing repetitive tasks.
• Test Automation: How AI-powered test case generation, optimization, and self-healing tests are making testing more efficient and effective.
• Visual Testing: Explore the emerging capabilities of AI in visual testing and how it's set to revolutionize UI verification.
• Inflectra's AI Solutions: See demonstrations of Inflectra's cutting-edge AI tools like the ChatGPT plugin and Azure Open AI platform, designed to streamline your testing process.
Whether you're a developer, tester, or QA professional, this webinar will give you valuable insights into how AI is shaping the future of software delivery.
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...DanBrown980551
Do you want to learn how to model and simulate an electrical network from scratch in under an hour?
Then welcome to this PowSyBl workshop, hosted by Rte, the French Transmission System Operator (TSO)!
During the webinar, you will discover the PowSyBl ecosystem as well as handle and study an electrical network through an interactive Python notebook.
PowSyBl is an open source project hosted by LF Energy, which offers a comprehensive set of features for electrical grid modelling and simulation. Among other advanced features, PowSyBl provides:
- A fully editable and extendable library for grid component modelling;
- Visualization tools to display your network;
- Grid simulation tools, such as power flows, security analyses (with or without remedial actions) and sensitivity analyses;
The framework is mostly written in Java, with a Python binding so that Python developers can access PowSyBl functionalities as well.
What you will learn during the webinar:
- For beginners: discover PowSyBl's functionalities through a quick general presentation and the notebook, without needing any expert coding skills;
- For advanced developers: master the skills to efficiently apply PowSyBl functionalities to your real-world scenarios.
7. The
goal…
Find
and
Defeat
E0920ba0'df0e-42a1-b304-a312c834fd62
tyrannical
Lich-‐Uuid
the
8. The
plan…
until
goal
achieved
while
healthy
fight
|
flee
|
without
retracing
steps
|
north
|
east
|
west
|
south
|
investigate
|
retrace
steps
9. Once
upon
a
time…
POST /quests
Host: dms
Content-Type: application/prs.dms+xml
Content-Length: ...
<difficulty>intermediate</difficulty>
HTTP/1.1 201 Created
Content-Type: application/prs.dms+xml
Location: http://dms/quests/1/locations/1
Content-Length: ...
<location>
<title>Entrance</title>
<summary>
Your adventure begins as you descend a rope into a rubble-strewn hall.
The air is cold and dank.
</summary>
<dimensions>
<north-south>20</north-south>
<east-west>20</east-west>
</dimensions>
<link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
<link rel="http://dms/east" type="application/prs.dms+xml" href="/quests/1/locations/3"/>
<link rel="http://dms/west" type="application/prs.dms+xml" href="/quests/1/locations/4"/>
</location>
10. Heading
north…
GET /quests/1/locations/2 HTTP/1.1
Host: dms
HTTP/1.1 303 See Other
Content-Type: application/prs.dms+xml
Location: http://dms/quests/1/encounters/1
Content-Length: ...
<link rel="related" type="application/prs.dms+xml" href="/quests/1/encounters/1"/>
11. When
frameworks
go
bad…
GET /quests/1/encounters/1 HTTP/1.1
Host: dms
HTTP/1.1 200 OK
Content-Type: application/prs.dms+xml
Content-Length: ...
<encounter>
<title>Skeleton!</title>
<summary>
From out of the shadows lurches a skeleton brandishing a scimitar.
</summary>
<model>
<instance rel="http://dms/attack">
<intention>
<attack>
<weapon/>
<strategy/>
</attack>
</intention>
</instance>
<submission resource="/quests/1/encounters/1/fight" method="POST" mediatype="application/prs.dms+xml"/>
</model>
<model>
<instance rel="http://dms/flee">
<intention>
<flee/>
</intention>
</instance>
<submission resource="/quests/1/encounters/1/flight" method="POST" mediatype="application/prs.dms+xml"/>
</model>
</encounter>
12. Hacker…
POST /quests/1/encounters/1/fight HTTP/1.1
Host: dms
Content-Type: application/prs.dms+xml
Content-Length: ...
<intention>
<attack>
<weapon>sword</weapon>
<strategy>slash</strategy>
</attack>
</intention>
HTTP/1.1 201 Created
Content-Type: application/prs.dms+xml
Location: http://dms/quests/1/encounters/1/outcomes/1
Content-Length: ...
<outcome>
<title>Success</title>
<summary>
The skeleton shatters and its scimitar clatters to the ground.
Searching the fragments, you find a silver key.
</summary>
<items>
<link type="application/prd.dms+xml" href="/quests/1/objects/1">silver key</link>
</items>
<link rel="next" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
</outcome>
13. Stone
door
GET /quests/1/locations/2 HTTP/1.1
Host: dms
HTTP/1.1 200 OK
Content-Type: application/prs.dms+xml
ETag: "FEC6956217C1"
Content-Length: ...
<location>
<title>Stone door</title>
<summary>
The hall narrows, and you follow a low passage to a stone door with a deeply recessed keyhole.
</summary>
<dimensions>
<north-south>15</north-south>
<east-west>5</east-west>
</dimensions>
<link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
<model>
<instance rel="http://dms/action">
<intention>
<unlock>
<key/>
</unlock>
</intention>
</instance>
<submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
</model>
</location>
14. But
we’ve
got
a
key…
POST /quests/1/locations/2 HTTP/1.1
Host: dms
If-Match: "FEC6956217C1"
Content-Type: application/prs.dms+xml
Content-Length: ...
<intention>
<unlock>
<key>http://dms/quests/1/objects/1</key>
</unlock>
</intention>
HTTP/1.1 412 Precondition Failed
15. What’s
going
on?
GET /quests/1/locations/2 HTTP/1.1
Host: dms
If-None-Match: "FEC6956217C1"
HTTP/1.1 200 OK
Content-Type: application/prs.dms+xml
ETag: "6809E4D87D43"
Content-Length: ...
<location>
<title>Stone door</title>
<summary>
You're standing in front of a stone door with a deeply recessed keyhole.
Electricity crackles around the keyhole.
</summary>
<dimensions>
<north-south>15</north-south>
<east-west>5</east-west>
</dimensions>
<link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
<model>
<instance rel="http://dms/action">
<intention>
<unlock>
<key/>
</unlock>
</intention>
</instance>
<submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
</model>
</location>
16. Wait…
GET /quests/1/locations/2 HTTP/1.1
Host: dms
If-None-Match: "6809E4D87D43"
HTTP/1.1 304 Not Modified
17. Wait…
GET /quests/1/locations/2 HTTP/1.1
Host: dms
If-None-Match: "6809E4D87D43"
HTTP/1.1 200 OK
Content-Type: application/prs.dms+xml
ETag: "871CDA1C9935"
Content-Length: ...
<location>
<title>Stone door</title>
<summary>
You're standing in front of a stone door with a deeply recessed keyhole.
</summary>
<dimensions>
<north-south>15</north-south>
<east-west>5</east-west>
</dimensions>
<link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
<model>
<instance rel="http://dms/action">
<intention>
<unlock>
<key/>
</unlock>
</intention>
</instance>
<submission resource="/quests/1/locations/2" method="POST" mediatype="application/prs.dms+xml"/>
</model>
</location>
18. Now!
POST /quests/1/locations/2 HTTP/1.1
Host: dms
If-Match: "871CDA1C9935"
Content-Type: application/prs.dms+xml
Content-Length: ...
<intention>
<unlock>
<key>http://dms/quests/1/objects/1</key>
</unlock>
</intention>
HTTP/1.1 201 Created
Content-Type: application/prs.dms+xml
Location: http://dms/quests/1/locations/2/outcomes/1
Content-Length: ...
<outcome>
<title>Success</title>
<summary>
The key turns in the lock and the door grinds open.
Beyond, a flight of steep steps lead down into the darkness.
A blast of warm, fetid air issues from below, followed by an inhuman shriek.
</summary>
<link rel="related" type="application/prs.dms+xml" href="/quests/1/locations/2"/>
<link rel="http://dms/north" type="application/prs.dms+xml" href="/quests/1/locations/5"/>
<link rel="http://dms/south" type="application/prs.dms+xml" href="/quests/1/locations/1"/>
</outcome>
19. Leonard
Richardson's
Web
service
maturity
heuristic
What?
Why?
How?
Spreads
complexity
URIs
Divide
and
conquer
around
Refactor
(Do
the
same
things
Reduces
complexity
HTTP
in
the
same
way)
Describe
special
Makes
complexity
Hypermedia
behaviour
in
a
learnable
standard
way
http://www.crummy.com/writing/
20. HATEOAS
–
the
riddle
of
the
Sphinx
Hypermedia
as
the
Engine
of
Application
State
21. Some
definitions…
Application
protocol
Application
state
Photo
taken
from
Twissie’s
Flickr
stream
under
the
Creative
Commons
licence
22. Application
protocol
state
machine
GET
POST
exploring confronting
entrance skeleton
POST
GET
investigating triumphant
door
POST
standing at
top of steps
23. Reality
intermission
request quote
quote
requested
place order
goods
ordered cancel order
fulfill order
order order
completed cancelled
24. Hypermedia
systems
transform
application
state
<encounter>
<title>Skeleton!</title>
<summary>
From out of the shadows lurches a skeleton brandishing a scimitar.
</summary>
<model>
<instance rel="http://dms/attack">
<intention>
<attack>
<outcome> <weapon/>
<title>Success</title>
<strategy/>
<summary> </attack>
The skeleton shatters and its scimitar clatters to the ground.
</intention>
Searching the fragments, you find a silver key.
</instance>
</summary>
<submission resource="/quests/1/encounters/1"
<items> method="POST" mediatype="application/prs.dms+xml"/>
<link type="application/prd.dms+xml"
</model>
href="/quests/1/objects/1">silver key</a:link>
<model>
</items>
<instance rel="http://dms/flee">
<link rel="next" type="application/prs.dms+xml"
<intention>
href="/quests/1/locations/2"/>
<flee/>
</outcome></intention>
</instance>
<submission resource="/quests/1/encounters/1"
method="POST" mediatype="application/prs.dms+xml"/>
</model>
</encounter>
POST /quests/1/encounters/1 HTTP/1.1
GET /quests/1/encounters/1 HTTP/1.1
<intention>
<attack>
<weapon>sword</weapon>
<strategy>slash</strategy>
</attack>
</intention>
25. Anatomy
of
a
hypermedia
control
<link
rel="http://dms/north"
type="application/prs.dms+xml"
href="/quests/1/locations/2"
/>
Semantic
context
WHY
access
the
linked
resource?
Interpretation
WHAT
form
does
the
linked
resource
take?
Address
WHERE
does
the
linked
resource
reside?
26. Media
type
is
a
key
into
an
interpretative
scheme
Schemas
Hypermedia
controls
Processing
model
Link
relations
27. Archaeology
of
an
application
protocol
Why?
How?
What?
Link
relations
HTTP
idioms
Media
types
28. Manipulate
resources
using
HTTP
idioms
<submission resource="/quests/1/locations/2"
method="POST" mediatype="application/prs.dms+xml"/>
OPTIONS /quests/1/locations/2 HTTP/1.1
Host: dms
HTTP/1.1 200 OK
Allow: GET, POST
HTTP/1.1 200 OK
Content-Type: application/prs.dms+xml
ETag: "871CDA1C9935"
Content-Length: ...
HTTP/1.1 303 See Other
Content-Type: application/prs.dms+xml
Location: http://dms/quests/1/encounters/1
Content-Length: ...
29. Down
in
the
dungeons…
http://dms/quests/1/locations/2
http://dms/quests/1/encounters/1
http://dms/quests/1/encounters/1/outcomes/1
guarded by involves
Location Skeleton
Encounter
dead-
guarded unguarded undead
dead
unresolved resolving resolved
resolved by
modifies
affects
Outcome Intention
determined determines declared
31. Equipping
the
client
Capability
Description
HTTP
client
Implement
HTTP
idioms
(eg.
conditional
GET).
Parse/
assemble
hypermedia
representations;
Media
type
handlers
surface
hypermedia
controls.
Evaluate
semantic
Understand
semantic
context
for
controls
in
context
relation
to
client
goal.
Choose
and
activate
Decide
on
next
transition
based
on
goal,
control
application
state
and
available
transitions.
Cache
Client-‐side
caching,
including
revalidation
32. Hypermedia
and
Systems
Architecture
How
to
GET
a
Cup
of
Coffee
http://www.infoq.com/articles/webber-‐rest-‐workflow
Jim
Webber
Savas
Parastatidis
Ian
Robinson
Photos
taken
from
ElDave’s
Flickr
stream
under
the
Creative
Commons
licence