{"id":926,"date":"2016-07-26T08:00:55","date_gmt":"2016-07-26T06:00:55","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=926"},"modified":"2023-06-07T15:11:18","modified_gmt":"2023-06-07T13:11:18","slug":"socialcloud-configure-all-the-things-part-6","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/26\/socialcloud-configure-all-the-things-part-6\/","title":{"rendered":"SocialCloud &#8211; Configure all the things! &#8211; Part 6"},"content":{"rendered":"<p>One of the requirements of the system is that organizations should be able to set up and deploy the HumHub system on their own. For this purpose, we have designed the Configtool. To meet this requirement we have to use different tools, procedures and interfaces from Bluemix. In the following we would like to introduce some of them.<\/p>\n<p><!--more--><\/p>\n<h2>Implementing the Configtool<\/h2>\n<p>To implement the Configtool, we decided to create a basic PHP application, written with the help of the web framework <a href=\"https:\/\/laravel.com\/\">Laravel<\/a>. We created the views, models and controllers necessary for the actions we wanted the users to perform. At first, we had some trouble to deploy the application on the Bluemix server, but after some research we found out, that we had to modify the folder structure of the Laravel application a little bit, so that it fits into the Bluemix web application structure. It\u2019s not very complicated, you basically just move almost the whole application folder into an htdocs folder.<\/p>\n<p>As a database we used a ClearDB Spark service which is provided by Bluemix and is based on MySQL. When you use a service instance like this database, Bluemix automatically creates some credentials for your application. So you just insert these into the Laravel database configuration file and there you go!<\/p>\n<p>As Bluemix also provides you a custom git repository and a deployment pipeline, we could just develop and test locally, followed by committing and pushing &nbsp;the changes and wait some minutes for Bluemix to deploy the new version on the server.<\/p>\n<h2>Command Line Interfaces (CLI)<\/h2>\n<p>Bluemix provides two command line interfaces for the access of the services and applications, the IBM\u00ae Bluemix\u00ae and Cloud Foundry command line interfaces. With the assistance of the command line interfaces the Applications and Services from Bluemix can be provided, configured and changed. But for our use case we only need the command line interface from Cloud Foundry.<\/p>\n<p>For example as an alternative way to deploy an app you could use the command line interface like this:<\/p>\n<p>Code:<\/p>\n<pre class=\"prettyprint lang-text\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">bluemix api https:\/\/api.eu-gb.bluemix.net\nbluemix login -u &lt;email&gt; -o &lt;organisation&gt; -s &lt;space&gt;\ncf push &lt;app name&gt;<\/pre>\n<p>There is also a manifest file that allows you to define the amount of instances to be launched. For the beginning we decided to launch two instances but it\u2019s always possible to change the amount of running instances dynamically at a later time.<\/p>\n<p>As mentioned in the previous blog post [TODO: LINK] we decided to create a separate database for each user group. To realize a dynamic creation we can create new database services and bind them to the HumHub application by using the following commands:<\/p>\n<p>Code:<\/p>\n<pre class=\"prettyprint lang-text\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">cf create-service mysql 100 &lt;service name&gt;\ncf bind-service &lt;app name&gt; &lt;service name&gt;\ncf create-route &lt;space&gt; eu-gb.mybluemix.net --hostname &lt;route&gt;\ncf map-route &lt;app name&gt; eu-gb.mybluemix.net -n &lt;route&gt;\n<\/pre>\n<p>The script creates a mysql service with the plan option 100 (it was the only plan available ;-)) and binds it to HumHub. In the next step it connects to the newly created database and initializes it with the basic configuration set of tables for the application. Also the script is generating a new route (subdomain) to provide direct access to the application for the user groups.<\/p>\n<p>For example a user could request the domain&nbsp;<b>userGroup1<\/b>.applicationName.eu-gb.mybluemix.net and would be forwarded directly to HumHub. At this point HumHub connects dynamically to the right database service depending on the given subdomain userGroup1. We made some small modifications in HumHub to use the database credentials from the given environment variables in Bluemix instead of hardcoded credentials in HumHub\u2019s source code.<\/p>\n<p>The good thing about the Cloud Foundry command line is the possibility to use the same commands in PHP with the functions like exec(). The disadvantage of the CLI is that we were able to use it on a local machine only, but not on a PHP instance of Bluemix. After some consideration, we came to the conclusion to migrate the PHP application in a virtual machine with an installed CLI.<\/p>\n<h2>Virtual machines (VM) from Bluemix<\/h2>\n<p>A virtual machine is an operating system or application environment that is installed on software which imitates dedicated hardware. Bluemix offers the possibility to create virtual machines similar as PHP instances. However, we can\u2019t solve the previously described problem with a VM from Bluemix. The service to create virtual machines are only available for paying users. So, the plan to create a linux instance with the CLI was destroyed. Inspired from the lecture, we came up with the idea to solve the problem with a docker container from Bluemix.<\/p>\n<h2>Docker<\/h2>\n<p>Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run like a normal server. Therefore, we tried to create a docker container with an installed CLI. However, we had rejected this idea quickly. Our teacher gave us the hint that Cloud Foundry provides a REST API, which offers the same functionalities as the CLI. &nbsp;Therefore a docker container was no longer necessary.<\/p>\n<h2>Cloud Foundry API<\/h2>\n<p>The <a href=\"https:\/\/apidocs.cloudfoundry.org\">Cloud Foundry API<\/a> represents a REST service with the same functionality as the Cloud Foundry CLI. But the API is not very well described and we didn\u2019t know how to start. After an intensive web &nbsp;search we finally found a good <a href=\"https:\/\/tongtongl33.wordpress.com\/2014\/03\/03\/how-to-login-to-cloudfoundry-via-rest-api\/\">tutorial<\/a> for beginners to start with the API in a right way.<\/p>\n<p>At first we had to generate an access token from a bluemix account. This access token is needed in every single API HTTP-request to authenticate the user. After we received the access token, we could begin to test all the API functionalities.<\/p>\n<h2>Testing the API<\/h2>\n<p>For the testing of the API we used different tools. One of the tools is the PHP IDE PHPStorm with the functionality \u201cTest Webful Rest Service\u201d. The function provides facilities to emulate interaction with a web service by composing and running requests, like a proxy for the real application that actually calls the service. Another tool is the Postman chrome plugin, which enables you to do REST calls within the browser.But the testing of the API turned out to be more difficult as we thought at the beginning.<\/p>\n<figure id=\"attachment_930\" aria-describedby=\"caption-attachment-930\" style=\"width: 320px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/blindssuck.gif\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"930\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/26\/socialcloud-configure-all-the-things-part-6\/blindssuck\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/blindssuck.gif\" data-orig-size=\"320,240\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"blindssuck\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/blindssuck.gif\" class=\"wp-image-930 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/blindssuck.gif\" alt=\"Peter and the Cloud Foundry Api\" width=\"320\" height=\"240\"><\/a><figcaption id=\"caption-attachment-930\" class=\"wp-caption-text\">Peter and the Cloud Foundry Api; http:\/\/animatedmeme.blogspot.de\/2013\/06\/peter-griffin-vs-blinds.html<\/figcaption><\/figure>\n<p>The examples of the Cloud Foundry API documentation are only made with curl. So we had to translate the API calls in our tools first. However, we had to realize that the documentation was in some parts very incomplete and didn\u2019t worked as described. Even some of the features are well described but no longer available. One of the biggest problems was the private and public domain handling. For example, it wasn\u2019t possible to create and map a route to a public domain from Bluemix like \u201ceu-gb.mybluemix.net\u201d. Only private domains are allowed. But this was never mentioned anywhere. This was one of the highest time-consuming problems. After all problems and peculiarities have been solved, we could go on to test the spare part of the API. In the following is an example to get all apps from bluemix:<\/p>\n<p>Example<\/p>\n<pre class=\"prettyprint lang-text\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">GET \/v2\/apps\nHEADER\ncontent-type  =&gt; application\/x-www-form-urlencoded;charset=utf-8\nauthorization =&gt; ACCESS_TOKEN\n<\/pre>\n<h2>CF to PHP<\/h2>\n<p>In the last step we had to convert the API calls to PHP code. But HTTP-request in plain PHP are more than ugly. To keep the code clean and simple we used the PHP library <i>Guzzle<\/i> to solve this problem. Guzzle is a PHP HTTP client that makes it easy to send HTTP-requests and trivial to integrate with web services like Laravel. To maintain and collect all the API requests we created a specific class called CloudFoundryProxy. The good thing of this class was that the methods names were equal as the commands of the Command Line Interface. So we could imitate and use it in the code in the same way. Furthermore, the use of the class in the main application made the code a lot of more readable and clearer. In the following is an example of the easy use of the class:<\/p>\n<p>Code:<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">$cf = new CloudFoundryProxy(\"http:\/\/api.eu-gb.bluemix.net\/v2\");\n$app = $cf-&gt;getApps(['q' =&gt; 'name:configtool']);<\/pre>\n<h2>&nbsp;All in all our infrastructure ended up like this:<\/h2>\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"850\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/25\/socialcloud-cloudy-this-morning-and-were-scaling-part-5\/socialcloud_scaling-5\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5.jpg\" data-orig-size=\"663,685\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"SocialCloud &amp;#8211; Scaling &amp;#8211; Step 6\" data-image-description=\"&lt;p&gt;SocialCloud &amp;#8211; Scaling &amp;#8211; Step 6&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;SocialCloud &amp;#8211; Scaling &amp;#8211; Step 6&lt;\/p&gt;\n\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5.jpg\" class=\"alignnone wp-image-850 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5.jpg\" width=\"663\" height=\"685\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5.jpg 663w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/SocialCloud_Scaling-5-290x300.jpg 290w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">So the next blog post takes a closer look on the Open Source Social Network Kit \u201c<strong>HumHub<\/strong>\u201d and the reason, why we chose it.<\/span><\/p>\n<hr>\n<p style=\"text-align: left;\">Written by Natali Bopp, Andreas Gold, Jonas H\u00e4fele, Merle Hiort, Martin Kopp, Christian Lang, Anna Poth und Eric Weislogel<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the requirements of the system is that organizations should be able to set up and deploy the HumHub system on their own. For this purpose, we have designed the Configtool. To meet this requirement we have to use different tools, procedures and interfaces from Bluemix. In the following we would like to introduce [&hellip;]<\/p>\n","protected":false},"author":32,"featured_media":939,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,120,650,22,651,2],"tags":[],"ppma_author":[708],"class_list":["post-926","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-cloud-technologies","category-scalable-systems","category-student-projects","category-system-designs","category-system-engineering"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/07\/socialCloud.jpg","jetpack-related-posts":[{"id":2143,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/03\/08\/of-apache-spark-hadoop-vagrant-virtualbox-and-ibm-bluemix-services\/","url_meta":{"origin":926,"position":0},"title":"Of Apache Spark, Hadoop, Vagrant, VirtualBox and IBM Bluemix Services &#8211; Part 1 &#8211; Introduction","author":"bh051, cz022, ds168","date":"8. March 2017","format":false,"excerpt":"As part of the lecture \u201cSystem Engineering and Management\u201d in the winter semester 2016\/17, we run a project with Apache Spark and the Apache Hadoop Ecosystem. In this article series firstly we want to introduce Apache Spark and the Apache Hadoop Ecosystem. Furthermore we want to give an overview of\u2026","rel":"","context":"In &quot;Student Projects&quot;","block_context":{"text":"Student Projects","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/student-projects\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2651,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/28\/how-we-integrated-ibm-watson-services-into-a-telegram-chat-bot\/","url_meta":{"origin":926,"position":1},"title":"How we integrated IBM Watson services into a Telegram chat bot","author":"Adrian Steinert, Oliver Speck, Megan Klaiber","date":"28. August 2017","format":false,"excerpt":"Introduction IBMs artificial intelligence \u2018Watson\u2019 on the IBM Bluemix platform offers a wide range of cognitive services like image and audio analysis among other things. During our semester project in the lecture \u2018Software Development for Cloud Computing\u2019 we integrated useful Watson services into a Telegram chat bot to provide a\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2859,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/31\/iot-with-the-raspberry-pi-final-application-part-3\/","url_meta":{"origin":926,"position":2},"title":"IoT with the Raspberry Pi \u2013 Final application \u2013 Part 3","author":"mr143@hdm-stuttgart.de","date":"31. August 2017","format":false,"excerpt":"In our final application, we have put together a solution consisting of four different modules. First, we have again the Raspberry Pi which raises and sends the sensor data using the already presented Python script. We changed the transfer protocol in the final application to MQTT, which gives us more\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/mqtt-1024x465.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/mqtt-1024x465.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/mqtt-1024x465.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":2157,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/03\/09\/of-apache-spark-hadoop-vagrant-virtualbox-and-ibm-bluemix-services-part-4-big-data-engineering\/","url_meta":{"origin":926,"position":3},"title":"Of Apache Spark, Hadoop, Vagrant, VirtualBox and IBM Bluemix Services &#8211; Part 4 &#8211; Big Data Engineering","author":"bh051, cz022, ds168","date":"9. March 2017","format":false,"excerpt":"Our objective in this project was to build an environment that could be practical. So we set up a virtual Hadoop test cluster with virtual machines. Our production environment was a Hadoop Cluster in the IBM Bluemix cloud which we could use for free with our student accounts. We developed\u2026","rel":"","context":"In &quot;Student Projects&quot;","block_context":{"text":"Student Projects","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/student-projects\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/03\/dev-env-spark-768x512.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/03\/dev-env-spark-768x512.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/03\/dev-env-spark-768x512.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":839,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/24\/socialcloud-services-are-here-to-serve-part4\/","url_meta":{"origin":926,"position":4},"title":"SocialCloud \u2013 Services are here to serve &#8211; Part 4","author":"jh176","date":"24. July 2016","format":false,"excerpt":"'To Start Press Any Key.\u2019 Where's the ANY key? - Homer Simpson - There are so many possibilities to start the next big thing and the great thing in the IT- world is, that it is happening with every pressing of\u00a0 \u2018any key\u2019 on your Keyboard. So, press these keys\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/l2Je1wHsHqDv2aIne.gif?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":3114,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/09\/01\/sport-data-stream-processing-on-ibm-bluemix-real-time-stream-processing-basics\/","url_meta":{"origin":926,"position":5},"title":"Sport data stream processing on IBM Bluemix:  Real Time Stream Processing Basics","author":"nk065@hdm-stuttgart.de","date":"1. September 2017","format":false,"excerpt":"New data is created every second. Just on Google the humans preform 40,000 search queries every second. By 2020 Forbes estimate 1.7 megabytes of new information will be created every second for every human on our planet. However, it is about collecting and exchanging data, which then can be used\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Real-Time-Stream-Processing-Basics_6.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Real-Time-Stream-Processing-Basics_6.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Real-Time-Stream-Processing-Basics_6.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":708,"user_id":32,"is_guest":0,"slug":"ew033","display_name":"ew033","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/8d729e3d182ea59496d421430c359606ae965927a8f12feb24e422d72cfd32ad?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=926"}],"version-history":[{"count":12,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/926\/revisions"}],"predecessor-version":[{"id":24692,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/926\/revisions\/24692"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/939"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=926"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}