<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3825159152896936294</id><updated>2024-12-19T03:28:06.032+00:00</updated><category term="SOA"/><category term="API"/><category term="Web service"/><category term="Service"/><category term="Service Oriented Architecture"/><category term="REST"/><category term="ESB"/><category term="security"/><category term="JBoss"/><category term="management"/><category term="Java"/><category term="Weblogic"/><category term="XML"/><category term="Enterprise Service Bus"/><category term="Spring"/><category term="reuse"/><category term="web services"/><category term="Governance"/><category term="JEE"/><category term="Migration"/><category term="Oracle"/><category term="SaaS"/><category term="oauth"/><category term="services"/><category term="ITIL"/><category term="Registry"/><category term="SOAP"/><category term="WSDL"/><category term="agile"/><category term="business process modeling"/><category term="enterprise"/><category term="interface"/><category term="process"/><category term="software development"/><category term="ASP"/><category term="Application Server"/><category term="Cloud"/><category term="Consumer"/><category term="DBMS"/><category term="EJB"/><category term="IG Group"/><category term="JABOWS"/><category term="RESTdoclet"/><category term="Repository"/><category term="SLA"/><category term="Serivice Oriented Architecture"/><category term="WS02"/><category term="Websphere"/><category term="XSLT"/><category term="database"/><category term="deployment descriptor"/><category term="documentation"/><category term="enterprise architecture"/><category term="error"/><category term="framework"/><category term="http"/><category term="message"/><category term="mule"/><category term="openam"/><category term="organisation"/><category term="owasp"/><category term="software"/><category term=".NET"/><category term="ACEGI"/><category term="AOP"/><category term="Appliance"/><category term="Axis"/><category term="BPEL"/><category term="BPM"/><category term="BPMN"/><category term="Canonical Data Model"/><category term="Capacity Planning"/><category term="Change"/><category term="Charging Models"/><category term="Choreography"/><category term="Decoupled"/><category term="EAI"/><category term="Finance"/><category term="Googlem REST"/><category term="Hibernate"/><category term="IG index"/><category term="IG markets"/><category term="J2EE"/><category term="JSON"/><category term="OLA"/><category term="Orchestration"/><category term="PKI"/><category term="Producer"/><category term="Public"/><category term="RAC"/><category term="ROI"/><category term="RPC"/><category term="Red Hat"/><category term="Review JEE"/><category term="SAML"/><category term="SOA World"/><category term="SQL"/><category term="Schema"/><category term="Server"/><category term="TOGAF"/><category term="Technology"/><category term="Tomcat"/><category term="Trading"/><category term="URI"/><category term="URL"/><category term="Virtualisation"/><category term="WS-Policy"/><category term="XDoclet"/><category term="abstraction"/><category term="amazon"/><category term="ant"/><category term="apache"/><category term="apigee"/><category term="application"/><category term="architecture"/><category term="article"/><category term="authentication"/><category term="authorisation"/><category term="automation"/><category term="bla"/><category term="business benefits"/><category term="business process management"/><category term="buzzwords"/><category term="characteristics"/><category term="code"/><category term="competitive"/><category term="contract"/><category term="design"/><category term="development"/><category term="distributed"/><category term="document"/><category term="eda"/><category term="error handling"/><category term="event"/><category term="funny"/><category term="generate"/><category term="generating"/><category term="guideline"/><category term="guidelines"/><category term="handling"/><category term="humor"/><category term="iBatis"/><category term="ibm"/><category term="implementation"/><category term="jamon"/><category term="java web service"/><category term="joke"/><category term="jokes"/><category term="layer 7"/><category term="leadership"/><category term="loosely coupled"/><category term="methodology"/><category term="microservices"/><category term="monitoring"/><category term="naming"/><category term="opensource"/><category term="operations"/><category term="organization"/><category term="paas"/><category term="policy"/><category term="portfolio management"/><category term="product"/><category term="programming"/><category term="progress"/><category term="project management"/><category term="redhat"/><category term="response"/><category term="reusability"/><category term="risk"/><category term="salesforce"/><category term="sample"/><category term="sca"/><category term="service-oriented architecture"/><category term="state"/><category term="structure"/><category term="team"/><category term="testing"/><category term="tibco"/><category term="versioning"/><category term="video"/><category term="web"/><category term="web 2.0"/><category term="wife"/><category term="ws-security"/><category term="wso2"/><title type='text'>SOA Probe</title><subtitle type='html'>Reflections on Service-oriented Architecture</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://soaprobe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-6196821685499963720</id><published>2017-05-08T16:04:00.000+01:00</published><updated>2017-05-08T16:04:36.542+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="guidelines"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="Web service"/><title type='text'>REST Web Service API Guidelines</title><content type='html'>When building web services, one of the primary benefits of using REST over SOAP is the intuitive nature of service interfaces. &amp;nbsp;However, this simplicity of interface can very easily be eroded. &amp;nbsp;Below are some suggested (and hence flame proof) guidelines that could be followed to ensure continued interface simplicity:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Resource-Oriented&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;REST is resource-oriented, not service-oriented. &amp;nbsp;Resources are nouns, not verbs.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Addressable&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Every resource must be addressable by means of at least one URI (name). &amp;nbsp;Names must be meaningful.&lt;/li&gt;
&lt;li&gt;Clients cannot access resources directly - they deal in representations of that resource (e.g, XML, JSON, ...) &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Resource representations would ideally be addressable (so that they can be passed around as URIs, eg. /rest/bookmarks.xml) &amp;nbsp;The use of HTTP accept headers to specify representation is however acceptable, but should be provided as well as the addressable URI.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;b&gt;Stateless&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Resource state must not be confused with application (client state). &amp;nbsp;Resource state should remain on the server, while application state should remain on the client.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Connected&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Resources should refer to other resources by means of their URIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Uniform Interface&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;All interaction between clients and resources should be via the basic HTTP methods, preserving the semantics of those methods.&lt;/li&gt;
&lt;li&gt;GET: a request for information about a resource, delivered as a set of headers and a representation&lt;/li&gt;
&lt;li&gt;HEAD: like a GET, but only headers are required in response&lt;/li&gt;
&lt;li&gt;PUT: an assertion about the state of a resource, usually with a representation which the server will use to create or change the resource. &amp;nbsp;PUT without any representation is an assertion that the resource should exist at that URI&lt;/li&gt;
&lt;li&gt;DELETE: an assertion that a resource should no longer exist, and should not include a representation&lt;/li&gt;
&lt;li&gt;POST: is an attempt to create a new resource from an existing one, the existing resource being a parent of the new one (in a data structure sense), or a factory resource whose purpose is to generate other resources. &amp;nbsp;May also be used to append to the state of any existing resource.&lt;/li&gt;
&lt;li&gt;OPTIONS: rarely used, but is an attempt to discover which subset of the universe a resource supports.&lt;/li&gt;
&lt;li&gt;Consistent use of HTTP status codes (more on this in a future post)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Safety and Idempotence&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;GET and HEAD requests must be safe, i.e. make no change to the server state, and should not have any material side effects.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;PUT and DELETE requests must be idempotent, i.e. repeatable&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Multiple Representations&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The address of a resource can return several representations of the resource. The client tells the service which types of representations it can understand and the priority order in which it would like to receive them.&lt;/li&gt;
&lt;li&gt;All response content should be in JSON or XML according to HTTP Accept header, or failing that, request parameter format=xxxx. &amp;nbsp;Default response format in the absence of a requested format should be JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6196821685499963720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6196821685499963720'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/10/soa-rest-service-key-guidelines.html' title='REST Web Service API Guidelines'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-6313452099030191342</id><published>2017-05-07T21:56:00.001+01:00</published><updated>2017-05-07T22:02:15.648+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="software development"/><title type='text'>The Importance Of Simplicity</title><content type='html'>I remember way back when, a number of colleagues engrossed in the latest Obfuscated C++ challenge, an exercise in making code so concise, so cryptic, that even the hardened coder paled.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This always struck me as an odd thing to want to do. &amp;nbsp;Why make things more complicated than they have to be? &amp;nbsp;Are code simplicity and readability not the important thing? &amp;nbsp;After all, software only spends a small fraction of its life being created. &amp;nbsp;The rest of the time it is being maintained, and usually by different people who are not going to appreciate your obscure brilliance.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Keep it simple, smart-arse.&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6313452099030191342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6313452099030191342'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/the-importance-of-simplicity.html' title='The Importance Of Simplicity'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-5459908236271277407</id><published>2017-05-07T12:31:00.003+01:00</published><updated>2017-05-07T16:06:04.125+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="software development"/><title type='text'>Generalising Specialists</title><content type='html'>There is this rumour going around that good architects need to write (production) code. &amp;nbsp;I think the term was coined by &lt;a href=&quot;http://scottwambler/&quot; target=&quot;_blank&quot;&gt;Scott Ambler&lt;/a&gt;&amp;nbsp;of &lt;a href=&quot;http://agilemodeling.com/&quot;&gt;agilemodeling.com&lt;/a&gt;, or was it&amp;nbsp;&lt;a href=&quot;https://www.thoughtworks.com/&quot; target=&quot;_blank&quot;&gt;ThoughtWorks&lt;/a&gt;? &amp;nbsp;Anyway,&amp;nbsp;I don&#39;t care, because I disagree, quite a lot.&lt;br /&gt;
&lt;br /&gt;
See, I did write code, a lot of it. &amp;nbsp;I was good at it, and I still like to write code for my own pleasure, but my current, full-time role as an enterprise architect does not involve much coding. &amp;nbsp;As a result, I have become slightly detached from the way code is written in our company (tools, processes, etc.) and when I do, it is laborious and frustrating. In fact, I would respectfully suggest that letting me near production code might: a) not be the best use of my time, b) be dangerous.&lt;br /&gt;
&lt;br /&gt;
It&#39;s not because I&#39;m older, or wiser, or slower, or too important to code. &amp;nbsp;It&#39;s because I spend my time thinking about different abstractions: higher-level ones. The principles are the same, but the moving parts are larger.&lt;br /&gt;
&lt;br /&gt;
See, I write enterprise code.&lt;br /&gt;
&lt;br /&gt;
My IDE is Powerpoint ... or Word, if I&#39;m feeling dangerous.&lt;br /&gt;
&lt;br /&gt;
I am like the town planner. &amp;nbsp;Sure, I could have a go at building a house, but would you really want to live in it? &lt;br /&gt;
&lt;br /&gt;
I know I wouldn&#39;t.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5459908236271277407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5459908236271277407'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/generalising-specialists.html' title='Generalising Specialists'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-2298345707789334110</id><published>2017-05-07T12:19:00.002+01:00</published><updated>2017-05-07T12:21:13.700+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="portfolio management"/><category scheme="http://www.blogger.com/atom/ns#" term="process"/><category scheme="http://www.blogger.com/atom/ns#" term="project management"/><category scheme="http://www.blogger.com/atom/ns#" term="software development"/><title type='text'>Black Ops Projects</title><content type='html'>I think good project portfolio management is an essential discipline for software development.&lt;br /&gt;
&lt;br /&gt;
You have to know what you want to do, why you want to do it (in terms of measurable benefits), how much it is likely to cost, know who will do it, know when it will be done, how much it ended up costing, and how much benefit actually was realised.&lt;br /&gt;
&lt;br /&gt;
Then you have a defined pipeline of work, and software developers wake up in the morning knowing what they are supposed to be doing.&lt;br /&gt;
&lt;br /&gt;
Enter the villain.&lt;br /&gt;
&lt;br /&gt;
Our villain has a vague, but very senior role. &amp;nbsp;He is responsible for improving something or the other, and is brimming with vision, personality and the gift of the gab. &amp;nbsp;He has no time for pipelines. &amp;nbsp;His ideas are hot, relevant and need to be done now! &amp;nbsp;(Before he forgets them or moves on to the next grand scheme)&lt;br /&gt;
&lt;br /&gt;
Our villain likes to pick on vulnerable teams, all smiles, and uses his charm and lofty position to lure or bully them into his cause. &amp;nbsp;He gets things done. Under the radar. &lt;br /&gt;
&lt;br /&gt;
He is dangerous.&lt;br /&gt;
&lt;br /&gt;
He needs to be taken out.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2298345707789334110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2298345707789334110'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/black-ops-projects.html' title='Black Ops Projects'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1479829280878353365</id><published>2017-05-07T11:53:00.001+01:00</published><updated>2017-05-07T13:08:54.059+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="leadership"/><category scheme="http://www.blogger.com/atom/ns#" term="process"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><title type='text'>Illusory Comforts</title><content type='html'>I like process. &lt;br /&gt;
&lt;br /&gt;
I appreciate that this is probably because it&#39;s in my nature to like order and predictability, but good process adds value, can often be automated, and frees up developers to do what they do best: create excellent software.&lt;br /&gt;
&lt;br /&gt;
Bad process on the other hand is a killer.&lt;br /&gt;
&lt;br /&gt;
It&#39;s a killer because it slows everything down.&lt;br /&gt;
&lt;br /&gt;
It&#39;s a killer because it doesn&#39;t work, and is often bureaucratic.&lt;br /&gt;
&lt;br /&gt;
But mostly it&#39;s a killer because it gives those in charge the illusion of progress.&lt;br /&gt;
&lt;br /&gt;
I worked with a place once that outsourced their software development capability to an outfit that had CMM level 5 accreditation, and could prove it ... but developed the worst software I had ever encountered. &amp;nbsp;Yet senior management were blissfully unaware of the fact, or perhaps they were and didn&#39;t care. &amp;nbsp;They had achieved their outsourcing objectives, reduced resource costs, and achieved CMM level 5 in the process! &amp;nbsp;I bet bonuses were good that year.&lt;br /&gt;
&lt;br /&gt;
A bad leader does not trust his team to do their job. &amp;nbsp;He tries to measure them, to enforce success via metrics and bad process. &amp;nbsp;It offers him an illusory comfort of progress to see the hours worked and lines of code per day metric increasing, but damn those inconvenient holidays!&lt;br /&gt;
&lt;br /&gt;
A good leader understands that his team consists of people, not resources. Humans who need autonomy, mastery and purpose. Motivated individuals who will take pride in their work, and do their best to get the job done well.&lt;br /&gt;
&lt;br /&gt;
And that&#39;s all you can ask of them, really.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1479829280878353365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1479829280878353365'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/illusory-comforts.html' title='Illusory Comforts'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-5538004913618063056</id><published>2017-05-06T12:09:00.000+01:00</published><updated>2017-05-06T16:26:33.400+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="owasp"/><category scheme="http://www.blogger.com/atom/ns#" term="risk"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Correctly Assessing Security Risk</title><content type='html'>I found a security issue some time back, the logging of a long-lived security session token. &amp;nbsp;This token enabled me to access an internal client data service which only checked the validity of the token, not its right to perform the operation on the data I was accessing. &amp;nbsp;We had two types of tokens, managed by the same session token management service, one for clients (the type of token I had found in the logs), and one for trusted internal service accounts. &amp;nbsp;The client service did not care about the difference, and as a consequence I was able to access all client data with my token.&lt;br /&gt;
&lt;br /&gt;
I raised a critical incident, but surprisingly, nobody raised an eyebrow, not even InfoSec. &amp;nbsp;In fact, I was asked why I (little old me) was raising a critical incident. &amp;nbsp;After all, was there a crisis? &amp;nbsp;The incident was closed immediately and I had to instead raise a work item against the relevant team, who only fixed it some weeks later - there were more pressing delivery deadlines to consider.&lt;br /&gt;
&lt;br /&gt;
Then, a week later, I found that some system was logging client passwords when they were changed. This was clearly a critical incident, but I thought twice about raising it. &amp;nbsp;But I did, and boy did that stir the pond! &amp;nbsp;InfoSec were all over it, sending out a flurry of messages to senior management, and the issue was fixed that day.&lt;br /&gt;
&lt;br /&gt;
Yet both incidents were critical. &amp;nbsp;Had I not used my trusty &lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Risk_Rating_Methodology&quot; target=&quot;_blank&quot;&gt;OWASP risk rating methodology&lt;/a&gt; spreadsheet to come up with an objective risk assessment for both? &amp;nbsp;You see, the ability to leak all our customer data is just bad as the ability to log in to a few accounts and cause mayhem. &amp;nbsp;We had strict money laundering controls, so financial theft was not the main threat, brand reputation damage was.&lt;br /&gt;
&lt;br /&gt;
So what the hell was going on?&lt;br /&gt;
&lt;br /&gt;
I think the issue is that of understanding security risk. &amp;nbsp;Most people can relate to a password breach, but the other breach was too technical for the average punter. &amp;nbsp;And there was the rub.&lt;br /&gt;
&lt;br /&gt;
I think the answer to this is to establish rules like: if the risk rating is determined objectively to be critical, then it is critical, not: do I think it is critical? &amp;nbsp;Granted, some of the inputs into the OWASP risk rating model are subjective, but they are less technical, and thus harder to get completely wrong.&lt;br /&gt;
&lt;br /&gt;
It has been suggested to me that the business needs to accept the risk, but are they really qualified to do so? &amp;nbsp;Surely it is InfoSec who, on behalf of the business it serves to protect, has to define and enforce SLAs for security risks?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5538004913618063056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5538004913618063056'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/objectifying-security-risk.html' title='Correctly Assessing Security Risk'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1843052797252512826</id><published>2017-05-05T23:08:00.000+01:00</published><updated>2017-05-06T11:43:12.627+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="authentication"/><category scheme="http://www.blogger.com/atom/ns#" term="authorisation"/><category scheme="http://www.blogger.com/atom/ns#" term="oauth"/><category scheme="http://www.blogger.com/atom/ns#" term="openam"/><category scheme="http://www.blogger.com/atom/ns#" term="PKI"/><category scheme="http://www.blogger.com/atom/ns#" term="SAML"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="Service"/><title type='text'>Uniform Service Authentication and Authorisation</title><content type='html'>The problem with using short-lived access tokens to enable authentication and authorisation of service requests, is that they only really work for synchronous interactions which themselves are short-lived. &amp;nbsp;Access tokens in, potentially long-lived, asynchronous messages run the risk of expiring.&lt;br /&gt;
&lt;br /&gt;
An interesting alternative is to use certificates to sign (and optionally encrypt) messages. &amp;nbsp;For example, service A sends a message via some number of queues to service B. &amp;nbsp;Service A has a private certificate which it uses to sign the message. &amp;nbsp;Service B receives the message, and uses the corresponding public certificate to validate the message signature, and since this would only work with Service A&#39;s public key, service B knows the message originated from service A, and can authorise the request accordingly. &amp;nbsp; &amp;nbsp;This would work equally well for synchronous calls.&lt;br /&gt;
&lt;br /&gt;
Of course, this means a lot of certificates deployed to a lot of places, but certificates could be obtained from a central service, and access control applied.&lt;br /&gt;
&lt;br /&gt;
So service identity is sorted, but would about user identity?&lt;br /&gt;
&lt;br /&gt;
I suggest that users and core services need to be separated by a gateway layer (application or service), which would be responsible for establishing user identity via some means (basic auth, OAuth, Kerberos, or whatever), and then sending a signed user identity assertion (along with any roles it might have) along with requests and messages, much like is done in &lt;a href=&quot;https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language&quot; target=&quot;_blank&quot;&gt;SAML&lt;/a&gt;. &amp;nbsp;Downstream services would trust the gateway to appropriately establish this identity, and trust would be ensured by means of the above certificate mechanism.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUTuibP0GA4vdpAmFXCbh7CDIGn-zhA4Jr4bd38gN1HklVkKK_xPBE6pBzTfoe7oNtVVSm1PEnKL6nPiz34R2MFY1yDWENlS0dx9e-FWZBiBZI-F-EAgN4XkVFJx4zJIlfalFR7LrDYruO/s1600/authentication.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUTuibP0GA4vdpAmFXCbh7CDIGn-zhA4Jr4bd38gN1HklVkKK_xPBE6pBzTfoe7oNtVVSm1PEnKL6nPiz34R2MFY1yDWENlS0dx9e-FWZBiBZI-F-EAgN4XkVFJx4zJIlfalFR7LrDYruO/s640/authentication.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you&#39;re looking for an identity &amp;amp; access management system, then check out &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenAM&quot; target=&quot;_blank&quot;&gt;OpenAM&lt;/a&gt;. &amp;nbsp;&lt;a href=&quot;https://www.forgerock.com/platform/access-management/&quot; target=&quot;_blank&quot;&gt;ForgeRock&lt;/a&gt; are doing an excellent job of supporting it, and the major releases are open sourced and free to use. We use it at &lt;a href=&quot;http://ig.com/&quot; target=&quot;_blank&quot;&gt;IG&lt;/a&gt; for SAML, OAuth, Windows SSO (Kerberos), LDAP authentication amongst other things. &amp;nbsp;It is very easy to configure, either manually or scripted (e.g. via Puppet), and provides us a resilient, scaleable, standard authentication capability. &amp;nbsp;It does also provide policy based access management, but we&#39;ve not ventured there yet.&lt;br /&gt;
&lt;br /&gt;
And there it is.&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1843052797252512826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1843052797252512826'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/uniform-service-authentication-and.html' title='Uniform Service Authentication and Authorisation'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUTuibP0GA4vdpAmFXCbh7CDIGn-zhA4Jr4bd38gN1HklVkKK_xPBE6pBzTfoe7oNtVVSm1PEnKL6nPiz34R2MFY1yDWENlS0dx9e-FWZBiBZI-F-EAgN4XkVFJx4zJIlfalFR7LrDYruO/s72-c/authentication.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-4116562915075848556</id><published>2017-05-05T21:00:00.000+01:00</published><updated>2017-05-05T22:45:03.342+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="documentation"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><title type='text'>I Hate Documentation!</title><content type='html'>For a software architect, and someone who tinkers with words, this is perhaps an odd thing to say, but it is true: I hate documentation.&lt;br /&gt;
&lt;br /&gt;
I hate it because it is laborious, very often serves no purpose other than to have been produced, and rapidly gets out of date. &amp;nbsp;I have followed methodologies where every model under the sun is produced, code is generated, and round-trip engineering is attempted. &amp;nbsp;What were we thinking?&lt;br /&gt;
&lt;br /&gt;
But documentation can add value. &amp;nbsp;Code is a very low-level, cumbersome way to get to grips with a system. &amp;nbsp;A few high-level component or sequence diagrams can add a lot of value. &amp;nbsp;Documentation helps you to navigate a system, and understand why something was built.&lt;br /&gt;
&lt;br /&gt;
So what to do?&lt;br /&gt;
&lt;br /&gt;
I think the first thing to do is to distinguish between transient and permanent documentation.&lt;br /&gt;
&lt;br /&gt;
Transient documentation is correct at a point in time, and very often only exists on a whiteboard. &amp;nbsp;It serves to help think about a solution, but has a very short life span. After it has served a purpose, it gets to rest in peace in some archive.&lt;br /&gt;
&lt;br /&gt;
Permanent documentation, however, continues to exist alongside the system, a living description that helps one to understand what was built. &amp;nbsp;Permanent documentation needs to be owned and managed. &amp;nbsp;And being managed, needs to be kept up to date. &amp;nbsp;This means that if a project impacts the system, the owner(s) of the permanent documentation of that system need to be notified, so that the documentation can be updated. Of course this is costly, so you do it only to documents you care about. &lt;br /&gt;
&lt;br /&gt;
But this is not the end of the story. &amp;nbsp;Generating navigable documentation from your systems is a powerful way of supplementing your formal documentation. &amp;nbsp;For example:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;using tools like Swagger to generate invokable service interface documentation. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;using deployment scripts to publish deployment information to configuration management database systems such as &lt;a href=&quot;https://www.servicenow.com/&quot; target=&quot;_blank&quot;&gt;Service Now&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;using application performance monitoring technology like &lt;a href=&quot;https://www.appdynamics.co.uk/&quot; target=&quot;_blank&quot;&gt;AppDynamics&lt;/a&gt; to show system deployments and interactions. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;using standardised logging and log aggregation (operational intelligence) tools like &lt;a href=&quot;https://www.splunk.com/&quot; target=&quot;_blank&quot;&gt;Splunk&lt;/a&gt; to help trace message flows through systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/4116562915075848556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/4116562915075848556'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/i-hate-documentation.html' title='I Hate Documentation!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-8715062344435830521</id><published>2017-05-05T14:24:00.003+01:00</published><updated>2017-05-05T20:24:04.897+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="oauth"/><category scheme="http://www.blogger.com/atom/ns#" term="openam"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Evil Session Tokens</title><content type='html'>So we build a new web application, SIMPLES.COM. &amp;nbsp;Clients login, over HTTPS of course, and a session token is issued. &amp;nbsp;Since we don&#39;t want the client to have to log in frequently, we give the token a long lifetime, or at least a way of using it to get a new one.&lt;br /&gt;
&lt;br /&gt;
The application will have to persist the token on the browser, so cookies are used. &amp;nbsp;We consider using browser local storage, but cookies seemed the best way to guarantee wide browser compatibility.&lt;br /&gt;
&lt;br /&gt;
The application then validates every HTTP operation, using the session token in the cookie, and authorises access as appropriate.&lt;br /&gt;
&lt;br /&gt;
Sorted.&lt;br /&gt;
&lt;br /&gt;
Enter the hacker.&lt;br /&gt;
&lt;br /&gt;
Client Joe Bloggs receives an email with a phishing link to dodgy website S1MPLES.COM (note the name is different), and clicks on it. &amp;nbsp;Joe is taken to a page where a few sneaky GET requests are sent to the real SIMPLES.COM website, and Joe&#39;s browser helpfully supplies the session cookie, since it&#39;s the correct domain, and the hacker now has access to Joe&#39;s data.&lt;br /&gt;
&lt;br /&gt;
How do we fix this?&lt;br /&gt;
&lt;br /&gt;
The first thing to do is not use cookies for authentication. &amp;nbsp;The web app must attach a session token header to each request. &amp;nbsp;That way the above Cross-site Request Forgery attack is not possible.&lt;br /&gt;
&lt;br /&gt;
However, we now have a long-lived session token being passed around, but that&#39;s OK, because we use HTTPS.&lt;br /&gt;
&lt;br /&gt;
Except we don&#39;t. &amp;nbsp;Not all the time.&lt;br /&gt;
&lt;br /&gt;
SIMPLES.COM is accessible over HTTP. &amp;nbsp;Only the login page and secure site are via HTTPS. &lt;br /&gt;
&lt;br /&gt;
So Joe, being a lover of coffee, and free WiFi, gets caught by a man-in-the-middle attack by Mr Evil with a portable WiFi router. &amp;nbsp;Mr Evil intercepts the requests, and the session session token sent with each request.&lt;br /&gt;
&lt;br /&gt;
Mr Evil now has full access to Joe&#39;s account, for a long time.&lt;br /&gt;
&lt;br /&gt;
The answer is to make SIMPLES.COM full HTTPS, and to use &lt;a href=&quot;https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security&quot; target=&quot;_blank&quot;&gt;HSTS&lt;/a&gt;&amp;nbsp;to ensure no opportunity for man-in-the-middle exists. And to add all the recommended security headers, e.g. &lt;a href=&quot;https://en.wikipedia.org/wiki/Content_Security_Policy&quot; target=&quot;_blank&quot;&gt;content security policy&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Cool. &amp;nbsp;Mr Evil shrugs, and picks on someone else.&lt;br /&gt;
&lt;br /&gt;
Much later, Mr Bored Developer is browsing through the application logs (helpfully made available via a log aggregator), when he notices that the session tokens are logged for all to see.&lt;br /&gt;
&lt;br /&gt;
Not so cool.&lt;br /&gt;
&lt;br /&gt;
So what do we do?&lt;br /&gt;
&lt;br /&gt;
One way is to use an OAuth approach to issue not one session token, but two: a short-lived access token, and a long-lived refresh token. &amp;nbsp;The refresh token is stored in the application browser, &amp;nbsp;but is never used for access, only to request new access tokens.&lt;br /&gt;
&lt;br /&gt;
Of course these access tokens could still be leaked, but being short-lived, should expire very quickly.&lt;br /&gt;
&lt;br /&gt;
Much better.&lt;br /&gt;
&lt;br /&gt;
P.S. Please, please don&#39;t build your own security solutions! &amp;nbsp;&lt;a href=&quot;https://projects.spring.io/spring-security/&quot; target=&quot;_blank&quot;&gt;Spring Security&lt;/a&gt; and mature open source identity and access management systems such as &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenAM&quot; target=&quot;_blank&quot;&gt;OpenAM&lt;/a&gt; are a much better way to go.&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8715062344435830521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8715062344435830521'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/evil-session-tokens.html' title='Evil Session Tokens'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1061814159619103923</id><published>2017-05-05T11:29:00.000+01:00</published><updated>2017-05-05T11:37:24.172+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="organisation"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type='text'>Application Security Function</title><content type='html'>Application Security is the software development concern of proactively ensuring that the applications being built, and integrated with, are secure. &amp;nbsp;This will require that application security becomes a standard focus for all software development teams, along with delivery, architecture, and quality assurance.&lt;br /&gt;
&lt;br /&gt;
I suggest that this needs to be achieved through:&lt;br /&gt;
&lt;h3&gt;
&lt;b&gt;Education&lt;/b&gt;&lt;/h3&gt;
Everybody (including the business and delivery) needs to understand the importance of security. &amp;nbsp;At &lt;a href=&quot;https://ig.com/&quot; target=&quot;_blank&quot;&gt;IG&lt;/a&gt; we had a very positive recent experience with a &lt;a href=&quot;http://blog.diniscruz.com/&quot; target=&quot;_blank&quot;&gt;consultant&lt;/a&gt;&amp;nbsp;who came into our offices, spent some time with our development teams, educating and instilling enthusiasm for the subject, and then closing with a company-wide demonstration of our application vulnerabilities at the time. &amp;nbsp;The presence of C-level executives at these demonstrations lead ultimately to the creation of an application security function (in addition to our already quite mature InfoSec function).&lt;br /&gt;
&lt;h3&gt;
Standardisation&lt;/h3&gt;
Adopt industry guidelines such as &lt;a href=&quot;https://www.owasp.org/&quot; target=&quot;_blank&quot;&gt;OWASP&lt;/a&gt;&amp;nbsp;to ensure a consistent, best-practise approach to security.&lt;br /&gt;
&lt;h3&gt;
Organisation&lt;/h3&gt;
Security, like quality, does not happen by accident, and requires organized effort to achieve. Create a team of security champions, whether physical or virtual, to:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;collaborate on application security decisions&lt;/li&gt;
&lt;li&gt;raise awareness of application security best practice in development teams&lt;/li&gt;
&lt;li&gt;help teams understand application security threats via &lt;a href=&quot;https://www.owasp.org/index.php/Application_Threat_Modeling&quot; target=&quot;_blank&quot;&gt;threat modeling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;help teams secure their applications via security test suites&lt;/li&gt;
&lt;li&gt;provide a developer communication and feedback loop on security matters&lt;/li&gt;
&lt;li&gt;collaborate closely with InfoSec, PMO and Operations to ensure appropriate goal alignment - resourcing security work will be a key challenge&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Process&lt;/h3&gt;
&lt;div&gt;
Integrate security with your software development lifecycle, specifically:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;create an effective security monitoring, incident, tracking and resolution process&lt;/li&gt;
&lt;li&gt;prioritise issues using the OWASP risk rating &lt;a href=&quot;https://www.owasp.org/index.php/OWASP_Risk_Rating_Methodology&quot; target=&quot;_blank&quot;&gt;framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;require teams to maintain &lt;a href=&quot;https://wiki.iggroup.local/display/APPSEC/Security+Threat+Modeling&quot; target=&quot;_blank&quot;&gt;security threat models&lt;/a&gt; for their applications&lt;/li&gt;
&lt;li&gt;create security cheat sheets and code review checklists&lt;/li&gt;
&lt;li&gt;create automatic security test suites&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h3&gt;
Testing&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Testing is the only way to confidently assert that an application meets its requirements, and this is no different for application security.  All applications should be required to have automated security test suites with adequate coverage.
In addition, periodic, independent 3rd party penetration tests and architecture reviews should be performed.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;h3&gt;
The Challenge&lt;/h3&gt;
&lt;/div&gt;
Doing security is like taking out an insurance policy. &amp;nbsp;You don&#39;t have to do it, and might get away with it, but can you afford the consequences if you don&#39;t?&lt;br /&gt;
&lt;br /&gt;
What do you have to lose?&lt;br /&gt;
&lt;br /&gt;
Probably a lot.&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1061814159619103923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1061814159619103923'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/application-security-function.html' title='Application Security Function'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-8331106834334627964</id><published>2017-05-04T17:25:00.000+01:00</published><updated>2017-05-05T10:43:54.762+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><title type='text'>Security-oriented Architecture</title><content type='html'>Split your monoliths into myriad services and suddenly your established security boundaries fizzle into non-existence.&lt;br /&gt;
&lt;br /&gt;
I would assert that &lt;b&gt;all &lt;/b&gt;services need to think about security, namely:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;authentication: who is calling me?&lt;/li&gt;
&lt;li&gt;authorisation: are they allowed to call me? &amp;nbsp;are they allowed to request this particular data?&lt;/li&gt;
&lt;li&gt;validation: is the message valid?&lt;/li&gt;
&lt;li&gt;confidentiality: is my sensitive data secure? &amp;nbsp;what is sensitive data?&lt;/li&gt;
&lt;li&gt;integrity: how do I know the request has not been tampered with?&lt;/li&gt;
&lt;li&gt;non-repudiation: how do I know the request came from a legitimate source&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Yes, &lt;b&gt;all &lt;/b&gt;services, even the internal ones. &amp;nbsp;Don&#39;t think of hackers as spotty teenage opportunists. &amp;nbsp;Think of &amp;nbsp;them as sophisticated criminal organisations that spend millions on stealing precious corporate data, or threatening brands with ransom attacks. &amp;nbsp;Loyal as I&#39;m sure your staff are, are they immune to greed, revenge or blackmail?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That&#39;s not to say you might not answer the questions above differently for internal services, as opposed to edge-facing ones, but consider these issues you must.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8331106834334627964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8331106834334627964'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2017/05/security-oriented-architecture.html' title='Security-oriented Architecture'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-3700427304978943611</id><published>2015-03-24T10:50:00.000+00:00</published><updated>2017-05-05T11:47:21.992+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="microservices"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><title type='text'>Microservices: New spin, old hat?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDgUlCVivjaEIjzE42L0ka8AxUpbTraNriIcYYwC-DPqy1NcPE86tVuQgOo6pmkRLHrXJ9_HqYuL8SQNP7RWw1HysNwPQVRux0u3_x-isqDPuKyk8gaBNnHah0sW_hVM9b8V04q6pzSYzF/s1600/micro-services.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDgUlCVivjaEIjzE42L0ka8AxUpbTraNriIcYYwC-DPqy1NcPE86tVuQgOo6pmkRLHrXJ9_HqYuL8SQNP7RWw1HysNwPQVRux0u3_x-isqDPuKyk8gaBNnHah0sW_hVM9b8V04q6pzSYzF/s1600/micro-services.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This year&#39;s &lt;a href=&quot;http://qconlondon.com/&quot; target=&quot;_blank&quot;&gt;QCon &lt;/a&gt;2015 conference in London was abuzz with talk of &lt;a href=&quot;http://martinfowler.com/articles/microservices.html&quot; target=&quot;_blank&quot;&gt;microservices&lt;/a&gt;, and if you, like me, have seen protocols and standards like CORBA, RMI, J(2)EE and SOAP come (and go), you would be forgiven for sighing and thinking &quot;what&#39;s new&quot;? &amp;nbsp;However, it seems that Google, Amazon, eBay and others would beg to differ.&lt;br /&gt;
&lt;br /&gt;
In a nutshell, microservices:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Are small (they fit in your head)&lt;/li&gt;
&lt;li&gt;Run in their own process&lt;/li&gt;
&lt;li&gt;Are independently replaceable, upgradeable and deployable via automated/test deployment mechanisms&lt;/li&gt;
&lt;li&gt;Are backwardly (and forwardly) compatible&lt;/li&gt;
&lt;li&gt;Communicate with each other via lightweight mechanisms, typically an HTTP resource API&lt;/li&gt;
&lt;li&gt;Are organised around business capabilities. &amp;nbsp;&quot;Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization&#39;s communication structure.&quot; -- Melvyn Conway, 1967&lt;/li&gt;
&lt;li&gt;Involve products, not projects&lt;/li&gt;
&lt;li&gt;Require decentralised governance&lt;/li&gt;
&lt;li&gt;Require decentralised data management (independent persistence)&lt;/li&gt;
&lt;li&gt;Automate their infrastructure (e.g. AWS)&lt;/li&gt;
&lt;li&gt;Are designed for failure of dependent services&lt;/li&gt;
&lt;li&gt;Prefer asynchronous calls to synchronous ones&lt;/li&gt;
&lt;li&gt;Involve evolutionary design&lt;/li&gt;
&lt;li&gt;Are fully developed, owned and supported by single teams&lt;/li&gt;
&lt;li&gt;Compete with each other in a market-place&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Much of this will be familiar, but what is new and very interesting is the degree to which microservices apply the familiar principles of loosely-coupled, encapsulated software components to the organisation developing and managing those components.&lt;br /&gt;
&lt;br /&gt;
Traditionally structured companies will balk at all of this, and perhaps dismiss this as yet another architectural fad, but I&#39;m not so sure. &amp;nbsp;Check out these two excellent videos on Spotify&#39;s Engineering Culture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;312&quot; mozallowfullscreen=&quot;&quot; src=&quot;https://player.vimeo.com/video/85490944&quot; webkitallowfullscreen=&quot;&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;312&quot; mozallowfullscreen=&quot;&quot; src=&quot;https://player.vimeo.com/video/94950270&quot; webkitallowfullscreen=&quot;&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Further reading:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://martinfowler.com/articles/microservices.html&quot; target=&quot;_blank&quot;&gt;Martin Fowler at al&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://microservices.io/patterns/microservices.html&quot; target=&quot;_blank&quot;&gt;Microservices.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3700427304978943611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3700427304978943611'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2015/03/microservices-summary.html' title='Microservices: New spin, old hat?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDgUlCVivjaEIjzE42L0ka8AxUpbTraNriIcYYwC-DPqy1NcPE86tVuQgOo6pmkRLHrXJ9_HqYuL8SQNP7RWw1HysNwPQVRux0u3_x-isqDPuKyk8gaBNnHah0sW_hVM9b8V04q6pzSYzF/s72-c/micro-services.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-3475294251725316677</id><published>2015-03-16T14:21:00.003+00:00</published><updated>2015-03-18T16:35:18.889+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><title type='text'>Supporting Your Public Web API</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBx8qQaAS0U5LeAagv0iNLDvbUSed3VZHjzsaPBQHnM8Hy9QUbwEK7fT4O7DMKUjVb5PxjOLjlHCHGVSlrC7kICGoJwhPjxEg-N7VTawmzrge91AmV1pqNiyhf7wSkl3PzVnGzO_TvMIO/s1600/web-api-support.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBx8qQaAS0U5LeAagv0iNLDvbUSed3VZHjzsaPBQHnM8Hy9QUbwEK7fT4O7DMKUjVb5PxjOLjlHCHGVSlrC7kICGoJwhPjxEg-N7VTawmzrge91AmV1pqNiyhf7wSkl3PzVnGzO_TvMIO/s1600/web-api-support.jpg&quot; height=&quot;320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
No matter how beautiful and well-designed your new web API is, unless it is well supported, you may find that you become a victim of your own success. &amp;nbsp;Below are 4 suggested key elements of a supportable web API, based on my experiences at &lt;a href=&quot;http://labs.ig.com/&quot; target=&quot;_blank&quot;&gt;IG&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Documentation, documentation, documentation!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Unless it is easier to refer to your API documentation than to contact you, you will be contacted. &amp;nbsp;Don&#39;t assume anything is obvious. &amp;nbsp;Document your API in detail. Define your business terms. &amp;nbsp;Explain common interaction patterns. &amp;nbsp;Provide client code snippets and working samples in a variety of language bindings. &amp;nbsp; Provide a FAQ.&lt;br /&gt;
&lt;br /&gt;
Consider providing a client SDK (Yes,I know REST is meant to be easy, but the reality is that unless your client is already a developer, they will struggle. &amp;nbsp;Make it easy for them to use your API.) &lt;br /&gt;
&lt;br /&gt;
Consider providing a moderated forum to allow clients to answer each other&#39;s questions. &amp;nbsp;Provide an interactive API explorer allowing clients to try out APIs and see the raw HTTP requests and responses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. First and Second Line Support&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Provide a &quot;contact us&quot; form instead of direct phone numbers. &amp;nbsp;The page should encourage clients to refer to API documentation, FAQ, and forum (if one exists).&lt;br /&gt;
&lt;br /&gt;
Provide first line, &quot;customer sensitive&quot; support to answer common queries, or at least to ensure queries are well formulated before passing onto second line support. &amp;nbsp;If your organisation already has a customer services help desk, use them! They may balk initially at the perceived technical nature of the support, but should be helped past this by through training and provided access to simple debugging tools, e.g. the API explorer or a facility to search service log files.&lt;br /&gt;
&lt;br /&gt;
Provide dedicated second line support via a rota consisting of the developers who built the API.&lt;br /&gt;
&lt;br /&gt;
Maintain a searchable log of frequently answered questions (and answers). &amp;nbsp;Update the public FAQ from this log.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Effective error handling&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Give API clients as much error information as possible in request responses. &amp;nbsp;If inputs are incorrect - tell them why. &amp;nbsp;If error codes are used - ensure these are documented.&lt;br /&gt;
&lt;br /&gt;
Log every request in detail, including request authentication headers and body (subject to client privacy constraints). &amp;nbsp;Use a transaction id pattern to allow the flow of API requests to be tracked across multiple back-end systems. &amp;nbsp;Provide easy access to system logs, e.g. via &lt;a href=&quot;http://www.splunk%2Ccom/&quot; target=&quot;_blank&quot;&gt;Splunk&lt;/a&gt;, which provides a searchable index over a number of configured log files. &amp;nbsp;Splunk additionally allows requests to be charted and management dashboards to be created. &amp;nbsp;Senior management will want to know just how popular the API is.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;4. Provide a barrier to entry&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If, despite all of the above, the demand for your API is still overwhelming, consider:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;throttling your API, with chargeable tiers for increased quotas&lt;/li&gt;
&lt;li&gt;requiring that a verified account to be opened before an API can be used&lt;/li&gt;
&lt;li&gt;providing support to valued customers only (or on a subscription basis).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3475294251725316677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3475294251725316677'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2015/03/supporting-your-public-web-api.html' title='Supporting Your Public Web API'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbBx8qQaAS0U5LeAagv0iNLDvbUSed3VZHjzsaPBQHnM8Hy9QUbwEK7fT4O7DMKUjVb5PxjOLjlHCHGVSlrC7kICGoJwhPjxEg-N7VTawmzrge91AmV1pqNiyhf7wSkl3PzVnGzO_TvMIO/s72-c/web-api-support.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-2575491060885008271</id><published>2015-01-14T16:33:00.000+00:00</published><updated>2017-05-05T21:44:38.626+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="business process management"/><category scheme="http://www.blogger.com/atom/ns#" term="business process modeling"/><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="ESB"/><category scheme="http://www.blogger.com/atom/ns#" term="java web service"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="service-oriented architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><title type='text'>What is SOA?</title><content type='html'>What is &lt;b&gt;SOA&lt;/b&gt;? &amp;nbsp;SOA or &lt;i&gt;Service-Oriented Architecture&lt;/i&gt; is a software architecture pattern in which applications or systems are constructed from underlying (and usually distributed) software services that conform to a specific set of characteristics, namely:&lt;br /&gt;
&lt;br /&gt;
1.&lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-contract-based.html&quot; title=&quot;What is SOA? Web Service Contracts&quot;&gt;Contract based&lt;/a&gt;&lt;br /&gt;
2. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-distributed.html&quot; title=&quot;What is SOA? Web Service Characteristic Location-transparency&quot;&gt;Location transparency&lt;/a&gt;&lt;br /&gt;
3. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-autonomous.html&quot; title=&quot;What is SOA? Web Service Characteristic Autonomous&quot;&gt;Autonomous&lt;/a&gt;&lt;br /&gt;
4. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-abstract.html&quot; title=&quot;What is SOA? Web Service Characteristic Abstract&quot;&gt;Abstract&lt;/a&gt;&lt;br /&gt;
5. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-reusable.html&quot; title=&quot;What is SOA? Web Service Characteristic Reusable&quot;&gt;Reusable&lt;/a&gt;&lt;br /&gt;
6. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-composable.html&quot; title=&quot;What is SOA? Web Service Characteristic Composable&quot;&gt;Composable&lt;/a&gt;&lt;br /&gt;
7. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-stateless.html&quot; title=&quot;What is SOA? Web Service Characteristic Stateless&quot;&gt;Stateless&lt;/a&gt;&lt;br /&gt;
8. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-discoverable.html&quot; title=&quot;What is SOA? Web Service Characteristic Discoverable&quot;&gt;Discoverable&lt;/a&gt;&lt;br /&gt;
9. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-extensible.html&quot; title=&quot;What is SOA? Web Service Characteristic Extensible&quot;&gt;Extensible&lt;/a&gt;&lt;br /&gt;
10. &lt;a href=&quot;http://soaprobe.blogspot.co.uk/2008/10/service-characteristics-loosely-coupled.html&quot; title=&quot;What is SOA? Web Service Characteristic Loosely coupled&quot;&gt;Loosely coupled&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The primary goal of &lt;b&gt;SOA &lt;/b&gt;is software development agility, i.e. the ability to respond the change easily, and cheaply, thus allowing businesses to rapidly respond to changing markets.&lt;br /&gt;
&lt;br /&gt;
Services are typically (but by no means exclusively) implemented as web services, i.e. they operate over the ubiquitous web HTTP protocol, and are implemented either using XML-based SOAP or the lightweight (and more popular) REST paradigm.&lt;br /&gt;
&lt;br /&gt;
The highly distributed nature of this architecture has resulted in a need for a runtime platform (the Enterprise Service Bus, ESB) to help manage the operation of these services, but also to handle complex enterprise integration scenarios involving multiple (and often legacy) platforms, protocols and security models - products like &lt;a href=&quot;http://www.oracle.com/us/products/middleware/soa/suite/overview/index.html&quot;&gt;Oracle Service Bus&lt;/a&gt; or the open source &lt;a href=&quot;http://mulesoft.org/&quot;&gt;Mule&lt;/a&gt; ESB.&lt;br /&gt;
&lt;br /&gt;
In addition to being an integration solution, the service-oriented pattern also offers an opportunity for easier implementation of high-level business processes using Business Process Management (BPM) solutions that are often offered as part of the ESB product suite.&lt;br /&gt;
&lt;br /&gt;
Service-oriented architecture is highly relevant to the rapidly growing cloud computing model where applications are built in the cloud as orchestrations over public cloud-based APIs, and we are seeing ESB vendors like &lt;a href=&quot;http://wso2.com/about/news/wso2-enterprise-service-bus-as-a-service-brings-agile-mediation-to-the-cloud/&quot; target=&quot;_blank&quot;&gt;WSO2&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://mulesoft.org/&quot;&gt;MuleSoft&lt;/a&gt;&amp;nbsp;in or moving into this space, offering cloud-based versions of their products, as well as API management products.&lt;br /&gt;
&lt;br /&gt;
Some will argue that &lt;i&gt;SOA &lt;/i&gt;is not new, and that distributed programming involving services has existed for a long time, and they are right. &amp;nbsp;However those early efforts stumbled on the hurdles of platform incompatibility and standards complexity. &amp;nbsp;Now, with ubiquitous, and easy to use protocols like REST, web service API development is growing rapidly, and the integration possibilities seem endless.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #f3f3f3; font-size: xx-small;&quot;&gt;(What is SOA, Service Oriented Architecture)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2575491060885008271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2575491060885008271'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/10/what-is-soa.html' title='What is SOA?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-8620552043195724016</id><published>2015-01-14T16:32:00.000+00:00</published><updated>2015-01-14T16:32:45.696+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="Web service"/><title type='text'>REST Web Service Paradigm Shift</title><content type='html'>Moving your &lt;b&gt;Service-Oriented Architecture&lt;/b&gt; (&lt;i&gt;&lt;b&gt;SOA&lt;/b&gt;&lt;/i&gt;) from RPC style (web) services to SOAP document-oriented services, or REST resource-oriented services requires a difficult mental paradigm shift.&amp;nbsp; The same kind of shift that was required for monolothic and procedural programmers to move to object-oriented programming styles.&amp;nbsp; This change is not easy, and not all will pass muster.&amp;nbsp; Failing to make the change will mean the difference between Just a Bunch of Web Services (&lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-or-just-bunch-of-web-services-jabows.html&quot; target=&quot;_blank&quot;&gt;JABOWS&lt;/a&gt;) or a fully-fledged &lt;a href=&quot;http://www.soa-probe.com/2012/10/what-is-soa.html&quot; target=&quot;_blank&quot;&gt;SOA&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Ensuring that this mind shift does happen will require good &lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-services-team-organization.html&quot; target=&quot;_blank&quot;&gt;organisation&lt;/a&gt; and strong, well-articulated guidance and &lt;a href=&quot;http://www.soa-probe.com/2012/10/service-oriented-architecture-soa.html&quot; target=&quot;_blank&quot;&gt;governance&lt;/a&gt;.&amp;nbsp; Until the new pattern becomes habit, people will very quickly slip into old habits.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Below are some guidelines and implementation suggestions from this blog:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-rest-service-key-guidelines.html&quot;&gt;Key REST service guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-rest-service-naming-guideline.html&quot;&gt;REST service naming guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2012/12/rest-web-service-error-handling-using.html&quot;&gt;REST service error handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2008/09/10-key-principles-of-service.html&quot;&gt;Service design principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2012/12/from-chaos-to-rest.html&quot;&gt;A plea for HATEOAS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-rest-http-response-error-status.html&quot;&gt;HTTP error code guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8620552043195724016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/8620552043195724016'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2013/02/rest-web-service-paradigm-shift.html' title='REST Web Service Paradigm Shift'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1063485086541863807</id><published>2014-09-06T12:08:00.003+01:00</published><updated>2014-09-06T12:22:49.534+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="humor"/><category scheme="http://www.blogger.com/atom/ns#" term="jokes"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><title type='text'>Favourite Funny Programming Jokes</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPtch-PytWkGC20RdXWI0rzJ1CKFiH0NzgA5t7QjFlxfo76-w8EFQ7xUfYK6KGrP9c5_c0o2Es50gv4lqvmt1HCFnt38avZKktZc1z6dXmM9w8FY9WZMhpH61jR_EEPODgBqIAcH4vRFI/s1600/no-class.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;funny programming joke picture - c++ c you have no class&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPtch-PytWkGC20RdXWI0rzJ1CKFiH0NzgA5t7QjFlxfo76-w8EFQ7xUfYK6KGrP9c5_c0o2Es50gv4lqvmt1HCFnt38avZKktZc1z6dXmM9w8FY9WZMhpH61jR_EEPODgBqIAcH4vRFI/s1600/no-class.jpeg&quot; title=&quot;funny programming joke&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
“Knock, knock.”&lt;br /&gt;
“Who’s there?”&lt;br /&gt;
...very long pause....&lt;br /&gt;
“Java.”&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
~&lt;/div&gt;
&lt;br /&gt;
Programming is like sex:&lt;br /&gt;
One mistake and you have to support it for the rest of your life.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
~&lt;/div&gt;
&lt;br /&gt;
The generation of random numbers is too important to be left to chance.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
~&lt;/div&gt;
&lt;br /&gt;
Two strings walk into a bar and sit down. The bartender says, “So what’ll it be?”&lt;br /&gt;
&lt;br /&gt;
The first string says, “I think I’ll have a beer quag fulk boorg jdk^CjfdLk jk3s d#f67howe%^U r89nvy~~owmc63^Dz x.xvcu”&lt;br /&gt;
&lt;br /&gt;
“Please excuse my friend,” the second string says, “He isn’t null-terminated.”&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
~&lt;/div&gt;
&lt;br /&gt;
A programmer was crossing a road one day when a frog called out to him and said, &quot;If you kiss me, I&#39;ll turn into a beautiful princess.&quot;&lt;br /&gt;
&lt;br /&gt;
He bent over, picked up the frog and put it in his pocket. The frog spoke up again and said, &quot;If you kiss me and turn me back into a beautiful princess, I will stay with you for one week.&quot;&lt;br /&gt;
&lt;br /&gt;
The programmer took the frog out of his pocket, smiled at it and returned it to the pocket. The frog then cried out, &quot;If you kiss me and turn me back into a princess, I&#39;ll stay with you and do anything you want.&quot; Again the programmer took the frog out, smiled at it and put it back into his pocket.&lt;br /&gt;
&lt;br /&gt;
Finally, the frog asked, &quot;What is the matter? I&#39;ve told you I&#39;m a beautiful princess that I&#39;ll stay with you for a week and do anything you want. Why won&#39;t you kiss me?&quot;&lt;br /&gt;
&lt;br /&gt;
The programmer said, &quot;Look, I&#39;m a programmer. I don&#39;t have time for a girlfriend -- but a talking frog, now that&#39;s cool!&quot;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1063485086541863807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1063485086541863807'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2014/09/favourite-funny-programming-jokes.html' title='Favourite Funny Programming Jokes'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPtch-PytWkGC20RdXWI0rzJ1CKFiH0NzgA5t7QjFlxfo76-w8EFQ7xUfYK6KGrP9c5_c0o2Es50gv4lqvmt1HCFnt38avZKktZc1z6dXmM9w8FY9WZMhpH61jR_EEPODgBqIAcH4vRFI/s72-c/no-class.jpeg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-7028335337184546602</id><published>2014-07-10T09:23:00.000+01:00</published><updated>2014-07-15T16:03:28.701+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Finance"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><title type='text'>Excel REST Trading API Example</title><content type='html'>As much as I have a love-hate relationship with Microsoft, I have to admit the Excel has won me over as a power-user tool, particularly in the world of finance, where it may be used to access powerful back-end analytics servers to provide real-time yield curves and such like. &lt;br /&gt;
&lt;br /&gt;
REST APIs such as IG&#39;s &lt;a href=&quot;http://labs.ig.com/&quot; target=&quot;_blank&quot;&gt;Web Trading API&lt;/a&gt; make this even easier, as this Excel VBA code snippet to get a list of open positions will hopefully demonstrate. &amp;nbsp;The sample assumes that a login /session request has already been executed and the client and account session tokens have been obtained. &amp;nbsp;The API key is the unique authorisation token required to access the API.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;Public Function positions() As Collection&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set up the HTTP access framework&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Set oXMLHTTP = CreateObject(&quot;MSXML2.XMLHTTP.6.0&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the API URL&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.Open(&quot;GET&quot;, IG_API_HOST + &quot;/positions&quot;, False)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the HTTP request headers:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the account session token&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.SetRequestHeader(&quot;X-SECURITY-TOKEN&quot;, m_accountToken)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the client session token&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.SetRequestHeader(&quot;CST&quot;, m_clientToken)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the API key&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.SetRequestHeader(&quot;X-IG-API-KEY&quot;, m_apiKey)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the content type to JSON&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.SetRequestHeader(&quot;Content-Type&quot;, &quot;application/json; chartset=utf-8&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Set the requested response type to JSON&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.SetRequestHeader(&quot;Accept&quot;, &quot;application/json; chartset=utf-8&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &#39; Execute the request&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Call oXMLHTTP.send&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; If oXMLHTTP.Status = 200 Then&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; Successful. A list of zero or more positions will have been returned&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; Extract the response as a JSON object&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim data As Dictionary&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set data = JSON.parse(oXMLHTTP.responseText)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; Get the list of positions from the response object&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim positions as Collection&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set positions = data.Item(&quot;positions&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; If positions exist, iterate over the list&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; If Not positions Is Nothing Then&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim aPosition As Object&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; Do something with the position, e.g. extract the instrument name of the underlying market&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; For Each aPosition In positions&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dim instrumentName as String&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;instrumentName&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;= aPosition.Item(&quot;market&quot;).Item(&quot;instrumentName&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; etc&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Next&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; Else&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; An error occurred&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MsgBox oXMLHTTP.responseText&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Set positions = Nothing&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; End If&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;End Function&lt;/span&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/7028335337184546602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/7028335337184546602'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2014/07/excel-rest-api.html' title='Excel REST Trading API Example'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-5471710308544174278</id><published>2014-06-30T17:48:00.000+01:00</published><updated>2014-07-24T08:18:22.414+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="IG Group"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="Trading"/><title type='text'>IG REST Trading API</title><content type='html'>&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;Hot off the press is the news that &lt;a href=&quot;http://ig.com/&quot; target=&quot;_blank&quot;&gt;IG&lt;/a&gt;&amp;nbsp;(my esteemed employer) has launched its &lt;a href=&quot;http://labs.ig.com/&quot; target=&quot;_blank&quot;&gt;REST Trading API&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;The API provides REST-based and streaming access to a range of popular asset classes (including indices, forex, commodities, binaries and options), and includes functionality to:&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px; font-family: Arial; font-size: 14px; line-height: 21px; padding-left: 20px;&quot;&gt;
&lt;li style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px;&quot;&gt;Trade using risk management tools such as stops and limits&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px; font-family: Arial; font-size: 14px; line-height: 21px; padding-left: 20px;&quot;&gt;
&lt;li style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px;&quot;&gt;View real-time and historical market prices&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px; font-family: Arial; font-size: 14px; line-height: 21px; padding-left: 20px;&quot;&gt;
&lt;li style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px;&quot;&gt;Analyse market instrument and client sentiment information&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px; font-family: Arial; font-size: 14px; line-height: 21px; padding-left: 20px;&quot;&gt;
&lt;li style=&quot;-webkit-margin-after: 0px; -webkit-margin-before: 0px;&quot;&gt;Review account balances and trade history&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://labs.ig.com/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCx6dsGne540HDogkCdABroQ0q1FRU71M60_suhOOFrUWPz2FFjf3HI8rkgjGUlcNYEQbNam1EY6h8Z9GuzTiMNx85WNEPFA7C1-wnLU5bv_rSQjNRLbN1Ip1U7dLj_7rk4xfDBcjN1ZJM/s1600/ig-labs-rest-trading-api.png&quot; height=&quot;262&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;IG already offers a well-established FIX API for corporate clients, but now with its new REST Trading API, IG&#39;s technology platform becomes much more easily and widely accessible, allowing for example:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;Corporate partner integration without the start-up costs and complexity of FIX&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;Trading strategy automation&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;Retail trading app development&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;The REST Trading API &lt;a href=&quot;http://labs.ig.com/&quot; target=&quot;_blank&quot;&gt;labs site&lt;/a&gt; offers getting started guides, API documentation, a downloadable sample trading app, and an interactive API companion app for trying out the REST APIs. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://labs.ig.com/sample-apps/api-companion/index.html&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMw8ZTw4xyGkRErCFtvc-7wnpjq8fU4WTw_DhUwUjz10Y0gXD-LmG4ufxbRCAiRELxJvKZkLItKt11I54-YFY6JOhLy1EHRRSYMmJToknxV63hDpyOHtDznDYXcuG5H1u2ZGsPmpe9INk_/s1600/ig-labs-rest-trading-api-companion.png&quot; height=&quot;311&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;The API will only be available in the UK initially, but the wider roll-out is imminent, so be sure to follow the labs site on &lt;a href=&quot;https://www.facebook.com/labs.IG&quot; target=&quot;_blank&quot;&gt;Facebook&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/IGLabs&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt; for updates. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #555555; font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 21px;&quot;&gt;Related:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;ComputerWorld: &lt;a href=&quot;http://www.computerworlduk.com/news/applications/3532205/ig-opens-up-web-api-allow-traders-develop-own-financial-apps/&quot;&gt;IG
opens up web API to allow traders to develop own financial apps&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Finextra: &lt;a href=&quot;http://www.finextra.com/news/announcement.aspx?pressreleaseid=56097&amp;amp;topic=dealing&quot;&gt;IG
opens up Web API to let traders build own apps&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;Forex Crunch: &lt;a href=&quot;http://www.forexcrunch.com/ig-labs-aims-to-give-traders-more-control-of-the-way-they-trade/&quot;&gt;IG
Labs aims to give traders more control of the way they trade&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;ForexMagnates: &lt;a href=&quot;http://forexmagnates.com/ig-opens-api-to-public-development-launches-ig-labs/&quot;&gt;IG
Opens API to Public Development, Launches IG Labs&lt;/a&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraph&quot; style=&quot;text-indent: -18.0pt;&quot;&gt;
&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;FOW.com: &lt;a href=&quot;http://fow.com/3364037/IG-rolls-out-new-tech-offering-for-traders.html&quot;&gt;IG
rolls out new tech offering for traders&lt;/a&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: #555555; font-family: Arial; font-size: 14px; line-height: 21px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5471710308544174278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/5471710308544174278'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2014/06/ig-rest-trading-api.html' title='IG REST Trading API'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCx6dsGne540HDogkCdABroQ0q1FRU71M60_suhOOFrUWPz2FFjf3HI8rkgjGUlcNYEQbNam1EY6h8Z9GuzTiMNx85WNEPFA7C1-wnLU5bv_rSQjNRLbN1Ip1U7dLj_7rk4xfDBcjN1ZJM/s72-c/ig-labs-rest-trading-api.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1408750152318526212</id><published>2013-02-19T11:14:00.003+00:00</published><updated>2013-02-19T11:17:22.859+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="handling"/><category scheme="http://www.blogger.com/atom/ns#" term="management"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><title type='text'>Layer 7 on REST API Error Handling</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/NTObb3ZS1nk&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
Layer 7 Video on REST API Error Handling</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1408750152318526212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1408750152318526212'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2013/02/layer-7-on-rest-api-error-handling.html' title='Layer 7 on REST API Error Handling'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/NTObb3ZS1nk/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1418146047501684594</id><published>2013-02-19T11:03:00.002+00:00</published><updated>2013-02-19T11:03:23.273+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="apigee"/><category scheme="http://www.blogger.com/atom/ns#" term="design"/><title type='text'>Apigee on REST API Design</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/P9FXZ8pYxmw&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
Apigee Presentation Video on REST API Design</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1418146047501684594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1418146047501684594'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2013/02/apigee-on-rest-api-design.html' title='Apigee on REST API Design'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/P9FXZ8pYxmw/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-6612609993051786835</id><published>2013-02-19T09:47:00.004+00:00</published><updated>2013-02-19T09:47:58.099+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="WS02"/><title type='text'>WS02 REST API Management</title><content type='html'>&lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/10478640&quot; width=&quot;427&quot; height=&quot;356&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/wso2.org/rest-api-webinar3-10478640&quot; title=&quot;REST &amp;amp; API Management with the WSO2 ESB&quot; target=&quot;_blank&quot;&gt;REST &amp;amp; API Management with the WSO2 ESB&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/wso2.org&quot; target=&quot;_blank&quot;&gt;WSO2&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6612609993051786835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/6612609993051786835'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2013/02/ws02-rest-api-management.html' title='WS02 REST API Management'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-1585259654899160053</id><published>2012-12-20T14:06:00.001+00:00</published><updated>2013-02-17T20:49:50.884+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="error handling"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><category scheme="http://www.blogger.com/atom/ns#" term="Spring"/><category scheme="http://www.blogger.com/atom/ns#" term="Web service"/><title type='text'>REST Web Service Spring Error Handling</title><content type='html'>The Spring framework provides excellent support for building REST &lt;b&gt;web services&lt;/b&gt; in a service-oriented architecture (SOA), as I have demonstrated in a previous &lt;a href=&quot;http://www.soa-probe.com/2012/10/soa-rest-spring-framework-example-guide.html&quot;&gt;post&lt;/a&gt;, but what is not immediately obvious is how best to deal with errors.  Instead of throwing raw exceptions to the client, one would prefer to return a well-formed response consisting of an appropriate HTTP status code and a meaningul response body containing a structured error message in the response form  (JSON, XML, ...) requested by the client.&lt;br /&gt;
&lt;br /&gt;
For example, assuming you have a basic REST endpoint such as:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt; @RequestMapping(value = &quot;/samples&quot;, method = {RequestMethod.GET})
 @ResponseBody
 public SampleList findAllSamples() throws SampleException {
  return new SampleList(service.findAllSamples());
 }
&lt;/pre&gt;
&lt;br /&gt;
It is good practice in general to not let implementation exceptions leave the service tier, so you might use aspects to catch these and rethrow them as service exceptions.&amp;nbsp; The code below catches a ReferenceNotFoundException from the data access tier and throws a service exception with the reference number and setting the desired http status code.&amp;nbsp; Another good practice is to avoid sending free text error messages to a service client, and instead to send structured messages that can be dealt with or rendered as the client sees fit.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;@Aspect
@Component(&quot;exceptionHandler&quot;)
public class ExceptionHandler {

   /**
    * Exception handler for ReferenceNotFoundExceptions
    * 
    * @param nfe the exception being handled
    */
   @AfterThrowing(pointcut = &quot;execution (* com.sample.service.*.*(..))&quot;,&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                                              throwing = &quot;nfe&quot;)
   public void handleNotFoundException(ReferenceNotFoundException nfe) {
      throw new SampleException(
         new ReferenceNotFoundError(nfe.getReference()),&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                               HttpStatus.NOT_FOUND);
   }


&lt;/pre&gt;
Now to map the service exception (SampleException) to a meaningful HTTP response using the Spring 3 @ExceptionHandler annotation:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;   @ExceptionHandler(SampleException.class)
   @ResponseBody
   public SampleErrorList exceptionHandler(SampleException se,
                 HttpServletRequest req,
                 HttpServletResponse res) throws IOException {

      res.setStatus(se.getHttpStatus());

      return new SampleErrorList(se.getErrors());

   }
 &lt;/pre&gt;
&lt;br /&gt;
It is also possible to set the HTTP status code using an annotation, but in this example the exception determines this, so the handler sets it programmatically.&lt;br /&gt;
&lt;br /&gt;
See &lt;a href=&quot;https://github.com/IG-Group/RESTdoclet/tree/master/sample&quot;&gt;here&lt;/a&gt; for a downloadable working sample.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
REST Web Service Spring Error Handling &lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1585259654899160053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/1585259654899160053'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/12/rest-web-service-error-handling-using.html' title='REST Web Service Spring Error Handling'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-36280984402334032</id><published>2012-12-07T09:30:00.002+00:00</published><updated>2012-12-07T09:30:47.708+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="funny"/><category scheme="http://www.blogger.com/atom/ns#" term="joke"/><category scheme="http://www.blogger.com/atom/ns#" term="SOA"/><title type='text'>Funny SOA Joke?</title><content type='html'>“Knock, knock.”&lt;br /&gt;&lt;br /&gt;
“Who’s there?”&lt;br /&gt;&lt;br /&gt;
... very long, expensive pause ....&lt;br /&gt;&lt;br /&gt;
“SOA”&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/36280984402334032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/36280984402334032'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/12/funny-soa-joke.html' title='Funny SOA Joke?'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-2620075748813863049</id><published>2012-11-27T11:53:00.000+00:00</published><updated>2012-11-28T08:26:21.426+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="ESB"/><title type='text'>How my wife explained ESB to me</title><content type='html'>Wife: I&#39;ve been thinking...&lt;br /&gt;
&lt;br /&gt;
Me: (Oh no... what now?) Well done! ...&amp;nbsp; Ouch! ... &lt;br /&gt;
&lt;br /&gt;
Wife: That service thingy you told me about the other day... lots of little services all helping each other out...&lt;br /&gt;
&lt;br /&gt;
Me: Service-oriented Architecture.&amp;nbsp; What about it?&lt;br /&gt;
&lt;br /&gt;
Wife: Well, it&#39;s a nice idea in principle, but sounds like it would be a nightmare to manage.&amp;nbsp; A bit like a juggler trying to cope with lots of objects in the air, all different shapes and sizes...&lt;br /&gt;
&lt;br /&gt;
Me: That&#39;s a really good analogy.&amp;nbsp; Yes, service-oriented architecture needs a juggler.&amp;nbsp; They call it an ESB or enterprise service bus.&lt;br /&gt;
&lt;br /&gt;
Wife (laughing): You men and your three letter acronyms.&lt;br /&gt;
&lt;br /&gt;
Me: It&#39;s actually quite a cool concept, a bit like a telephone switchboard.&amp;nbsp; Services are connected in flexible ways via the bus, without being physically connected to each other.&amp;nbsp; The bus looks after the connections, and can reroute calls when connections fail for example.&lt;br /&gt;
&lt;br /&gt;
Wife: Like an automatic switchboard operator.&lt;br /&gt;
&lt;br /&gt;
Me: Yes, exactly!&amp;nbsp; You&#39;re fabulous, you know?&lt;br /&gt;
&lt;br /&gt;
Wife: You&#39;ve only discovered that now?&lt;br /&gt;
&lt;br /&gt;
Me: Er...</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2620075748813863049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/2620075748813863049'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/11/how-my-wife-explained-esb-to-me.html' title='How my wife explained ESB to me'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3825159152896936294.post-3640556719126073044</id><published>2012-11-26T08:52:00.000+00:00</published><updated>2012-11-26T08:52:51.613+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="SaaS"/><category scheme="http://www.blogger.com/atom/ns#" term="salesforce"/><category scheme="http://www.blogger.com/atom/ns#" term="Service"/><category scheme="http://www.blogger.com/atom/ns#" term="wife"/><title type='text'>How I explained SaaS to my wife</title><content type='html'>Wife: You&#39;ve been staring at that screen for ages.&amp;nbsp; What are you doing?&lt;br /&gt;
&lt;br /&gt;
Me: Thinking about writing a post on SaaS.&lt;br /&gt;
&lt;br /&gt;
Wife: On what?&lt;br /&gt;
&lt;br /&gt;
Me: Software As A Service.&lt;br /&gt;
&lt;br /&gt;
Wife: Is that what you were &lt;a href=&quot;http://www.soa-probe.com/2012/11/how-i-explained-soa-to-my-wife.html&quot; target=&quot;_blank&quot;&gt;telling&lt;/a&gt; me about the other day?&amp;nbsp; Service-oriented thingy?&lt;br /&gt;
&lt;br /&gt;
Me: Service-oriented Architecture.&amp;nbsp; Yeah, it&#39;s similar, but instead of little services which you can use to build your program, you get a whole program as a service.&amp;nbsp; Imagine Excel on the internet - or the &quot;cloud&quot; as it&#39;s being called - you don&#39;t have to install it on your computer, you just go on the internet to use it.&lt;br /&gt;
&lt;br /&gt;
Wife: The internet?&amp;nbsp; Isn&#39;t that slow?&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Me: It can be, so you need to be careful what kind of programs you do this with.&amp;nbsp; For instance, there&#39;s a company called SalesForce who offer a Customer Relationship Management program via SaaS.&amp;nbsp; Companies use it because it saves them having to install and manage lots of computers to put this big program on.&lt;br /&gt;
&lt;br /&gt;
Wife: Interesting...&lt;br /&gt;
&lt;br /&gt;
Me: Are you being sarcastic again?&lt;br /&gt;
&lt;br /&gt;
Wife: No, not at all.&amp;nbsp; I&#39;m just wondering if they do HaaS?&lt;br /&gt;
&lt;br /&gt;
Me: What?&lt;br /&gt;
&lt;br /&gt;
Wife: Husband As A Service.&amp;nbsp; I still need that light upstairs fixed.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3640556719126073044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3825159152896936294/posts/default/3640556719126073044'/><link rel='alternate' type='text/html' href='http://soaprobe.blogspot.com/2012/11/how-i-explained-saas-to-my-wife.html' title='How I explained SaaS to my wife'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>