{"id":879,"date":"2019-09-26T10:44:04","date_gmt":"2019-09-26T08:44:04","guid":{"rendered":"http:\/\/blog.zhaw.ch\/splab\/?p=879"},"modified":"2019-09-26T10:44:05","modified_gmt":"2019-09-26T08:44:05","slug":"cloud-cost-estimation-forecasting-engine","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/","title":{"rendered":"Cloud Cost Estimation &amp; Forecasting Engine"},"content":{"rendered":"\n<p>The occasion of the 3.3.2 release of the rating-charging-billing solution for cloud software and platform providers, <a href=\"https:\/\/icclab.github.io\/cyclops\/\">Cyclops<\/a>, is a good opportunity for a deep dive into the new forecasting engine, the how and the why of its functionality and how to use it.<br><\/p>\n\n\n\n<p>First, a bit of news. Active maintenance and further updates to Cyclops will now be found under the repository <a href=\"https:\/\/github.com\/serviceprototypinglab\/cyclops\">https:\/\/github.com\/serviceprototypinglab\/cyclops<\/a>. The primary new addition is the forecasting engine. It helps SaaS\/PaaS\/CaaS\/&#8230;XaaS providers to not only charge customers for their services, but also predict a revenue flow for deciding about future investments.<br><\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Core Estimation &amp; Forecasting Engine<br><\/h3>\n\n\n\n<p>The purpose of the Estimation Engine is to provide revenue prediction functionality and to allow the user, in this case a manager or administrator, to test potential changes to the pricing strategies they employ, and see how they will affect future revenue generation.<br><\/p>\n\n\n\n<p>Thus, the engine works in two stages. The first stage of the engine is the forecast generator, which is based on the principles of timeseries forecasting and integrated into Cyclops\u2019 UDR microservice. Early versions of the engine relied on the <a href=\"https:\/\/people.duke.edu\/~rnau\/411arim.htm\">ARIMA<\/a> model for forecast generation, though some problems in its Java library implementation lead to a simpler forecasting method being used. At this stage, the forecast is generated in the following way:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Existing usage data is collected from the usage table of the Cyclops UDR database<\/li><li>Data is organized by user and usage type (eg CPU allocated or external IPs used)<\/li><li>For each user and for each type of usage, the average hourly usage is calculated, then extrapolated over the desired forecast duration. This may seem like a downgrade from the ARIMA model used in previous iterations, though test-runs have shown the results are within \u22135% of what the model predicted and as stated before the Java library implementing that model was problematic<\/li><\/ol>\n\n\n\n<p>The second element of the estimation engine is the ability to test pricing rules different to the ones currently used in production to generate the revenue forecast. Special \u2018testing\u2019 rules can be added to the Coin engine, which rely on a property of the forecast generator to \u2018tag\u2019 the generated records in order for them to trigger specific rules. Put simply, rules can test records for a specific tag, so that when a forecast request is made with that tag, the records will have that tag and trigger these specific targeted rules.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the Engine<br><\/h3>\n\n\n\n<p>To demonstrate the features of the Estimation Engine, we\u2019ll walk through some simple examples. This will be made even easier with the use of the graphical dashboard.<br><\/p>\n\n\n\n<p>We will actually be following the stages of the engine backwards, since we will start by deploying our test rules. First, we navigate to the Rule Management page in the dashboard. Here, we can see all rules deployed to both instances of the Coin engine.<br><\/p>\n\n\n\n<p>By going to the New Rule tab, we can add new rules to the engine. Let\u2019s look at an example of a testing rule:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import ch.icclab.cyclops.facts.Usage;\nimport ch.icclab.cyclops.facts.Charge;\n\nrule \"Test 1 rule for storage_allocated (12:36:0.4 20\/Aug\/2019)\"\nsalience 60\nwhen\n  $usage: Usage(metric == \"storage_allocated\" &amp;&amp; account.contains(\"test1\"))\nthen\n  Charge charge = new Charge($usage);\n  charge.setCharge(0.00000000004 * $usage.getUsage());\n  charge.setCurrency(\"CHF\");\n\n  retract($usage);\n  insert(charge);\nend\n<\/code><\/pre>\n\n\n\n<p>The important part to note here is account.contains(&#8220;test1&#8221;) , and then the fact that the rule has a salience of 60 , where production rules have 50. The first item means that this rule will only be fired if the account field of the usage record contains the \u2018test1\u2019 substring. When a forecast is requested with the \u2018test1\u2019 tag, all records generated will contain this substring in the account field, so they will trigger the rule if the other conditions are met. Thus, these tags can be used to group rules together into entire pricing models. The importance of salience being higher that the production rule is simply to ensure the rule is checked first, as a rule firing means the record is deleted from the queue.<br><\/p>\n\n\n\n<p>After all the rules are deployed we can move to the forecasting page to generate some forecasts and compare our models. Let\u2019s review the options given.<br><\/p>\n\n\n\n<p>For the type of forecast, we can select:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Single account: This will only generate a forecast for the user selected in the user field that appears only when using this option<\/li><li>Global: This will average the usage of all accounts and generate a single forecast, organising only by usage type. Only useful for getting an overview in databases with many accounts.<\/li><li>Pattern-based global: This will generate a forecast for each and every account in the database, using the full forecasting strategy of organising historical records by user and type and then forecasting each.<\/li><\/ul>\n\n\n\n<p>The target model field is used to input the rule tag to be used for the forecast.<br><\/p>\n\n\n\n<p>Finally the length of the forecast is the number of days into the future that will be estimated.<br><\/p>\n\n\n\n<p>Generating the forecast will produce 3 cards:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Revenue by account: This card breaks down the total forecast by user account<\/li><li>Total forecast by model: This card displays the total forecasted revenue. It is useful for comparing multiple models when more than one forecast are generated<\/li><li>Bill breakdown: This view breaks down each individual bill generated by the engine by usage type, to provide details on how each billed metric contributed to the total bill<\/li><\/ul>\n\n\n\n<p>It is worth noting that multiple forecasts can be generated in sequence, using different tags, to allow for direct comparison.<br><\/p>\n\n\n\n<p>Finally, the Record Cleanup card can be used to clear the forecast. This will delete all records with a given tag, from all 3 Cyclops databases.<br><\/p>\n\n\n\n<p>Here is a video of a forecast being generated from our <a href=\"https:\/\/www.youtube.com\/channel\/UCssxF0ehXakfWHPDsAdTC3w\">Service Prototyping Research Videos<\/a> channel on YouTube:<\/p>\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"lyte-wrapper\" title=\"Cloud service revenue forecasting with customizable and comparable pricing models\" style=\"width:640px;max-width:100%;margin:5px;\"><div class=\"lyMe\" id=\"WYL_ykrzb_U5aoc\"><div id=\"lyte_ykrzb_U5aoc\" data-src=\"https:\/\/blog.zhaw.ch\/splab\/wp-content\/plugins\/wp-youtube-lyte\/lyteCache.php?origThumbUrl=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fykrzb_U5aoc%2Fhqdefault.jpg\" class=\"pL\"><div class=\"tC\"><div class=\"tT\">Cloud service revenue forecasting with customizable and comparable pricing models<\/div><\/div><div class=\"play\"><\/div><div class=\"ctrl\"><div class=\"Lctrl\"><\/div><div class=\"Rctrl\"><\/div><\/div><\/div><noscript><a href=\"https:\/\/youtu.be\/ykrzb_U5aoc\" rel=\"nofollow\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.zhaw.ch\/splab\/wp-content\/plugins\/wp-youtube-lyte\/lyteCache.php?origThumbUrl=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fykrzb_U5aoc%2F0.jpg\" alt=\"Cloud service revenue forecasting with customizable and comparable pricing models\" width=\"640\" height=\"340\" \/><br \/>Watch this video on YouTube<\/a><\/noscript><\/div><\/div><div class=\"lL\" style=\"max-width:100%;width:640px;margin:5px;\"><br\/><span class=\"lyte_disclaimer\">Defaulttext aus wp-youtube-lyte.php<\/span><\/div><figcaption>Video of the example described<\/figcaption><\/figure><div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/billing\/\">billing<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/cloud-accounting\/\">cloud accounting<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/cyclops\/\">cyclops<\/a>, <a href=\"http:\/\/blog.zhaw.ch\/splab\/tag\/forecasting\/\">forecasting<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>The occasion of the 3.3.2 release of the rating-charging-billing solution for cloud software and platform providers, Cyclops, is a good opportunity for a deep dive into the new forecasting engine, the how and the why of its functionality and how to use it. First, a bit of news. Active maintenance and further updates to Cyclops [&hellip;]<\/p>\n","protected":false},"author":438,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[77,30,75,83],"features":[],"class_list":["post-879","post","type-post","status-publish","format-standard","hentry","category-research","tag-billing","tag-cloud-accounting","tag-cyclops","tag-forecasting"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Cloud Cost Estimation &amp; Forecasting Engine - Service Prototyping Lab<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cloud Cost Estimation &amp; Forecasting Engine\" \/>\n<meta property=\"og:description\" content=\"The occasion of the 3.3.2 release of the rating-charging-billing solution for cloud software and platform providers, Cyclops, is a good opportunity for a deep dive into the new forecasting engine, the how and the why of its functionality and how to use it. First, a bit of news. Active maintenance and further updates to Cyclops [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Prototyping Lab\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-26T08:44:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-09-26T08:44:05+00:00\" \/>\n<meta name=\"author\" content=\"Panagiotis Gkikopoulos\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Panagiotis Gkikopoulos\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\"},\"author\":{\"name\":\"Panagiotis Gkikopoulos\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11\"},\"headline\":\"Cloud Cost Estimation &amp; Forecasting Engine\",\"datePublished\":\"2019-09-26T08:44:04+00:00\",\"dateModified\":\"2019-09-26T08:44:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\"},\"wordCount\":943,\"commentCount\":0,\"keywords\":[\"billing\",\"cloud accounting\",\"cyclops\",\"forecasting\"],\"articleSection\":[\"Research\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\",\"name\":\"Cloud Cost Estimation &amp; Forecasting Engine - Service Prototyping Lab\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\"},\"datePublished\":\"2019-09-26T08:44:04+00:00\",\"dateModified\":\"2019-09-26T08:44:05+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/splab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud Cost Estimation &amp; Forecasting Engine\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/splab\/\",\"name\":\"Service Prototyping Lab\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11\",\"name\":\"Panagiotis Gkikopoulos\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g\",\"caption\":\"Panagiotis Gkikopoulos\"},\"url\":\"https:\/\/blog.zhaw.ch\/splab\/author\/pang\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cloud Cost Estimation &amp; Forecasting Engine - Service Prototyping Lab","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/","og_locale":"en_GB","og_type":"article","og_title":"Cloud Cost Estimation &amp; Forecasting Engine","og_description":"The occasion of the 3.3.2 release of the rating-charging-billing solution for cloud software and platform providers, Cyclops, is a good opportunity for a deep dive into the new forecasting engine, the how and the why of its functionality and how to use it. First, a bit of news. Active maintenance and further updates to Cyclops [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/","og_site_name":"Service Prototyping Lab","article_published_time":"2019-09-26T08:44:04+00:00","article_modified_time":"2019-09-26T08:44:05+00:00","author":"Panagiotis Gkikopoulos","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Panagiotis Gkikopoulos","Estimated reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/"},"author":{"name":"Panagiotis Gkikopoulos","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11"},"headline":"Cloud Cost Estimation &amp; Forecasting Engine","datePublished":"2019-09-26T08:44:04+00:00","dateModified":"2019-09-26T08:44:05+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/"},"wordCount":943,"commentCount":0,"keywords":["billing","cloud accounting","cyclops","forecasting"],"articleSection":["Research"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/","url":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/","name":"Cloud Cost Estimation &amp; Forecasting Engine - Service Prototyping Lab","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#website"},"datePublished":"2019-09-26T08:44:04+00:00","dateModified":"2019-09-26T08:44:05+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/splab\/2019\/09\/26\/cloud-cost-estimation-forecasting-engine\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/splab\/"},{"@type":"ListItem","position":2,"name":"Cloud Cost Estimation &amp; Forecasting Engine"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/splab\/#website","url":"https:\/\/blog.zhaw.ch\/splab\/","name":"Service Prototyping Lab","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/splab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/splab\/#\/schema\/person\/6a362b2982b686a44a453206cb3cee11","name":"Panagiotis Gkikopoulos","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/88f238fea03fa1a0fe3ee06ef74194f1b2f1ebde2deecb56364cf02b2eb18ec2?s=96&d=mm&r=g","caption":"Panagiotis Gkikopoulos"},"url":"https:\/\/blog.zhaw.ch\/splab\/author\/pang\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/users\/438"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/comments?post=879"}],"version-history":[{"count":3,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/879\/revisions"}],"predecessor-version":[{"id":931,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/posts\/879\/revisions\/931"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/media?parent=879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/categories?post=879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/tags?post=879"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/splab\/wp-json\/wp\/v2\/features?post=879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}