{"id":1510,"date":"2019-06-26T16:07:00","date_gmt":"2019-06-26T16:07:00","guid":{"rendered":"https:\/\/hosting.uantwerpen.be\/platformdh\/?p=1510"},"modified":"2020-03-10T14:09:01","modified_gmt":"2020-03-10T14:09:01","slug":"tutorials-iiif-on-a-rpi","status":"publish","type":"post","link":"https:\/\/platformdh.uantwerpen.be\/index.php\/2019\/06\/26\/tutorials-iiif-on-a-rpi\/","title":{"rendered":"Tutorials: IIIF on a RPi"},"content":{"rendered":"\n<p class=\"has-text-align-right has-small-font-size\">First published: 26 June 2019<br>Last update: 6 August 2019<br>DOI:&nbsp;<a href=\"http:\/\/dx.doi.org\/10.17613\/6n9b-2n48\">http:\/\/dx.doi.org\/10.17613\/6n9b-2n48<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"2556\" height=\"680\" src=\"https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-26-at-13.40.02.png\" alt=\"\" class=\"wp-image-1170\" srcset=\"https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-26-at-13.40.02.png 2556w, https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-26-at-13.40.02-300x80.png 300w, https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-26-at-13.40.02-768x204.png 768w, https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/Screen-Shot-2019-06-26-at-13.40.02-1024x272.png 1024w\" sizes=\"(max-width: 2556px) 100vw, 2556px\" \/><\/figure>\n\n\n\n<p>This tutorial was developed by Wout Dillen and Joshua Sch\u00e4uble at the <a href=\"https:\/\/www.uantwerpen.be\/en\/research-groups\/centre-for-manuscript-genetics\/\">Centre for Manuscript Genetics<\/a> (CMG), as part of the <a href=\"https:\/\/iiif.io\/\">IIIF<\/a> courses of the <a href=\"https:\/\/www.uantwerpen.be\/\">University of Antwerp<\/a>&#8216;s Summer School on <a href=\"https:\/\/www.uantwerpen.be\/en\/summer-schools\/digital-humanities--\/\">Digital Humanities<\/a>. This is a one-week summer school organized by the <a href=\"https:\/\/www.uantwerpen.be\/en\/research-groups\/digitalhumanities\/\">Antwerp Centre for Digital humanities and literary Criticism<\/a> (ACDC).<\/p>\n\n\n\n<p>The course was first taught in Antwerp in 2018 (3-7 September), and an adapted version was taught again in 2019 (1-5 July). In the course, students learn how to set up a IIIF-compatible image server (<a href=\"http:\/\/iipimage.sourceforge.net\/\">iipimage<\/a>) on a local network of <a href=\"https:\/\/www.raspberrypi.org\/\">Raspberry Pi<\/a> computers, to ultimately re-use and manipulate each other&#8217;s images using the IIIF protocol.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Double-Checking Your Raspberry Pi&#8217;s Setup<\/h2>\n\n\n\n<p>Developed&nbsp;as a classroom instrument, this tutorial assumes that you are a student, and that you&nbsp;have access to a Raspberry Pi (RPi) with the Raspbian Operating System pre-installed on it.&nbsp;While they were preparing your RPi for this course, your tutors will also have checked that they are set up correctly for the course. Still, it is important that we double-check some of their settings, because they are crucial for the rest of this&nbsp;course.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Make sure that SSH is enabled on your RPi<\/h3>\n\n\n\n<p>On your RPi, select the <strong>raspberry icon<\/strong> in the top left corner, and navigate&nbsp;to: <code>Preferences &gt; Raspberry Pi Configuration<\/code>. Here, select the tab <code>Interfaces<\/code> and ensure, that SSH is <code>Enabled<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.2&nbsp;Ensure that the keyboard layout is set correctly<\/h3>\n\n\n\n<p>Up until the moment when we are&nbsp;able to SSH into our RPis, we will need to use the keyboard to control them. Go to <code>Preferences\/Mouse and Keyboard Settings<\/code>, select the tab <code>Keyboard<\/code> and there the button <code>Keyboard Layout<\/code>. Select the layout of the keyboard you are using, in our case (at the University of Antwerp) this would be <code>Belgium\/Belgian<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.3 Ensure that the system language is set to <code>English<\/code><\/h3>\n\n\n\n<p>We want all RPis to be operated in English.&nbsp;Go to <code>Preferences &gt; Raspberry Pi Configuration<\/code> again, this time select the tab <code>Localisation<\/code>. Click on <code>Set Locale<\/code> and make sure the <code>Language<\/code> is set to <code>English<\/code> and the <code>Character Set <\/code>is <code>UTF-8<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.4 Set the System Password<\/h3>\n\n\n\n<p>Although we are in a closed network for this course and do not expect any hacking attempts, it is always good practice to change your RPi&#8217;s password. Especially when SSH is enabled, changing the default password (<code>raspberry<\/code>) will prevent others from accessing and controlling your computer without your knowledge. Go to <code>Preferences &gt; Raspberry Pi Configuration<\/code> again, this time select the tab <code>System<\/code> and set the password to your own (unless your tutor provides you with one).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.5 Reboot your RPi<\/h3>\n\n\n\n<p>Go to your terminal, and enter the following command:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo reboot now<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Connect your RPi to the Internet<\/h2>\n\n\n\n<p>In the original setup for this tutorial, all RPis are connected to one another (and together to a local router, called <code>IIIFarm<\/code>) via <code>ethernet<\/code>. But we need them to be connected to the actual Internet too \u2013 to download packages etc. For this connection we will use the WiFi. The problem here is, that your RPi will prioritise Ethernet over WiFi for its internet connection. This is not surprising, because ethernet connections are typically much faster and more reliable than WiFi connections. But so in our case, we&#8217;ll need to turn this around, so&nbsp;the RPi will always use WiFi for internet connections first,&nbsp;rather than trying to connect through our (local, unconnected) ethernet network.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Connect your&nbsp;RPi to the WiFi<\/h3>\n\n\n\n<p>WiFi network names and passwords will differ depending on where you are following this course, so listen to your tutors, and use the login information they provide.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Prioritise WiFi for web requests using <code>nano<\/code><\/h3>\n\n\n\n<p>So now we want to make sure our RPi uses the WiFi to connect to the internet, rather than its&nbsp;ethernet connection. To change this, we will&nbsp;need to make changes in a&nbsp;configuration file.&nbsp;Open a terminal, and enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/dhcpcd.conf<\/pre>\n\n\n\n<p>This will tell the RPi to use the programme <code>nano<\/code>, a shell text editor, to open a file located in the path <code>\/etc\/dhcpcd.conf<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.3 Assign metric values to your ports<\/h3>\n\n\n\n<p>Use the <code>arrow-down<\/code> key to move to the end of the configuration file. There, add the following lines:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">interface wlan0\nmetric 202\n\ninterface eth0\nmetric 303\n<\/pre>\n\n\n\n<p>Hit <code>Ctrl+o<\/code> to save the file and confirm with <code>enter<\/code>.&nbsp;These lines assign metric values to your WiFi and your ethernet ports. The lower the value, the higher its priority. So, since <code>202<\/code> is lower than <code>303<\/code>, <code>wlan0<\/code> (your WiFi port) will be rated higher than <code>eth0<\/code> (your ethernet port) and our system will send web requests via <code>wlan0<\/code> instead. Finally, hit <code>Ctrl+x<\/code> to leave <code>nano<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.4. Reboot your RPi<\/h3>\n\n\n\n<p>To allow these changes to take effect, you will now have to reboot your RPi again. We will do this using the terminal:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo reboot now<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.5&nbsp;Connect the RPi to the WiFi network again<\/h3>\n\n\n\n<p>Open the browser. You should be directed to the university&#8217;s login page now. This means that assigning the metric values has worked!&nbsp;Each group has received credentials for an account on the guest network. Log in using these access data.&nbsp;Once you are logged in, visit any website to make sure your internet is connected.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.6. Double-check the metric values<\/h3>\n\n\n\n<p>Open a terminal and enter the following command:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">route<\/pre>\n\n\n\n<p>This command will show you your routing table: a list of all the system&#8217;s <strong>routing destinations<\/strong> (in the form of IP addresses), that tell the system where to send which data packages. Here you can double-check that the metric value of the <code>wlan0<\/code> interface is now lower than that of the <code>eth0<\/code> interface.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.7&nbsp;Note down your IP Address<\/h3>\n\n\n\n<p>As&nbsp;mentioned, we will need the IP address that our router has assigned to our RPi to SSH into the RPi via our laptops. We can find the IP address we need by running the following command:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ifconfig<\/pre>\n\n\n\n<p>This lists all your network settings. In the list, find the entry that starts with <code>eth0<\/code> (typically the first one), and note down the first IP address that you see, the one that directly follows the word <code>inet<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.8. No more peeking!<\/h3>\n\n\n\n<p>Now that we have the IP addresses of our RPis, we can finally access them via SSH, using our laptops. That means we will no longer need to look at its desktop. <strong>Turn off the monitor that is connected to your RPi.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. SSH into your RPi<\/h2>\n\n\n\n<p>We will now start to control our RPi from a different system (your laptop) using the command line. Since the&nbsp;rest of this tutorial assumes that you know some basic command line commands (and will even ask&nbsp;to write your own commands here and there), this is the point where your tutors will offer you a brief introduction to working in a Linux terminal. At a later point in time, a similar tutorial for training command line basics will be provided and linked here on this website.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 SSH Connect<\/h3>\n\n\n\n<p>On your laptop (the one that is connected to the <code>IIIFarm<\/code> WiFi) open a Command Line Interface. Here, enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ssh pi@your.ip.address<\/pre>\n\n\n\n<p>and confirm with <code>enter<\/code>.<\/p>\n\n\n\n<p>On your first login to a new resource you will get a security warning. Confirm by typing <code>yes<\/code>.&nbsp;You will be prompted for your RPi&#8217;s password. Type in the password that you&#8217;ve set up for your RPi,&nbsp;and confirm with <code>enter<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Creating Files and Directories<\/h3>\n\n\n\n<p>At this point, your tutors should have <em>either<\/em>&nbsp;already put a folder on your RPi&#8217;s <code>Desktop<\/code>, <em>or<\/em> prepared a USB-stick that passes around while you complete this exercise. In the second case, when you get the USB, you can turn your RPi&#8217;s monitor on, plug the USB into the RPi, and copy the directory with your RPi&#8217;s name onto your <code>Desktop<\/code>. (The <em>whole directory<\/em>, not just the files that are inside). When this is done, turn the monitor off again, and continue with the following exercise.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Command Line Exercise<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Navigate to the <code>Desktop<\/code><\/li><li>Create a new directory called <code>html<\/code><\/li><li>Navigate into that directory<\/li><li>Create a new document in that folder, called <code>index.html<\/code><\/li><li>Also create a new directory in that folder, called <code>images<\/code><\/li><li>Verify that your <code>html<\/code> directory now containes an <code>index.html<\/code> file and an <code>images<\/code> subdirectory<\/li><\/ul>\n\n\n\n<p>To continue beyond this point, you will need the folder provided by your tutors to be copied to your <code>Desktop<\/code>. So wait for the USB if necessary.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Check your Present Working Directory<\/li><li>Navigate back to the <code>Desktop<\/code><\/li><li>Verify that the Desktop has two directories: <code>html<\/code> and one with <code>your_RPi_name<\/code><\/li><li>Navigate into the directory with <code>your_RPi_name<\/code><\/li><li>List the contents of this directory<\/li><\/ul>\n\n\n\n<p>As this list will show, the directory contains 2 <code>.png<\/code> images, and one <code>.jpg<\/code> image. The <code>.png<\/code> images are high-resolution facsimile images of random pages of the first draft of Mary Shelley&#8217;s <em>Frankenstein<\/em>. For this tutorial, they are your institution&#8217;s pieces of the Monster we are creating.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Copy these contents into the following directory: <code>\/home\/pi\/Desktop\/html\/images<\/code><\/li><li>Navigate into that directory, and verify that it indeed contains these three images<\/li><li>Rename the <code>.png<\/code> images using <code>mv<\/code>. Their new names should be <code>image1.png<\/code> and <code>.image2.png<\/code><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Create a HTML document in <code>nano<\/code><\/h3>\n\n\n\n<p>First, navigate back to the <code>html<\/code>directory on your <code>Desktop<\/code>.&nbsp;Now open the <code>index.html<\/code> file with <code>nano<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;nano index.html<\/pre>\n\n\n\n<p>Now you can use the command line text editor <code>nano<\/code>&nbsp;to write the following code into the file:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;&lt;html&gt;\n  &lt;head&gt;\n   &lt;meta charset=\"utf-8\" \/&gt;\n   &lt;title&gt;My Institution's Page&lt;\/title&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n   &lt;h1&gt;Welcome to [your_RPi_name]&lt;\/h1&gt;\n   &lt;p&gt;See our beautiful pieces of the Monster:&lt;\/p&gt;\n   &lt;img src=\"images\/frankenstein.jpg\" style=\"width:300px;\" \/&gt;\n  &lt;\/body&gt;\n &lt;\/html&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.5&nbsp;Creating a HTML Document in <code>nano<\/code><\/h3>\n\n\n\n<p>The code we just wrote in <code>nano<\/code> is written in a language that your browser can read: <code>html<\/code>. This means that if you open it in your browser, it will display the document <em>as if<\/em> it were an online web-page.<\/p>\n\n\n\n<p>In the code, the following line will load an image from your <code>html\/images<\/code>&nbsp;directory, and resize it to a <code>width<\/code> of <code>300px<\/code> in your browser:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;img src=\"images\/frankenstein.jpg\" style=\"width:300px;\" \/&gt;<\/pre>\n\n\n\n<p>When you&#8217;re satisfied that the file is copied correctly into your command line through <code>nano<\/code>, save the file with <code>Ctrl+o<\/code>, and quit <code>nano<\/code> with <code>Ctrl+x<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Set up a Web Server on Your RPi<\/h2>\n\n\n\n<p>Now that everything&#8217;s set up and we can connect to the internet, we&#8217;ll start with setting up a web server on your RPi. This will allow you to serve your content (the offline web page you&#8217;ve just built) with other users on your network (here, the IIIFarm) on&nbsp;an actual <em>website<\/em>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Update APT Package List<\/h3>\n\n\n\n<p>Before we start downloading and installing packages on our RPi, it&#8217;s good practice to first update&nbsp;<code>apt-get<\/code>&#8216;s package list \u2013 the&nbsp;list of links to the public repositories that our operating system&#8217;s app store uses to know where&nbsp;the most up-to-date versions its&nbsp;software packages are hosted. To do that, enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt-get update<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Install Apache 2 (with <code>fcgid<\/code>)<\/h3>\n\n\n\n<p>Now it&#8217;s time to download our software! The web server that we&#8217;re going to use is the commonly used <code>Apache2<\/code> webserver. In addition, we also need to install one of <code>Apache2<\/code>&#8216;s modules (a kind of <em>sub-software-package<\/em>) called <code>fcgid<\/code>.<\/p>\n\n\n\n<p>With <code>apt-get install<\/code>, you can line up a series of software packages to install them all with a single command. So go ahead and run:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt-get install apache2 libapache2-mod-fcgid<\/pre>\n\n\n\n<p>On running this command, <code>apt-get<\/code> will inform you if the software has any dependencies (other software that needs to be downloaded), and tells you how much disk space these downloads will take up on your RPi. You&#8217;ll have to confirm with <code>y<\/code>, and wait until your packages are downloaded and installed. As we&#8217;re all on the same network and the RPi&#8217;s aren&#8217;t very fast, this may take a while.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.3&nbsp;Start Web Server<\/h3>\n\n\n\n<p>Once the software is downloaded, we can start it up on the RPi. Run:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">systemctl start apache2<\/pre>\n\n\n\n<p>Here, you will be asked which user you want to use to run the Apache2 service. Choose <code>1<\/code> (pi) and confirm with <code>enter<\/code>. The command line will then prompt you for a password, so type in your RPi&#8217;s password and confirm by hitting <code>enter<\/code> again.<\/p>\n\n\n\n<p>The command we&#8217;ve just run \u2013 <code>systemctl<\/code> \u2013 is a utility to manage (start, stop, restart) services on your RPi (like the <code>Apache2<\/code> service we&#8217;ve just installed). We&#8217;ll be using it a lot in this tutorial, so make sure you remember your RPi password!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.4. Test Apache<\/h3>\n\n\n\n<p>Before we do anything else, we&#8217;d like to make sure that our Apache webserver is actually running. On your computer, open a browser, enter your RPi&#8217;s IP Address into the browser&#8217;s address bar, and confirm with <code>enter<\/code>.&nbsp;You should now see the Apache2 Debian Default Page. On the top of that page, in a red banner, you\u2019ll read \u201cIt works!\u201d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.5. Viewing Your Website<\/h3>\n\n\n\n<p>By default only contents that are in the folder <code>\/var\/www\/html\/<\/code> are accessible. Although this folder could be changed (e.g. to your <code>Desktop<\/code>, or a folder in your <code>Documents<\/code>) doing so is not considered good practice.&nbsp;Instead of relocating the folder Apache points to, we move our content (those files we want to access via the browser) to the default folder.<br>Copy the <code>html<\/code> folder from the <code>Desktop&nbsp;<\/code>to <code>\/var\/www<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp -r \/home\/pi\/Desktop\/html\/ \/var\/www\/<\/pre>\n\n\n\n<p>Now you can enter your IP address into the browser of your laptop. If everything went well, you can load the website from your RPi (which now functions as your server) on your laptop (which funtions as the client).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Install the IIPImage Server on Your RPi<\/h2>\n\n\n\n<p>In the previous step, we installed Apache \u2013 a web server that allows each of us to host web pages such as our own page in <code>html<\/code>) and share them within our network. As we&#8217;ve seen, we can easily hard-code images into such <code>html<\/code> web pages (by providing a link to the image in the <code>@src<\/code> attribute of an <code>&lt;img&gt;<\/code> tag) \u2013 but that is not enough for our purposes. Instead, we need to install a dedicated image server alongside our web server, to process the images on the fly.&nbsp;For that, we will install a IIIF-compliant image server called IIPImage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 Install the IIPImage-Server<\/h3>\n\n\n\n<p>Install the package <code>iipimage-server<\/code> by entering the following command:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt-get install iipimage-server<\/pre>\n\n\n\n<p>You will have to download some dependencies (between 50-100MB), confirm with <code>y<\/code>&nbsp;and wait until the image server is installed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 Change the image server&#8217;s data directory<\/h3>\n\n\n\n<p>By default, the data directory of the image server is under <code>\/usr\/lib\/iipimage-server\/<\/code>. We want to change this to <code>\/var\/www\/iipimage-server\/<\/code>.&nbsp;To do so, we have to copy the folder over to <code>\/var\/www\/<\/code>&nbsp;and tell the image server where the data directory has moved.&nbsp;Copy the <code>iipimage-server<\/code>&nbsp;directory from <code>\/usr\/lib\/<\/code>&nbsp;to <code>\/var\/www<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp -r \/usr\/lib\/iipimage-server\/ \/var\/www\/iipimage-server\/\n<\/pre>\n\n\n\n<p>To use the image server in our website, we need to run it as an Apache module. Such modules are configured in the directory <code>\/etc\/apache2\/mods-available\/<\/code>.&nbsp;<strong>Change to this directory.&nbsp;<\/strong>Once you are there,&nbsp;we need to open the image server&#8217;s config file with <code>nano<\/code>&nbsp;so we can make some changes (don\u2019t forget the <code>sudo<\/code>!). the config file is called <code>iipsrv.conf<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/apache2\/mods-available\/iipsrv.conf\n<\/pre>\n\n\n\n<p>In this file change the following line:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ScriptAlias \/iipsrv\/ \"\/usr\/lib\/iipimage-server\/\"\n<\/pre>\n\n\n\n<p>to:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ScriptAlias \/iipsrv\/ \"\/var\/www\/iipimage-server\/\"\n<\/pre>\n\n\n\n<p>Save the file with <code>Ctrl+o<\/code>, and hit <code>enter<\/code> to confirm) and close nano (<code>Ctrl+x<\/code>). Now once we enable the module, apache knows where we put the image server&#8217;s data directory, and the two servers can work together.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.3&nbsp;Enable the necessary Apache modules for the image server<\/h3>\n\n\n\n<p>First, we want to double check that the <code>fcgid<\/code>&nbsp;module is enabled. Since we installed it earlier, this should already have happened by default. Enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo a2enmod fcgid\n<\/pre>\n\n\n\n<p>You should now see a message that confirms that <code>fcgid<\/code>&nbsp;was already enabled. Next, we need enable the <code>headers<\/code>&nbsp;module. Enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo a2enmod headers\n<\/pre>\n\n\n\n<p>If one of these two modules was not enabled before, you will have to restart apache now. In that case, enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">systemctl restart apache2\n<\/pre>\n\n\n\n<p>Finally, we&#8217;ll want to check if our image server&#8217;s module (<code>iipsrv<\/code>) is enabled too. Enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo a2enmod iipsrv\n<\/pre>\n\n\n\n<p>Now that all three modules are definitely enabled, we need to restart Apache again. Enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">systemctl restart apache2\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.4. Enable CORS<\/h3>\n\n\n\n<p>In the image servers configuration file we have to enable \u201ccross origin resource sharing\u201d (CORS). It is important to enable this setting to make sure the image server is IIIF-compliant, because it allows others to embed your images into their website.&nbsp;To enable CORS, open the apache configuration file with <code>nano<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/apache2\/apache2.conf\n<\/pre>\n\n\n\n<p>Move down (arrow-down key <code>\u2193<\/code>) to the end of the file and add the following line:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Header set Access-Control-Allow-Origin *\n<\/pre>\n\n\n\n<p>Make sure there are no spelling mistakes in this line! Save the file (<code>Ctrl+o<\/code>, <code>enter<\/code>) and leave nano (<code>Ctrl+x<\/code>).<\/p>\n\n\n\n<p>And, again, Apache needs to be restarted:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">systemctl restart apache2\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5.5 Check if your IIPImage Server is running<\/h3>\n\n\n\n<p>Finally, we&#8217;ll want to make sure that everything is working correctly, and that the image server we just configured is actually running.&nbsp;In your laptop&#8217;s browser go to:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">your.ip.address\/iipsrv\/iipsrv.fcgi\n<\/pre>\n\n\n\n<p>If the IIPImage Server start screen appears, your server should run correctly.&nbsp;Well done!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Making Pyramid TIFFs for IIPImage<\/h2>\n\n\n\n<p>IIPImage needs a specific type of files to work its image serving magic. These are pyramid TIFFs \u2013 which are basically layered documents that contain multiple, mapped versions of the same image in different resolutions. This allows the image server to optimise its zoom function, as it switches to higher resolution images as the user zooms deeper and deeper into the document.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.1. Install Image Processor: VIPS<\/h3>\n\n\n\n<p>To convert our high-resolution images into Pyramid TIFFs, we will first need to install another package on our RPi \u2013 this time we need an image processor. There are a couple of different options available for this, but we&#8217;ll use the software package VIPS.&nbsp;Use <code>apt-get<\/code> to install the package <code>libvips-tools<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo apt-get install libvips-tools\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6.2. Find Your Images<\/h3>\n\n\n\n<p>Change to the folder <code>\/var\/www\/html\/images\/<\/code>. At an earlier stage, we stored two Frankenstein facsimile images in this folder: <code>image1.png<\/code>&nbsp;and <code>image2.png<\/code>. Make sure they are still there using <code>ls<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.3. Transform Your Images<\/h3>\n\n\n\n<p>To transform these <code>.png<\/code>&nbsp;images into (tiled pyramid) <code>.tif<\/code> images, run the following command:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo vips im_vips2tiff image1.png image1.tif:deflate,tile:256x256,pyramid\n<\/pre>\n\n\n\n<p>Once you&#8217;ve hit <code>enter<\/code>, wait until the processing is done. This can take several minutes, because Pyramid TIFFs are huge files.<\/p>\n\n\n\n<p>Once the first image is processed, move on to the second image. Afterwards make sure, both <code>.tif<\/code>&nbsp;files (<code>image1.tif<\/code>&nbsp;and <code>image2.tif<\/code>) are in the folder, alongside to the <code>.png<\/code> files \u2013 which should still be there too.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6.4. Copy the Pyramid TIFFs to the Image Server&#8217;s Data Directory<\/h3>\n\n\n\n<p>Just like Apache stores the accessible documents in a specific data directory (<code>\/var\/www\/html<\/code>), our IIPImage server also has a directory where our images need to be stored. Earlier, we&#8217;ve set this directory to <code>\/var\/www\/iipimage-server\/<\/code>.&nbsp;In order to make our images accessible via the image server module (and not only via apache) we have to copy (<code>cp<\/code>) them into this folder.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo cp image*.tif ..\/..\/iipimage-server\/.\n<\/pre>\n\n\n\n<p>Note:&nbsp;<code>..\/..\/<\/code>&nbsp;only works as long as you are in the <code>\/var\/www\/html\/images\/<\/code>&nbsp;folder. It would not lead to the correct target from any other <code>pwd<\/code>. An alternative would be to use an absolute path.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. IIIF Parameters<\/h2>\n\n\n\n<p>Now that we have set up IIPImage, you can access all of the images in your <code>var\/www\/iipimage-server<\/code> directory in <strong>any browser or IIIF-compliant image viewer<\/strong> \u2013 such as <a href=\"http:\/\/projectmirador.org\">Mirador<\/a>, <a href=\"http:\/\/universalviewer.io\">Universal Viewer<\/a>, <a href=\"https:\/\/openseadragon.github.io\/examples\/tilesource-iiif\/\">OpenSeadragon<\/a>, or <a href=\"https:\/\/github.com\/mejackreed\/Leaflet-IIIF\">Leaflet-IIIF<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.1. Accessing Images in the Browser<\/h3>\n\n\n\n<p>When you call an image via an IIPImage server <code>URL<\/code>, the image server will show you this image according to some parameters that you have set in the <code>URL<\/code>. Let&#8217;s have a look at how this works.<\/p>\n\n\n\n<p>Open your browser (on the laptop!) and go to:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">your.ip.address\/iipsrv\/iipsrv.fcgi?IIIF=image1.tif\/full\/400,\/0\/default.jpg\n<\/pre>\n\n\n\n<p>Now, open another tab in your browser and go to:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">your.ip.address\/iipsrv\/iipsrv.fcgi?IIIF=image1.tif\/full\/800,\/90\/grey.jpg\n<\/pre>\n\n\n\n<p>Both <code>URL<\/code>s show you the same image, but not in the same way. Compare the <code>URL<\/code>s above and try to find out how it influenced the server&#8217;s presentation of that image in your browser.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 Experiment with the IIIF Image API<\/h3>\n\n\n\n<p>The IIIF consortium provides a detailed documentation of the IIIF Image API&#8217;s parameters <a href=\"http:\/\/iiif.io\/api\/image\/2.0\/\">here<\/a>.&nbsp;Have a look at this documentation, and play with different settings for your images by manipulating the <code>URL<\/code> in the following exercise:<\/p>\n\n\n\n<p>Reading up on the IIIF parameters, find out how to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Rotate your image by `180` degrees<\/li><li>Retrieve **only a section** of an image<\/li><li>Retrieve an image with a width of `5000px` and a proportionally scaled height<\/li><li>Retrieve an image with a `width` of `100px` and a `height` of `300px`<\/li><li>Display your image in `greyscale`<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7.3. Get the `info.json` from your image server<\/h3>\n\n\n\n<p>All the information you need to build tools that show your images work on the basis of a <code>info.json<\/code> file, which is generated by the server for every image. To view this file for your own collection, enter the following <code>URL<\/code> into your browser:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&nbsp;your.ip.address\/iipsrv\/iipsrv.fcgi?IIIF=image1.tif<\/pre>\n\n\n\n<p>When no further IIIF <code>URL<\/code> variables are specified, the IIPImage server will forward you to the <code>info.json<\/code> file.<\/p>\n\n\n\n<p><strong>7.4 Accessing Each Other&#8217;s Images<\/strong><\/p>\n\n\n\n<p>So, each of us now has a fully functioning RPi with a web server and an image server that provide access to a couple of tiled pyramid TIFF images that we have learned to access and manipulate] with the IIIF URL parameters.&nbsp;And since all of our RPis are connected on the same network, we can use the same technology that allows us to&nbsp;view and manipulate&nbsp;the images on our own RPi in the browser of our own laptops allow us to do the same with each other&#8217;s images too.<\/p>\n\n\n\n<p>Ask your neigbour to give you the information you need to build IIIF compliant URLs for their images. Then try to view and manipulate their images using the IIIF parameters<\/p>\n\n\n\n<p>We will need <code>URL<\/code>s like these going forward. So save some of these URLS on your laptop somewhere (like a <code>.txt<\/code> or <code>.doc<\/code> file), so you will be able to copy and paste them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8.&nbsp;Reusing IIIF Images<\/h2>\n\n\n\n<p>Now that we have a series of links to images (our own as well as our neighbours&#8217;), we can embed their <code>URL<\/code>s into our <code>html<\/code> page to incorporate them in our websites.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.1. Include Images in your <code>html<\/code>&nbsp;Web Page.<\/h3>\n\n\n\n<p>Open the <code>index.html<\/code> file we created earlier with <code>nano<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/var\/www\/html\/index.html\n<\/pre>\n\n\n\n<p>In this file, add the following two lines after the <code>frankenstein.jpg<\/code> image:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;br\/&gt;&lt;img src=\"your.ip.address\/iipsrv\/iipsrv.fcgi?IIIF=image1.tif\/full\/400,\/0\/default.jpg\" \/&gt;\n\n&lt;br\/&gt;&lt;img src=\"your.neighbours.ip.address\/iipsrv\/iipsrv.fcgi?IIIF=image1.tif\/full\/400,\/0\/default.jpg\" \/&gt;\n<\/pre>\n\n\n\n<p>Copy these links carefully \u2013 although you will of course have to to change the IP addresses in these <code>URL<\/code>s with the ones you came up with earlier.<\/p>\n\n\n\n<p>Save the <code>index.html<\/code> file (hit <code>Ctrl+o<\/code>, then <code>enter<\/code>) and exit <code>nano<\/code> (hit <code>Ctrl+x<\/code>). Then enter your RPi\u2019s IP address in your browser (on the laptop!) again, and look at the effect your changes had on your website.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.2 IIIF Manifests<\/h3>\n\n\n\n<p>So wouldn\u2019t it be nice if we could also embed additional metadata about each image (or even an entire collection of images) directly from the server of the image provider? In a computer readable, standardized format?&nbsp;This would allow us to give credit where credit is due. And if the original hosts have enriched their images in any way (with dates, transcriptions, annotations, etc.), we might want to reference those, or reuse them in our website in some way too.&nbsp;IIIF provides a solution for this: IIIF Manifests. This&nbsp;is a container file (in the <code>JSON<\/code> format), that contains metadata about an image collection as well as the IIIF compliant <code>URL<\/code>s to the contained images.&nbsp;For now, we will only look at a simple example, in detail we will learn about manifests and IIIF compliant image annotation later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.3 Download A Sample Manifest<\/h3>\n\n\n\n<p>Here again, you will need to follow your tutors&#8217; instructions to download a sample manifest for your collection \u2013 or <a href=\"https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/08\/frankenstein.json\">download the one we used in class here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.4. Adapt the Manifest to Your Needs<\/h3>\n\n\n\n<p>At this point, you don\u2019t have to understand the file you&#8217;re reading in <code>nano<\/code>.&nbsp;Instead, just replace all instances of the string <code>MY_IP_ADDRESS<\/code> with your actual IP Address.<\/p>\n\n\n\n<p><strong>Warning<\/strong>: If you make a mistake here, your manifest will not work later. There should be 10 instances for you to replace. Go through slowly line by line.<\/p>\n\n\n\n<p>When you are done double-checking, go through the file again, looking for the line <code>\"label\": \"Team [PI Name]\",<\/code>&nbsp;(line 9). Now, replace the string <code>[PI NAME]<\/code>&nbsp;by the name of your Raspberry Pi.]\n\n\n\n<p>Once you are done, save (hitting <code>Ctrl+o<\/code>, then <code>enter<\/code>) and exit nano (<code>Ctrl+x<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8.5&nbsp;Double Check that the File Loads<\/h3>\n\n\n\n<p>Check in the browser if your manifest is publically accessible. Open the laptop browser and enter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">your.ip.address\/frankenstein.json\n<\/pre>\n\n\n\n<p>The manifest <code>JSON<\/code> file should load in your browser.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9.&nbsp;Frankenstein<\/h2>\n\n\n\n<p>This is the point where we&#8217;ll really start taking advantage of the interoperability features IIIF has to offer, as we&#8217;ll aggregate, mix and match each other&#8217;s images. You&#8217;ll effectively be assembling your own &#8220;Monster&#8221; out of the Frankenstein manuscript images you and your peers are hosting. To do so, we&#8217;ll be working more with IIIF Manifests, so depending on your (and your peers&#8217;) technical background, this would be a good point for your tutors to introduce the basics of the <code>JSON<\/code>&nbsp;data format.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.1 Loading Manifests in Mirador<\/h3>\n\n\n\n<p>On their&nbsp;laptop, that is also connected to our IIIFarm, your tutors will&nbsp;also has a version of Apache running, that should make data from his laptop accessible to you.&nbsp;In his web-shared folder he installed a version of Mirador, a IIIF compliant image viewer with a couple of nice features such as deep zooming.&nbsp;But one of this viewers coolest features is, that you can load IIIF manifests dynamically if you have the <code>URL<\/code> of the manifest.&nbsp;Luckily, each team knows the <code>URL<\/code> of their manifest, you have just entered it in your browser.&nbsp;Lets load them all \u2013&nbsp;one by one \u2013 in Mirador.<\/p>\n\n\n\n<p>Follow your tutor&#8217;s instructions to load their Mirador instance on your own IIIFarm-connected laptop and add your own manifest.&nbsp;Play with the viewer. Make yourself familiar with the functionality it provides. Then load some of the manifests of other teams into the viewer too.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9.2 Adding Metdata to the Manifest<\/h3>\n\n\n\n<p>At this point, your IIIF manifests do not yet provide a lot of metadata.&nbsp;Let\u2019s first experiment by improving what is there already. Open your manifest (<code>frankenstein.json<\/code>) with <code>nano<\/code> and edit the existing <code>JSON<\/code> data.<\/p>\n\n\n\n<p><strong>Warning<\/strong>: Try not to change the file&#8217;s structure and don\u2019t change the <code>id<\/code>s.<\/p>\n\n\n\n<p>What you enter here does not have to make sense for now, but whenever you change something, save the file (hit <code>CTRL+o<\/code>, then <code>enter<\/code>&nbsp;\u2013 but don\u2019t exit nano!) and reload your manifest in the Mirador viewer.<\/p>\n\n\n\n<p>Try to see how mirador views the <code>JSON<\/code> data you changed. Which change is visualized where?<\/p>\n\n\n\n<p>On the initial image folder we gave to you (<code>\/home\/pi\/Desktop\/yourPisName\/images\/<\/code>), your <code>.png<\/code> imagess still had individual names. Their name (a number) was the position of the image in the sequence of the entire notebook.&nbsp;Try to get this information into your canvas information. For example: if your files were called <code>023.png<\/code> and <code>024.png<\/code>, make sure that your canvas for <code>image1.tif<\/code> reads <code>\u201cPage 23\u201d<\/code>, and <code>image2.tif<\/code> would correspond to <code>\u201cPage 24\u201d<\/code>, etc.]\n\n\n\n<h3 class=\"wp-block-heading\">9.3. Including Other Teams&#8217; Manifests<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>&nbsp;Study the canvas area of your manifest. Open another team\u2019s manifest and look at their <code>JSON<\/code>. Find their canvases.<\/li><li>Figure out if their two images should come <em>before<\/em> or <em>after<\/em> your own images.<\/li><li>Try to copy their canvases from their manifest into your manifest: find the right position to add their canvases (either before or after your own canvases) copy them there.<\/li><li>Load your manifest again in mirador. Did it work? If not\u2026 <em>debug<\/em>!<\/li><li>Add the canvases of at least two other teams at the correct position in the sequence.<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">9.4 Finding the Missing Information Online<\/h3>\n\n\n\n<p>Maybe you would be happy to have more real metadata in your manifest.&nbsp;Luckily, the <a href=\"http:\/\/shelleygodwinarchive.org\">Shelley Godwin Archive<\/a>&nbsp;recently published the entire notebook in IIIF. Here is the corresponding blog post:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">https:\/\/blogs.bodleian.ox.ac.uk\/digital\/2017\/08\/16\/iiifrankenstein\/\n<\/pre>\n\n\n\n<p>Can you find the manifest? You cannot load it in our instance of Mirador (because we don\u2019t have internet) but you can load the <code>JSON<\/code>&nbsp;manifest on your internet-connected laptop and use the given information to improve your own manifest to your heart&#8217;s content.<\/p>\n\n\n\n<p>That&#8217;s it! You&#8217;ve now successfully installed a IIIF compliant image server on a RPi, shared images, and mixed, matched, and manipulated those of your peers. At this point, you should also be able to set up a similar environment for your own project on a Raspbian or Debian (Linux) system.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>The summer school&#8217;s first edition was generously sponsored by the University of Antwerp&#8217;s <a href=\"https:\/\/www.uantwerpen.be\/en\/faculties\/faculty-of-arts\/research-and-valoris\/departments\/department-of-literature\/\">Literature Department<\/a>, the <a href=\"https:\/\/www.uantwerpen.be\/en\/education\/international\/international-students\/antwerp-summer-university\/\">Antwerp Summer University<\/a>, the Flemish Government&#8217;s <a href=\"https:\/\/www.ewi-vlaanderen.be\/\">Department of Economy, Science, and Innovation<\/a>, <a href=\"https:\/\/platformdh.uantwerpen.be\/index.php\/dhu-f\/\">Digital Humanities Flanders<\/a> (DHu.F), and <a href=\"http:\/\/be.dariah.eu\/\">DARIAH-BE<\/a> \u2013 the last of which provided us with the course&#8217;s hardware and the opportunity to develop these tutorials further. The development, teaching, and dissemination of this tutorial falls under the purview of the <a href=\"https:\/\/platformdh.uantwerpen.be\/index.php\/clariah-vl\/\">CLARIAH-VL<\/a> project&#8217;s WP2 on&nbsp;Community Engagement, User Involvement and Training.<\/p>\n\n\n\n<p>These tutorials are published under a Creative Commons Share Alike licence (<a href=\"https:\/\/creativecommons.org\/licenses\/by-sa\/4.0\/\">CC-BY-SA 4.0<\/a>). This means that you can re-use (share and adapt) these slides provided you provide sufficient attribution and publish and distribute the result under the same license.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"800\" height=\"282\" src=\"https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/CC-BY-SA_icon.svg_.png\" alt=\"\" class=\"wp-image-1164\" srcset=\"https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/CC-BY-SA_icon.svg_.png 800w, https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/CC-BY-SA_icon.svg_-300x106.png 300w, https:\/\/platformdh.uantwerpen.be\/wp-content\/uploads\/2019\/06\/CC-BY-SA_icon.svg_-768x271.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>First published: 26 June 2019Last update: 6 August 2019DOI:&nbsp;http:\/\/dx.doi.org\/10.17613\/6n9b-2n48 This tutorial was developed by Wout Dillen and Joshua Sch\u00e4uble at the Centre for Manuscript Genetics (CMG), as part of the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1170,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"footnotes":""},"categories":[15,12],"tags":[],"coauthors":[13,34],"class_list":["post-1510","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blogposts","category-tutorials"],"_links":{"self":[{"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/posts\/1510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/comments?post=1510"}],"version-history":[{"count":4,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/posts\/1510\/revisions"}],"predecessor-version":[{"id":1522,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/posts\/1510\/revisions\/1522"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/media\/1170"}],"wp:attachment":[{"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/media?parent=1510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/categories?post=1510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/tags?post=1510"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/platformdh.uantwerpen.be\/index.php\/wp-json\/wp\/v2\/coauthors?post=1510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}